Entradas de la categoría ‘Desarrollo’
Utilizando el algoritmo Chudnovsky y Visual Basic para calcular los catorce primeros dígitos decimales de Pi sin despeinarse (y otros chismes y cotilleos varios)

Pi
3,14 (en el colegio) o a 3,14159 (en la universidad). Conocido universalmente como 3,1416, π ha sido aproximado a lo largo de la historia hasta una exactitud de 5 billones de decimales, esto hace bien poquito. Y es que los matemáticos y los informáticos no tienen otra cosa que hacer en este mundo que perder el tiempo intentando encontrar un decimal nuevo para hacerse famosos y salir en el Muy Interesante y en la Wikipedia. Como si no supieran que esta carrera no tiene fin, y que pasado mañana saldrá a la palestra un chino mandarino o un japonés loco que encontrará el decimal número 6 billones; como si lo estuviera viendo.
Para los estudiantes del bachillerato actual diremos que π señala las veces en que el diámetro de un círculo cabe en su circunferencia. Ahora sí, ¿verdad? Hacemos un redondel con una cuerda y la estiramos en el suelo. Luego marcamos los diámetros sobre la cuerda y comprobamos que nos caben 3 y un poquito más. Eso es π. El siguiente GIF animado es totalmente esclarecedor.

Explicación gráfica de Pi muy sencilla de entender
En fin, nos unimos al carro de aproximaciones de π, pero no para intentar descubrir el decimal seiscientos trillones, sino para conocer el algoritmo Chudnovsky, uno de los más modernos métodos de calcular decimales de π. Algoritmos para este menester ha habido infinidad de ellos desde que el mundo es mundo, empezando por el de Arquímedes y pasando por los de Euler, Newton o Gauss (sí, el de las campanas).
El algoritmo Chudnovsky, descubierto por los hermanos David y Gregory Chudnovsky, matemáticos ucranianos, parece ser el más empleado en los cálculos de alta precisión de dígitos de π a comienzos de este siglo XXI en el que nos encontramos. Se fundamenta en una fórmula del hindú Ramanujan e implementa una serie de convergencia rápida siguiendo una serie hipergeométrica. Su fórmula es la siguiente:

Algoritmo matemático Chudnovsky
Como se puede comprobar, no es más que un sumatorio sobre k desde 0 hasta infinito (∞), donde se hacen una barbaridad de operaciones en función de k en cada iteración. Cada término de esta fórmula añade 14 decimales exactos al valor calculado de π; k es una proporción entre la precisión en decimales que necesitemos calcular y el valor límite de 14. Es una fórmula incluida en el famoso software Mathematica, de uso común en el ámbito científico.
Lo que se detalla a continuación es un pequeño código en Visual Basic que nos permite extraer el valor exacto de π con sus catorce primeros decimales haciendo uso de la fórmula de los hermanos Chudnovsky. Es muy sencillo de entender, ya que sólo sigue paso a paso el algoritmo. Destacar únicamente la función auxiliar Factorial para calcular los factoriales requeridos.
Dim k As Long
Dim numeroPI As Double
Dim Numerador As Double, Denominador As Double
Dim Precision As Double, Limite As Double
k = 0: numeroPI = 0
Precision = 14
Limite = (Precision + 3) / 14
Do While k < Limite
Numerador = 0
Denominador = 0
Numerador = ((-1) ^ k) * Factorial(6 * k) * (13591409 + (545140134 * k))
Denominador = Factorial(3 * k) * (Factorial(k) ^ 3) * (640320 ^ ((3 * k) + (3 / 2)))
numeroPI = numeroPI + (Numerador / Denominador)
k = k + 1
Loop
numeroPI = 12 * numeroPI
numeroPI = 1 / numeroPI
Debug.Print FormatNumber(numeroPI, 14)
End Sub
Private Function Factorial(numFactorial As Long) As Double
Dim i As Long, TempFactorial As Double
TempFactorial = 1
For i = 1 To numFactorial
TempFactorial = TempFactorial * i
Next i
Factorial = TempFactorial
End Function
Que nadie intente calcular más de catorce decimales porque precisamente ese es el límite de las variables de doble precisión en Visual Basic. Eso sí, se puede extraer un número inferior alterando el valor de la variable Precision.
Los hermanos Chudnovsky, actualmente, residen en Estados Unidos y, además de por su habilidad en la construcción de supercomputadores caseros, son conocidos por la estrecha relación laboral que ambos mantienen, llegando a definirse ellos mismos como “un único matemático ocupando dos cuerpos”. Esta colaboración también está marcada, en cierta medida, por la enfermedad de tipo muscular que sufre Gregory, que lo hace en ocasiones dependiente de su hermano David. De este último se ha llegado a decir que es el mejor matemático vivo de la historia.
Los cerebritos calculines continuarán su gesta de intentar llegar al final del número π, hasta el último decimal que lo convierta en un número irracional transcendente de valor concreto. O quizás tengan razón aquellos que aseguran que los decimales de π no se acabarán nunca, y que dicen que es un número tan complejamente apasionante que, por ejemplo, todos los números de teléfono del mundo se pueden encontrar escondidos en la secuencia decimal de π, porque sus dígitos parecen estar repartidos aleatoriamente y no construidos de una forma particular (encontrándose entre sus infinitos guarismos cualquier secuencia posible). O es probable que todos ellos tengan razón y ninguno de ellos la tenga, aunque seguramente la longitud de π acabará siendo bastante mayor que el título de este post (aunque parezca mentira).
Lo que está claro es que π es, para muchos, un número mágico donde buscar mensajes ocultos, y para todo el mundo un valor importantísimo que permite construir carreteras y barcos, entre otras muchas cosas. Su número de decimales importa poco a niveles prácticos hoy en día, porque sería una locura realizar cálculos con tal nivel de exactitud, además de una estupidez supina. Pero, por lo menos, vamos observando nuestra amplia evolución desde hace un par de miles de años, cuando se deducía de la mismísima Biblia que el valor de π era simplemente igual a 3; en Primera de Reyes, 7-23, dice literalmente:
Hizo fundir asimismo un mar de diez codos de un lado al otro, perfectamente redondo; su altura era de cinco codos, y lo ceñía alrededor un cordón de treinta codos.
Por último, y ya que estamos en ello, recomendar desde aquí la película “Pi, fe en el caos“, una obra de arte geek y profundamente paranoica y demente, pero que todo buen friqui tecnológico debe visionar. Especial atención a sus múltiples fallos, comenzando desde el principio por el más garrafal de todos.
Concurrencia optimista en bases de datos

Red de datos
Para solventar esta traba a la hora de actualizar una base de datos se pueden esgrimir dos recursos o modelos: la concurrencia pesimista y la concurrencia optimista. Los objetos que manipulan datos en los distintos lenguajes de programación están preparados para manejar ambas técnicas, por lo que no nos va a resultar nada complicado aplicar una u otra. Nosotros apostamos desde siempre por la concurrencia optimista, sobre todo en determinados entornos, pero explicaremos brevemente en que consisten los dos procedimientos.
La concurrencia pesimista implica bloquear filas, o registros, en el origen de datos para impedir que otros usuarios modifiquen la información, de tal forma que el usuario actual resulte afectado. En un modelo pesimista, cuando un usuario realiza una acción que hace que se aplique un bloqueo, otros usuarios no pueden realizar acciones que entrarían en conflicto con ese bloqueo hasta que el propietario del mismo lo libere. Este modelo se utiliza principalmente en aquellos entornos en los que hay mucha contención de datos, de manera que el costo de protegerlos mediante bloqueos es menor que el costo de deshacer transacciones si se producen conflictos de concurrencia.
La concurrencia pesimista puede resultar útil en ambientes donde los tiempos de bloqueo son cortos, por ejemplo la actualización automática de registros, según determinadas reglas, mediante software. Sin embargo, es una técnica que consume recursos del servidor, necesita de una conexión persistente con el gestor de datos y no resulta nada escalable cuando los usuarios, interactuando con los datos, hacen que los registros queden bloqueados durante períodos de tiempo relativamente largos (mientras se modifican las líneas de una factura, por ejemplo).
Por el contrario, utilizando el sistema de concurrencia optimista no se bloquean filas cuando se lee, sino que se realizan copias locales desconectadas de los datos y, una vez se hayan editado, se vuelca la nueva información sobre la base de datos original. En este caso se produce el problema al que aludíamos al principio, ya que en el tiempo que nosotros hemos estado modificando los datos, otro usuario ha podido acceder al registro y haber realizado sus propias modificaciones. Es, entonces, la aplicación informática la que debe determinar si la información se han modificado o no desde que se leyó. Esta técnica, aunque parezca más farragosa de implementar, mejora el rendimiento del sistema y la velocidad de acceso de todos usuarios, ya que el origen de datos no se encuentra nunca bloqueado y puede servir información continuamente y bajo demanda.
En el momento en que un equipo intente modificar determinados registros y detecte que han sido ya modificados con respecto a la información original que tenía desde que se leyó, en el modelo de concurrencia optimista se considera que hay una infracción. La pericia del programador consistirá en detectar dichas infracciones y saber actuar a tal efecto, dependiendo del proceso que se esté realizando y de las circunstancias puntuales. Esto es, una infracción puede resolverse sobrescribiendo los nuevos datos o manteniendo las modificaciones sin realizar. En función de las características del proyecto y de las necesidades del cliente habrá que hacer una u otra cosa.
Vamos a ver un ejemplo práctico haciendo uso de una pequeña tabla de tres campos y un único registro. La tabla original podría ser como la siguiente:
| IdCliente | Apellido | Nombre |
| 101 | Martínez | Cris |
Imaginemos que un Usuario_1 lee la fila anterior de la base de datos a las 12:00 AM. Veamos una representación gráfica de los tres valores que nos ocupan: el valor original (valor cuando se leyó el registro), el valor actual (el que modifica Usuario_1 en local) y el valor en la base de datos (el valor que se encuentra registrado en la tabla).
| Nombre de columna | Valor original | Valor actual | Valor en la base de datos |
| IdCliente | 101 | 101 | 101 |
| Apellido | Martínez | Martínez | Martínez |
| Nombre | Cris | Cris | Cris |
En este caso los tres valores coinciden, porque Usuario_1 todavía no ha hecho ninguna modificación, simplemente ha extraído la información.
A las 12:01 AM, un nuevo Usuario_2 recurre al servidor para leer la misma fila, y a las 12:03 AM edita el campo Nombre (cambia “Cris” por “Cristina”) y actualiza la base de datos. Nuestra representación visual del baile de cadenas de texto sería ahora la que sigue:
| Nombre de columna | Valor original | Valor actual | Valor en la base de datos |
| IdCliente | 101 | 101 | 101 |
| Apellido | Martínez | Martínez | Martínez |
| Nombre | Cris | Cristina | Cris |
La actualización se realiza correctamente porque los valores contenidos en la base da datos en el momento de renovar la fila coinciden con los valores originales de tenía Usuario_2 (“Cris”, en la base de datos, es igual que el dato “Cris” del momento de la lectura); no existe ninguna infracción para Usuario_2.
Vamos a imaginar ahora que Usuario_1 termina de realizar sus modificaciones a las 12:05 AM (cambia “Cris”, su lectura, por “María Cristina”). Veamos la representación:
| Nombre de columna | Valor original | Valor actual | Valor en la base de datos |
| IdCliente | 101 | 101 | 101 |
| Apellido | Martínez | Martínez | Martínez |
| Nombre | Cris | María Cristina | Cristina |
Al intentar actualizar se va a encontrar con una infracción de la concurrencia optimista, ya que el valor actual de la base de datos (“Cristina”) no coincide con el valor que él esperaba para ese campo (“Cris”) porque Usuario_2 lo había modificado previamente. Es ahora el momento en el que hay que tomar la decisión de sobrescribir los cambios realizados o, por el contrario, cancelar la actualización. Como antes decíamos, la elección de una u otra acción dependerá de la situación en concreto y de las querencias del cliente.
Existen varias técnicas para determinar una infracción de concurrencia optimista a la hora de actualizar una base de datos. Una de ellas consiste en incluir una columna de marca de tiempo en la tabla. Las bases de datos suelen ofrecer funcionalidad de marca de tiempo que puede utilizarse para identificar la fecha y la hora en que se actualizó el registro por última vez. Mediante esta técnica, decimos, se incluye una columna de marca de tiempo en la definición de la tabla y, siempre que se actualiza el registro, se actualiza la marca de tiempo, de manera que queden reflejadas la fecha y la hora actuales. Al hacer una prueba para ver si hay infracciones de la concurrencia optimista, la columna de marca de tiempo se devuelve con cualquier consulta del contenido de la tabla. Cuando se intenta realizar una actualización, se compara el valor de marca de tiempo de la base de datos con el valor de marca de tiempo original contenido en la fila modificada. Si coinciden, se realiza la actualización y se edita la columna de marca de tiempo con la hora actual, con el objeto de reflejar la actualización. Si no coinciden, se ha producido una infracción de la concurrencia optimista.
Otra técnica para probar si hay alguna infracción relacionada con la concurrencia optimista consiste en comprobar que todos los valores de columna originales de una fila siguen coincidiendo con los existentes en la base de datos.
Veamos la siguiente consulta SQL contra una base de datos:
SELECT Col1, Col2, Col3 FROM Tabla1
UPDATE Table1 Set Col1 = @NuevoValorCol1,
Set Col2 = @NuevoValorCol2,
Set Col3 = @NuevoValorCol3
WHERE Col1 = @ViejoValorCol1 AND
Col2 = @ViejoValorCol2 AND
Col3 = @ViejoValorCol3 Lo que se hace es seleccionar (SELECT) los campos, o columnas, que se van a modificar para, después, actualizar (UPDATE), con los nuevos valores (@NuevoValorColX), todos aquellos donde (WHERE) los valores originales (@ViejoValorColX) coincidan con los valores actuales en base de datos (ColX).
La teoría es sencilla, pero la implementación puede llegar a complicarse bastante, no por la técnica en sí, sino por la obligación de tomar una decisión en cada uno de los momentos. Será ya la intuición del desarrollador la que indique qué solución tomar en cada caso de infracción. Lo que sí debe quedar claro es que, excepto en determinadas y muy puntuales ocasiones, la concurrencia optimista siempre debe preferirse por encima de la pesimista. Es mejor resolver mal una infracción (cosa que puede corregirse a posteriori) que mantener una red de datos a un 40% de su capacidad total de gestión por acciones de bloqueo tras bloqueo, lentitud, falta de escalabilidad y desidia del usuario que es incapaz de trabajar en esas condiciones.
Iniciar a los niños en el mundo de la programación informática con Scratch

Scratch
Scratch es una herramienta gratuita para que los más pequeños de la casa se inicien en el cruel mundo del desarrollo de software (sí, cruel he dicho). Si me apuras, los mayores que no tengan ni repajolera idea de escribir un programa informático podrían hacer uso también de ella para sus primeros pinitos, aunque en principio el software está diseñado para los niños entre 6 y 16 años. De todas las herramientas que conozco para iniciar a los pequeños en la programación, esta es la que más me ha gustado con diferencia por su facilidad de uso, su interfaz intuitiva y, sobre todo, porque su curva de aprendizaje tiene muy poco de curva y mucho de aprendizaje. (Por cierto, aunque parezca mentira, esto no es un post patrocinado ni nada por el estilo).
Scratch se basa en scripts o guiones de acciones por lotes que se asocian a objetos (sprites) o escenas en pantalla. Los sprites son pequeños elementos visuales que representan una imagen o icono, no en vano Scratch está eminentemente preparado para que los niños aprendan creando una historia interactiva, un juego o una animación, es decir, que aprendan jugando. Cada objeto es susceptible de tener diversos disfraces o personalizaciones, así como sonidos asociados, lo que permite variar el objeto en función de determinadas circunstancias. Esto nos recuerda a la propiedad de los personajes de cualquier juego de cambiar su apariencia dependiendo de la dirección en la que caminen, si saltan, corren o pierden una vida.

Pantalla principal de Scratch
La característica más importante de Scratch es la falta de necesidad de introducir una sola línea de código para generar un programa. La aplicación funciona por medio de los denominados bloques, agrupados en paletas según sus características. Un bloque es una pieza o elemento que encierra una acción que puede ser de apariencia, de sonido, de movimiento, de decisión, de control, etcétera. Los bloques se arrastran de la Paleta de bloques al Panel de script, creando pilas o conjuntos de bloques que constituyen en sí mismos pequeños programas o subrutinas del programa general al que pertenecen.
Por ejemplo, en la siguiente imagen se muestra un script que hará moverse el objeto formando un cuadrado en cinco ocasiones consecutivas. Entre cada acción se ha insertado un retardo de un segundo para apreciar bien los movimientos; además, el disparador del comienzo de la acción es la pulsación de la barra espaciadora.

Script en Scratch
Como se puede apreciar, Scratch es sumamente sencillo de manejar. Simplemente habrá que ir arrastrando bloques de acciones para crear programas que afectarán a un objeto o a una escena completa. Cada objeto y cada escena tienen sus propios grupos de bloques que funcionan de manera independiente, ejecutando cada tarea en el momento preciso.
Scratch dispone de bloques de acciones totalmente engarzados con la estructura de la programación “adulta” actual orientada a objetos, y ese es su mejor medio de presentación para el aprendizaje. Disponemos de estructuras de control, repeticiones y bucles, sentencias condicionales, empleo de variables globales y locales, manejo de cadenas de texto, listas o matrices unidimensionales de objetos, operadores aritméticos y booleanos, comparaciones, control de eventos, etcétera. Es más que posible desarrollar cualquier programa sencillo con Scratch, además de las animaciones y juegos a los que está orientado. Para estos últimos también gozamos de características implementadas de fábrica como el movimiento de personajes, el rebote de objetos o el control de colisiones.
Además de todo ello, Scratch tiene una característica bastante interesante, que es la de subir al sitio web de la aplicación nuestras últimas creaciones para compartirlas con toda la comunidad (bajo licencia Creative Commons); y todo ello de una manera automática. Estas aplicaciones en línea se reproducen sobre un applet de Java, sin embargo, para ejecutar los programas en local deberemos tener instalada la herramienta en sí, ya que Scratch no dispone de un compilador al uso que nos permita generar un archivo ejecutable compatible con nuestro sistema operativo.
Y para los más friquis también tenemos importantes noticias, ya que Scratch es capaz de conectar con los productos LEGO WeDo y dispone de bloques de acciones específicamente diseñados para interactuar con los motores de tus diseños de robótica. Simplemente habremos de conectar nuestro robot LEGO con el ordenador vía USB y generar el programa correspondiente desde Scratch con la misma facilidad que hemos comentado anteriormente.
En el siguiente vídeo (en inglés) se puede ver el desarrollo de una aplicación en Scratch que maneja un robot de LEGO WeDo con forma y movimientos de portero de fútbol.
¿Te he convencido ya? ¿Todavía no? Esto de Scratch parece salido de la mente de un padre rarito que quería que su hijo aprendiera a programar y le diseño una herramienta, ¿verdad? Pues espera a oír leer lo que sigue.
Scratch es una herramienta multilingüística, gratuita y de software libre creada por el grupo Lifelong Kindergarten Group del MIT Media Lab, el departamento de tecnología y multimedia del Instituto Tecnológico de Massachusetts (MIT), en Estados Unidos. Está disponible para sistemas Windows, Linux y Mac OS X (qué pena de Solaris, pero nadie es perfecto), y es un proyecto dirigido por Mitchel Resnick y financiado por la National Science Foundation (Fundación Nacional de Ciencia) estadounidense, Microsoft, Intel, Nokia, Iomega y los consorcios de investigación del MIT Media Lab, además de otros organismos, universidades y empresas privadas.
Es uno de los softwares educativos más reconocidos a nivel mundial y especialmente recomendado por el Observatorio Tecnológico del Ministerio de Educación español. Se utiliza en todo el mundo en muchos entornos diferentes: escuelas, museos, centros de aprendizaje, hogares, ayuntamientos…
El 15 de diciembre de 2009, la comunidad web de Scratch contaba con más de 408.227 miembros registrados (95.033 de ellos habían colgado sus proyectos), con un total de 796.359 proyectos compartidos por la comunidad. El sitio web obtiene cerca de 7.000.000 de páginas vistas al mes. En el año 2010, la web de Scratch cuenta con más de un millón de proyectos alojados y compartidos (código fuente incluido). Además, cada cierto tiempo se celebra el Scratch Design Studio, un evento basado en desafíos que fomentan la creación y el intercambio de ideas y proyectos. Asimismo, disponen de una comunidad en línea exclusiva para educadores denominada ScratchEd.
El éxito de la herramienta es tal que se ha desarrollado incluso algún que otro mod, o modificación alternativa derivada del original, basado en el código fuente de Scratch y que agrega nuevos bloques de funciones o cambios en la interfaz gráfica, siendo los más relevantes BYOB (programado por Jeans), Panther (por Panther Team) y Streak (de Billyedward).
¿Cómo se te queda el cuerpo ahora? La verdad es que es la herramienta ideal a la disposición de niños y adolescentes para iniciarse en el mundo del desarrollo de software. Y hablamos de iniciarse, por lo que nadie espere conexión con bases de datos distribuidas, herencia y polimorfismo o recursividad; tampoco hay que pasarse. Aunque si piensas que sólo vas a poder desarrollar estúpidas animaciones infantiles, te recomiendo que recorras la galería de proyectos destacados de la web de Scratch y visualices joyas como Sonic Advance 2, Piano~, 3D duplivert wave o Tarati.
Scratch es la mejor opción para comenzar desde cero (from scratch, en inglés) y obtener una sólida base que permita posteriormente migrar a entornos de desarrollo más “serios”.
(HTML5 + CSS3) – Flash = Web futura

Adobe herida de muerte
Flash is nearly dead, i’m sorry. Fue bonito mientras duró, pero a la tecnología Flash le quedan cuatro telediarios. Tuvo un auge muy importante en su época y representó una revolución importantísima para el desarrollo web dinámico, pero hemos llegado a un momento en el que no tiene sentido o, por lo menos, no tanto como antes.
En mayo de 1995, una pequeña empresa de San Diego (California) llamada FutureWave Software desarrolló una aplicación para crear animaciones basadas en imágenes vectoriales con el fin de aumentar las capacidades de una herramienta anterior que permitía el dibujo vectorial. Aquella aplicación de animación se llamó FutureSplash Animator.
En aquella época, la forma de crear animaciones para la floreciente World Wide Web era exclusivamente a través de Java, por lo que decidieron inventar algún sistema que permitiera embeber esas animaciones vectoriales en una página web. La tecnología tuvo tanto éxito entre los desarrolladores que importantes sitios web la integraron en sus interfaces de navegación, como por ejemplo MSN de Microsoft, la web oficial de The Simpsons o la web de Disney.
Por aquel entonces, Disney trabajaba también con productos de Macromedia, y eso propició que ambas empresas, Macromedia y FutureWave Software, comenzaran a trabajar juntas para conseguir una conexión entre sus softwares. Finalmente, en diciembre de 1996, Macromedia compró FutureWave Software, convirtiendo la aplicación FutureSplash Animator en Macromedia Flash 1.0. Casi una década después, en 2005, la todopoderosa Adobe Systems compraría Macromedia y convertiría el producto, ya consolidado en el mercado, en el actual Adobe Flash.
Durante más de diez años, Flash se convirtió en una herramienta indispensable para el desarrollador web. Prácticamente todos los sitios web se sentían obligados a incorporar animaciones para estar a la moda. Posteriormente se comenzaron a desarrollar web completas en Flash, totalmente dinámicas, animadas, interactivas y espectaculares. Con la aparición del formato Flash Video, las webs que incorporaban tecnología Flash se multiplicaron, y aparecieron sitios como YouTube o Google Vídeos utilizando dicha herramienta.
Sin embargo, Flash acarrea muchos problemas. Para empezar es un formato propietario de Adobe, no abierto ni estandarizado. Esto hace que una sola empresa controle una tecnología que, al extenderse demasiado, puede convertirse en un peligroso monopolio, y para nada casa con la filosofía a la que tiende cada vez más Internet.
Otro problema es el peso de las animaciones. Un archivo de Flash puede llegar a ocupar bastante espacio, con lo que la descarga desde una página web se convierte en tediosa. Además el consumo de recursos es notable, y los pequeños ordenadores modernos (netbooks), o los PC de bolsillo se las ven y se las desean para refrigerarse cuando hay Flash de por medio.
Los buscadores tampoco se llevan nada bien con Flash. Al ser un producto encapsulado en su propio archivo, los motores de búsqueda no pueden acceder a su interior para indizar textos, enlaces o fotografías. Esto no es del todo cierto, pues Google y otros buscadores ya indexan desde hace años el contenido de los SWF, sin embargo no queda muy claro hasta qué punto se realiza esto y que importancia tiene (o le da Google) con respecto a otras tecnologías como HTML o XML.
El camino que debemos seguir es el que nos lleva a la denominada web semántica, y Flash no es paradigma de ese futuro precisamente. Otras tecnologías en fase de creación, como la versión 5 de HTML, o la versión 3 de CSS sí van por el buen camino. HTML 5 es la quinta revisión del leguaje básico de la web. Sus nuevas características hacen de él muchísimo más estructural y semántico, y bastante potente, con funcionalidades a través de una interfaz estandarizada para, por ejemplo, reproducir audio y vídeo.
El consorcio mundial de la web (WC3) hasta ahora había estado centrado en el desarrollo de SGML, XML, XForms, RSS, CSS e incluso AJAX, por lo que este cambio era necesario. Seguir utilizando un lenguaje que no ha cambiado desde 1999 es seguir siendo hombres de las cavernas. Nuestros navegadores ahora tienen pestañas, utilizamos RSS y conocemos XML, etcétera, sin embargo seguimos haciendo básicamente lo mismo que la década pasada: tablas (<table>) y párrafos (<p>).
Los recientes rifirrafes entre Adobe y Apple a causa de la no inclusión de soporte Flash en el iPad han hecho saltar todas las alarmas. Lo cierto es que Apple no ha acertado del todo con esa política, y es que es cierto que un uso excesivo de Flash se zamparía los recursos y la batería del tablet en cero coma, pero tanto como eliminar el soporte nativo, me parece excesivo.
Apple no ha sido el único en rechazar Flash. Webs tan importantes como YouTube han anunciado que migraran a HTML 5 todos sus vídeos, cosa que ya están haciendo en fase de pruebas. Por si fuera poco, empresas como Google, Facebook, Microsoft o Scridb han emitido comunicados en los que apuestan claramente por el matrimonio HTML 5 y CSS 3 como estándar de futuro. Hasta el sitio web pornográfico YouPorn, uno de los más importantes para adultos del mundo, ha anunciado que pronto tendra su versión en HTML 5. Además cada vez se dejan ver más animaciones impresionantes realizadas sólo con la nueva versión de HTML.
En fin, parece claro que lo que nos depara el futuro de Internet abandona un poco en la cuneta a Adobe y a su Flash. Sin embargo no tengo tan claro que Flash debiera desaparecer por completo, ya que reorientando la herramienta podría sacársele mucho partido en áreas como el desarrollo de cedés o deuvedés interactivos, el software de los puntos de información en museos y ciudades o, qué sé yo, cartas de vino multimedia en los restaurantes.
Adobe, en la presentación de la suite CS5, dio a conocer una nueva función dentro de Flash CS5 muy arriesgada pero muy inteligente a la vez. Se trata de una herramienta que convertirá las animaciones Flash a HTML5 bajo la nueva etiqueta <canvas>. Un audaz movimiento, pues vendría siendo, por decirlo de una forma simple, matar definitivamente el plugin de Flash pero mantener el lenguaje de programación para desarrolladores, y a la vez seguir imprimiendo dinero para la firma. Habrá que probar bien esta característica para ver cómo de bien o de mal funciona, incluso con animaciones antiguas.
Por supuesto que todo lo aquí expuesto se hace extensible a la tecnología Silverlight de Microsoft, que llegó tarde, mal y a rastras a competir con Flash, y nadie le hizo mucho caso (aunque admito que, posiblemente, sea hasta mejor que el propio Flash).
Flash es un muy buen producto, fácil de utilizar y con grandes posibilidades. Si en el futuro vemos esta tecnología pulular por la Red habrá de ser en pequeñas y contadas dosis, porque si no estaremos dando pasos hacia atrás.
Web con acceso a datos sólo con Javascript y un TXT

Javascript + TXT
En contra de lo que piensa el común de los mortales, es posible disponer de un sitio web con acceso a datos sin necesidad de utilizar ni una sola base de datos y ni una sola línea de código PHP o ASP. Es muy común descubrir foros de noticias donde los novatos preguntan cómo pueden acceder a una serie de datos almacenados sin necesidad de crear una web con código del lado del servidor, generando un acceso desde el propio navegador del lado del cliente. Y también es muy común encontrar las respuestas de “los entendidos” comentando que eso es imposible y que, si lo fuera, sería muy peligroso.
Bueno, pues peligroso no sé, pero posible sí que es, y también muy sencillo. Sólo necesitamos un archivo de texto plano y unas cuantas sentencias en Javascript. ¿Empezamos?
Si precisamos tener una web que almacene una gran cantidad de datos, como usuarios y contraseñas, artículos de una tienda, documentos o información de clientes y proveedores, se intuye necesario el camino más largo, esto es, un sitio con código de acceso a datos del lado del servidor (ASP, PHP…) y un gestor de bases de datos al uso (SQL Server, MySQL…). Sin embargo, en muchas ocasiones solamente es necesario mantener unos pocos datos que se actualizan a mano cada cierto tiempo, por ejemplo un listado de licitaciones abiertas de un ayuntamiento o una serie de ofertas de trabajo de una empresa.
Cualquiera puede pensar que, en alguno de esos casos, la opción menos costosa sería la de modificar manualmente los archivos HTML cuando proceda y listo. Sin embargo, si la persona que tiene que realizar dichas modificaciones no es experta en diseño web (la secretaria del ayuntamiento, con respecto al ejemplo de las licitaciones, o la de la empresa, en el supuesto de las ofertas de trabajo) es más que probable que no sepa editar los documentos o que, si lo hace, los estropee para los restos.
Para estas situaciones, o similares, existe un pequeño truco del que podemos hacer uso. El sistema consiste en pasar datos a un HTML como si de variables Javascript se tratara, enlazándolas desde un TXT externo. Veamos primero el archivo de texto y el HTML con Javascript para, después, pasar a comentarlos.
Registro1="Administrador de sistemas";
Registro2="Programador en Java";
Registro3="Content Manager";
Registro4="Técnico Help Desk";
Enlace="empresa.html";
<html>
<head>
<script src="datos.txt"></script>
<script type="text/javascript">
function cargarDatos(){
document.getElementById("Campo1").innerText=Registro1;
document.getElementById("Campo2").innerText=Registro2;
document.getElementById("Campo3").innerText=Registro3;
document.getElementById("Campo4").innerText=Registro4;
document.getElementById("CampoEnlace").href=Enlace;
}
</script>
</head>
<body onload="cargarDatos()">
<table>
<tr>
<td colspan="3" id="Campo1"></td>
</tr>
<tr>
<td id="Campo2"></td>
</tr>
<tr>
<td id="Campo3"></td>
</tr>
<tr>
<td id="Campo4"></td>
</tr>
</table>
<br />
<a id="CampoEnlace">Volver a la página anterior</a>
</body>
</html>
Como podemos observar, el archivo de texto es muy sencillo, ya que sólo guarda una serie de constantes (
Registro1, Registro2, Registro3, Registro4 y Enlace) con un valor alfanumérico asignado. Estas constantes las importamos desde el HTML como si de un archivo fuente de Javascript se tratase, concretamente en la línea <script src="datos.txt"></script>. De esta manera, el navegador adquiere el código externo para ser utilizado en la página actual, sólo que en este caso el código se compone exclusivamente de constantes y datos.
Posteriormente se genera una función cargarDatos() (se inicia en el body onload) que lo que hace es asignar la información importada a cada etiqueta HTML identificada por su id, mediante la función document.getElementById. Hay que tener en cuenta el tipo de etiqueta que se quiere rellenar y sus peculiaridades particulares. Así pues, en el caso de los <td> (celdas regulares) se utiliza la propiedad innerText, y en el <a> (hipervínculo) se usa href para referirse al atributo que permite especificar el destino del enlace.
Como vemos, es una técnica muy sencilla y altamente rentable, pues para pequeños conjuntos de información no sería necesario contratar alojamientos web de altas prestaciones en cuanto a acceso a datos se refiere. Además, lo único que debería aprender a manejar la persona al cargo es un software de FTP para poder subir el archivo TXT modificado cuando fuera necesario.
Por supuesto que es un ejemplo muy sencillo, pero se puede complicar hasta el infinito. Imaginemos que deseamos ir añadiendo filas a la tabla dependiendo del número de registros, algo muy lógico; no siempre tienen por qué ser cuatro. El siguiente archivo de texto muestra un ejemplo de este caso.
Registros=2;
Fecha1="11 de mayo de 2010";
Texto1="Contrato para el servicio de recepción y conserjería.";
Fecha2="11 de mayo de 2010";
Texto2="Contrato para el servicio de limpieza y mantenimiento.";
Veamos ahora cómo quedaría el código Javascript donde se define la función
cargarDatos() en nuestro HTML.
<script type="text/javascript">
function cargarDatos(){
var Elemento1;
var Elemento2;
for (i=1;i<=Registros;i++)
{
Elemento1="Fecha"+i;
Elemento2="Texto"+i;
document.getElementById(Elemento1).innerText=eval(Elemento1);
document.getElementById(Elemento2).innerText=eval(Elemento2);
}
}
</script>
Podemos observar que ha cambiado sustancialmente. Ahora necesitamos un bucle (
for) que recorra todos registros (variable Registros en el TXT) de uno en uno y vaya asignando valores a las etiquetas. En este caso hacemos uso de dos variables (Elemento1 y Elemento2) que nos sirven para generar los nombres de las etiquetas HTML para después pasárselas a la función getElementById. Además, por simplificar, hemos utilizado el mismo nombre de las etiquetas HTML para las constantes y deberemos evaluarlas con la función eval antes de asignarlas, porque si no Javascript no se entera al ser una cadena creada a mano mediante la concatenación de un texto y el valor del contador i.
A continuación vemos el código Javascript para dibujar la tabla dependiendo del número de registros.
<script type="text/javascript">
document.write("<table>");
for (i=1;i<=Registros;i++)
{
document.write("<tr>");
document.write("<td id='Fecha"+i+"'></td>");
document.write("</tr>");
document.write("<tr>");
document.write("<td id='Texto"+i+"'></td>");
document.write("</tr>");
document.write("<tr><td> </td></tr>");
}
document.write("</table>");
</script>
Lo que hacemos simplemente es recorrer todos los registros e ir añadiendo filas y celdas con sus correspondientes etiquetas
id. Al final de cada bucle se agrega una celda vacía (con un espacio) para separar un poco cada grupo.
Evidentemente, el usuario deberá actualizar manualmente, además de los registros propiamente dichos, la constante que define el total de registros para que funcione todo bien. También habrá de preocuparse por escribir correlativamente los nombres de las constantes y no cometer ningún otro error en la generación del archivo.
Lo que habíamos dicho al principio, si es un número reducido de registros de datos, y estos no se actualizan frecuentemente, nos puede ser de mucha utilidad el uso de esta técnica (hay que tener en cuenta que cada variable o constante es un espacio en memoria que ocupa sitio); para soluciones más complejas se nos queda corta. ¡Hala, a programar se ha dicho!
