Contenido

SVG-edit, un completo paint en tu navegador

14 ene

+ 4

svg-edit, es un editor de gráficos desarrollado sobre nuestro navegador mediante Javascript que se encarga de usar SVG. El editor, que funciona en todos los navegadores modernos nos permite obtener un interfaz muy agradable y completo sobre cualquier navegador (incluido IE6+ con el plugin de Google Chrome).

svg-edit
(Ver Imagen)

Como podemos ver, las opciones disponibles no son pocas (la imagen es así de fea por que no sabía que hacer ante un lienzo en blanco :D , hay gente que se ha currado cosas más chulas), desde dibujar a mano alzada hasta la inclusión de imágenes externas, pasando por la herramienta de texto, la degeneración de polígonos o la inclusión de capas.

Disponemos de 3 formatos de los que descargar y lo podemos probar online directamente en esta demo:

  1. Plugin para Firefox
  2. Widget Opera
  3. Código fuente

Los desarrolladores, además disponemos de una API con la que podemos ir haciendo algunos añadidos más al proyecto.

Añade subtítulos a tus videos con Javascript

14 ene

+ 7

El tag <video /> del nuevo estándar HTML5 cada día nos sorprende más y es que aunque se detectaron problemas a la hora de interpretar el estandar en los diferentes navegadores, cada nueva noticia sobre él aporta una idea interesante.

Bruce Lawson, gurú de HTML5, nos ofrece una interesante implementación que nos ofrece subtítulos a nuestros videos mediante Javascript.

HTML

La principal ventaja que nos ofrece esta técnica es que nos permite tener elementos HTML con el texto del video en nuestra página, que aunque nos hará páginas más largas y pesadas, nos permite ofrecer a usuarios sin capacidad de reproducir videos una solución alternativa (aunque no completa) de saber de que vá el video.

<video width=600 src="leverage-a-synergy.ogv" ontimeupdate="timeupdate()"
 style="background:black" autobuffer controls>
 <p>This page is to demonstrate open HTML5 video, so if you're not using a
 browser that can display the open Ogg Theora codec, there's not  much to see. Sorry!</p>
 </video>
 <div id="transcript">
 <h3>Transcript</h3>
 <p>
 <span data-begin=1 data-end=6>Hi, my name's Dr Archimedes Einstein and I'm a Doctor of Science at the University of Science</span>
 <span data-begin=6 data-end=9>in a very famous town that you're too stupid to have heard of.</span>
 <span data-begin=9.5 data-end=11.5>Anyway, today we're going to talk about "synergies".</span>
 <span data-begin=12 data-end=15>A lot of people are worried about synergies, but I can tell you that</span>
 <!-- ... -->
 </p>
 </div>

Como podemos ver, se trata de una estructura bastante lógica, un video y una serie de líneas con el texto que compone la transcripción de dicho video. Hay que destacar la función timeupdate() que se ejecutará en el evento ontimeupdate del elemento <video /> (que vemos en negrita), ya que es la encargada de hacer mágia y convertir ese texto en los subtítulos del video.

Por otro lado, en el texto podemos ver que los <span /> ofrecen información sobre cuando deben empezar y terminar cada línea, vinculando los data-begin y data-end al tiempo de reproducción del video medianante los atributos data disponibles en el estandar.

Javascript

Ahora necesitamos que el texto y el video se entrelazen y ofrezcan el resultado que estamos buscando, para ello primero hemos de cargarlo y posteriormente ir actualizando el texto a medida que el video va reproduciendose.

var captions = [];
window.onload = function() {
  var caption = document.createElement('div');
  caption.id = 'caption';
  // Cargamos el primer elemento
  var ref = document.getElementsByTagName('video')[0];
  ref.parentNode.insertBefore(caption, ref.nextSibling);

  // Cargamos todos los subtítulos
  var nodes = document.querySelectorAll('#transcript span');
  for (var i = 0; i < nodes.length; i++) {
    // Generamos un objeto con la información de cada línea
    var c = {'start': parseFloat(nodes[i].getAttribute('data-begin')),
             'end': parseFloat(nodes[i].getAttribute('data-end')),
             'text': nodes[i].textContent};
    captions.push(c);
  }
}
// Función que actualizar el texto dependiendo del tiempo
function timeupdate() {
  var v = document.querySelector('video');
  var now = v.currentTime;
  var text = "";
  for (var i = 0; i < captions.length; i++) {
    if (now >= captions[i].start && now <= captions[i].end)
    {
      text = captions[i].text;
      break;
    }
  }
  document.getElementById('caption').innerHTML = text;
}
// Ocultamos los subtítulos
document.write('<style>#transcript{display:none}</style>');

Al terminar de cargar la página, recogemos los textos y los almacenamos en una variable global en un formato más cómodo para trabajar con él. En la función timeupdate(), que recordemos usamos en el evento ontimeupdate del tag <video /> nos irá comprobando los cambios y actualizando el mensaje visible a medida que va transcurriendo el tiempo de reproducción.

Para terminar, ocultamos el texto mediante Javascript ya que en caso de no estar disponible, además de no aplicar ninguna de las funcionalidades anteriores nos permitirá visualizar el texto perfectamente.

CSS

Los estilos nos permiten ubicar los subtítulos en el video, y además podremos especificar el tamaño, color y fuente de ellos.

#caption {
 position: absolute;
 width: 100%;
 bottom: 0;
 bottom:30px; /* space for the video controls */
 left: 0;
 text-align: center;
 font-family: sans-serif;
 font-weight: bold;
 color: white;
 text-shadow: black 1px 1px 3px;
 padding-bottom: .5em;
}
#transcript span {display:table-row;}

Básicamente, lo que estamos haciendo es ubicar el texto al pie del video, dejando espacio para los controles.

Bruce, además incluye unos estilos que nos inserta información extra para ciertos usuarios al mostrar mediante CSS información del tiempo de inicio y fin de los textos leyendo directamente de los atributos.

#transcript [data-begin]:before{
  content: " [" attr(data-begin) "s-" attr(data-end)"s]   ";
  font-size:80%;
  display:table-cell;
  padding-right:1em;
}

Resultado

video-span
(Ver Imagen)

El resultado es realmente sorprendente ya que no tiene nada que envidiarle (a este nivel) a los reproductores de escritorio.

Actualización (17:00)

Nukeador me muestra otro sistema, también basado en Javascript que además de permitir conseguir el mismo efecto nos permitirá usar los ficheros .srt que tenemos disponibles por Internet.

video-srt
(Ver Imagen)

Un sistema basado en la lectura mediante Ajax de ficheros .srt (SubRip) y de un posterior parseo para obtener el tiempo y el texto que mostraremos como subtítulo.

Fichero srt

Si alguna vez has necesitado ver una película con subtítulos, te habrás encontrado con que has tenido que descargar un fichero .srt para poder verla. Eso es por que existen una gran cantidad de herramientas que permiten la edición de subtítulos fácilmente con la obtención de este tipo de ficheros. Además, es soportado por la mayoría de todos los reproductores multimédia.

...
5
00:00:07,100 --> 00:00:09,000
Tiene subtitulos son en Español

6
00:00:09,100 --> 00:00:10,500
Gracias a las nuevas technologias

7
00:00:10,500 --> 00:00:20,000
<img src="foo.png"/><img src="foo.png"/><img src="foo.png"/> Gracias! <img src="foo.png"/><img src="foo.png"/><img src="foo.png"/>
....

El formato de un fichero .srt nos permite generar estructuras como las que vemos. Como podemos ver, se trata de un sistema muy cómodo y a mi entender más correcto que el presentado por Bruce.

jai, jugando con audio desde Javascript

13 ene

+ 1

La llegada de HTML5 nos mostró el elemento <audio /> que nos permite hacer que el navegador se convierta en un reproductor de audio con Javascript como controlador. Aprovechando esta nueva característica del lenguaje aparece jai que nos permite generar listados gráficos de las canciones encontradas en nuestra página.

<!-- HTML -->
<div id="jai">
  <canvas id="jai-transport" width="320" height="20"></canvas>
  <ul>
   <li><a href="@F1LT3R - Cryogenic Unrest.ogg" title="Play">F1LT3R - Cryogenic Unrest<span title="Download"></span></a><audio src="@F1LT3R - Cryogenic Unrest.ogg">Your browser does not support the <code>audio</code> element. Get <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3.5</a>.</audio></li>
   <li><a href="@F1LT3R - Ghosts in HyperSpace.ogg">F1LT3R - Ghosts in HyperSpace</a><audio src="@F1LT3R - Ghosts in HyperSpace.ogg">Your browser does not support the <code>audio</code> element. Get <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3.5</a></audio></li>
   <li><a href="@F1LT3R - SOS Distress.ogg">F1LT3R - SOS Distress</a><audio src="@F1LT3R - SOS Distress.ogg">Your browser does not support the <code>audio</code> element. Get <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3.5</a></audio></li>
   <li><a href="@F1LT3R - Disturbed Orbit.ogg">F1LT3R - Disturbed Orbit</a><audio src="@F1LT3R - Disturbed Orbit.ogg">Your browser does not support the <code>audio</code> element. Get <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3.5</a></audio></li>
   <li><a href="@F1LT3R - Binary Lovers.ogg">F1LT3R - Binary Lovers</a><audio src="@F1LT3R - Binary Lovers.ogg">Your browser does not support the <code>audio</code> element. Get <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3.5</a></audio></li>
  </ul>
</div>

El script es muy limitado en cuanto a configuración se refiere, ya que nos obliga a usar una estructura similar a la mostrada arriba, pero se encarga de renderizar mediante un elemento <canvas /> el listado de elementos <audio /> detectados en la página permitiendo disponer de un reproductor avazando en nuestra aplicación.

Firefox 3.6 RC disponible para descargar

12 ene

+ 2

Mozilla anuncia la posibilidad de descargar la versión RC de Firefox 3.6. Una versión que hemos ido siguiendo prácticamente versión beta a versión beta, y en la que nos podremos encontrar:

17 frameworks javascript especializados en animaciones

9 ene

+ 6

Las animaciones en Javascript, aportan dinamismo y un toque distintivo a nuestras páginas y aunque parecen simples efectos por debajo hay algunos cálculos matemáticos y muchas, muchas líneas de código con la que controlar el funcionamiento de cada navegador.

Por este motivo, los frameworks en Javascript destinados a las animaciones son tan interesantes, nos permiten añadir estos efectos sin tener que preocuparnos de ninguna de estas validación. Admix Web ha hecho una recopilación de estos frameworks bastante interesante:

Todo lo que necesitas saber sobre los formularios HTML5

9 ene

+ 5

En DiveintoHTML5 nos muestran todo lo que necesitamos saber sobre los formularios HTML5 y las novedades que podremos llegar a usar en cuando estén más extendidas entre los principales navegadores. Artículo realmente interesante y recomendado.

Aplicaciones web offline, para que la conexión no sea problema

9 ene

+ 2

Las aplicaciones web, como su nombre indican son aplicaciones ligadas a la Web, eso significa que necesitaremos una conexión a Internet para poder acceder a ellas.

Ya hace unos años Google se adelantó a esta necesidad ofreciendo Google Gears como solución a este problema, esencialmente se componía de ofrecer la posibilidad de usar una base de datos local (usando SQLite) y un almacenaje de HTML/JS/CSS en local permitiendo que nuestras aplicaciones pudieran trabajar en modo offline.

Se crearon una gran cantidad de utilidades que aprovechaban estas nuevas características de las aplicaciones web. Pero no era oro todo lo que relucía, esta maravilla requería una instalación por parte del usuario para poder disfrutar de ellas, igual que para disfrutar de aplicaciones Flash.

HTML5 introduce el almacenamiento DOM, algo de lo que ya hemos hablado en infinidad de ocasiones, y es que estas cookies avanzadas nos dan mucho juego y al depender del navegador nos ahorra tener que hacer que el usuario haya de actualizar nada, simplemente el navegador (algo que generalmente se hace automáticamente).

Mozilla Hacks desarrolla una aplicación a modo de demostración que nos permite disponer de una lista de tareas alojada en nuestro navegador, podéis verla aquí.

Cacheamos datos

Para cachear nuestros datos tenemos una serie de métodos DOM que ya hemos visto anteriormente.

function sendLocalStatus() {
	// Leemos el estado en local
  	var status = readStatus();

	// Si hay estados
  	if (status) {
		// Lo enviamos al server online
    	sendToServer(status);

		// Borramos la copia local
    	window.localStorage.removeItem("status");
  	}
}

// Evento onload
window.addEventListener("load", function() {
	// Comprobamos que estemos online
   	if (navigator.onLine) {
		// Si lo estamos enviamos datos de local
		// así actualizamos los cambios hechos offline
		// en nuestro servidor online
     	sendLocalStatus();
   	}
}, true);

// Evento online
window.addEventListener("online", function() {
	// Evento que se activa cuando detecta que estamos online
  	sendLocalStatus();
}, true);

// Evento offline
window.addEventListener("offline", function() {
	// Evento que detecta cuando perdemos la conexión
  	alert("You're now offline. If you update your status, it will be sent when you go back online");
}, true);

Como podemos ver, el navegador nos ofrece una serie de eventos que nos permiten controlar el estado de nuestra conexión, de esta forma, podemos enviar los datos modificados cuando estamos desconectados para ser enviados a nuestros servidores al recuperar la conexión.

Cacheando ficheros

Por otro lado, tenemos los ficheros HTML/CSS/JS que debemos cachear para que nuestra aplicación funcione en modo offline. Para ello, usamos un fichero Manifest que indica que ficheros deben ser cacheados:

// HTML
<html manifest="offline.manifest">

// offline.manifest
CACHE MANIFEST
fonts/MarketingScript.ttf
css/main.css
css/fonts.css
img/face.gif
js/main.js
index.xhtml

En resumen, una serie de herramientas muy útiles para enriquecer cualquier aplicación web. Por que la conexión no debería ser una limitación :D

WordPress 2.9.1

5 ene

+ 0

WordPress 2.9.1 ha visto la luz, despues de una serie de parches para solucionar algunos problemas, la versión estable ve la luz.[Descargar]

CanvasPixelArray para manipular imágenes desde Javascript

3 ene

+ 7

Hace unos meses, Andrés Fernandez nos deleitó con una implementación que nos permitía aplicarle un filtro de escala de grises a imágenes desde Javascript. La idea, era crear un objeto <canvas /> al que le añadimos la imagen a su contexto para después ir procesándola. El resultado era eficaz, pero como el mismo comenta, lento para un uso práctico.

toGray
(Ver Imagen)

Con el cambio de año, el script también ha sufrido un cambio, y menudo cambio. Se trata de un cambio que nos permite aplicar el efecto en porciones de segundo, haciendo que su uso a nivel práctico sea factible.

toGray2
(Ver Imagen)

Como curiosidad decir que, con este experimento no solo podremos convertir imágenes en imágenes en blanco y negro, sinó que como veremos en el post, podemos aplicarle diferentes colores e incluso podemos convertir imágenes en “asciart” :D

toGray3
(Ver Imagen)

¿Conocéis a este personaje? :D

Python + Django, ¿por donde empezar?

2 ene

+ 17

Hace 1 mes, Antoni Aloy nos hizo una charla informal, el Creant Bits. En ella nos presentó, con una ilusión admirable, python + django (os dejo las presentaciones). Yo no había trasteado nada de Python y mucho menos Django, hasta aquel momento y la verdad es que en 4-5 horas que duró la presentación fué posible conocer de pasada ambas herramientas lo suficiente para que el gusanillo empiece a mordisquear, tanto que aún sigue haciéndolo en mi :D

Python

Me voy a ahorrar la información sobre el lenguaje, y delego ese trabajo a la Wikipedia. Solo diré que el código identado al principio es poco “laborioso” pero con 2 días de tabulador no puedes vivir sin él.

Ojo! Actualmente la versión estable es la 2.6 aunque ya se vé asomar la versión 3.x. Por el momento han tomado la desición de paralizar la evolución de la 3.0 hasta que todas las implementaciones de Python lo soporten y asegurarse la mayor compatibilidad con esta nueva versión, así que aunque desarrollemos sobre la 2.6 deberíamos conocer las diferencias con la 3.x.

Django

Este framework fué desarrollado con la premisa de que generar una aplicación web no debería ser tan complicado y mucho menos lento. Por ese motivo, generar una aplicación con Django es sencillo y rápido. Una simple y “casi” universal configuración nos permitirá generar proyectos web completos con un simple copy&paste.

Esto solo pretende ser una pequeña guía de sitios que he ido recopilando en mi primer mes con Python + Django. Espero que a alguien le pueda servir y si de paso pico a algún curioso, pues mejor :D

Actualización(13:49)

Si crear un proyecto es fácil, configurarlo a veces es un poco pesado, así que he montado un proyecto plantilla en blanco que puede servir para iniciarte en el mundo django. Además, lo he alojado en Google Code para que alguien con más conocimientos sobre el tema lo complemente si cree conveniente.