Entradas con tag ‘javascript’

Mejorar carga de audio html5 con sprites

Esta semana estuve jugando con la API de vídeo y audio de HTML5 y descubriendo la increíble cantidad de eventos y propiedades de los objetos del tipo media.

Onda de audio

Yo que soy un gamer confeso (y desarrollador de juegos frustrado) en seguida empecé a pensar en cómo se aplicaría la API de audio en un juego desarrollado en HTML5 y encontré un pequeño problema: si los juegos tienen un sonido para, por ejemplo, cada tipo de disparo, para los saltos, pasos, poderes especiales, música de fondo… unos 30 o 40 archivos de sonido, habría que hacer esa misma cantidad de llamadas al servidor para cargarlos.

Entonces pensé que pasa igual en diseño web con las imágenes y que desde hace tiempo los front-end usamos sprites, es decir, unificamos todas las imágenes en una y luego mostramos la parte que nos interesa de este gran mosaico.

Howler.js, la solución

Si algo nos enseña el método empírico, es que tras el hallazgo del problema y la formulación de la hipótesis hay que recopilar información, empezando por aquellos trabajos que similares al que estás dispuesto a emprender. Entonces encontré Howler.js, una ligera (5kb) librería de tratamiento de audio que permite manejar la API de audio HTML5 fácilmente y que permite usar el mismo concepto de Sprite en el audio.

Personalmente os recomiendo (ya lo hice en twitter) usar esta librería en los proyectos donde tengáis que usar audio.

Reproducir un sonido con Howler es sencillo:

var sonido = new Howl({
  //Cargamos los archivos en sus formatos
  urls: ['audio.mp3', 'audio.ogg']
});
//Reproducimos con el método play()
sonido.play();

Ahora bien, para usar los sprites primero los declaramos en el constructor:

var sonido = new Howl({
  //Cargamos los archivos en sus formatos
  urls: ['audio.mp3', 'audio.ogg'],
  //Indicamos el conjunto de Sprites
  sprite: {
     //ding es el nombre (trivial) que le ponemos al sprite
     ding: [0, 1000],
     //El primer valor entre corchetes corresponde con
     //el milisegundo donde comenzará el sprite
     dong: [1000, 1900]
     //El segundo valor entre corchetes corresponde a
     //la cantidad de milisegundos que durará el sprite
  }
});

Por último, para reproducir un sprite en concreto, usamos el método play pasando como valor el nombre del sprite:

sonido.play('ding');

De esta forma mejoraremos el rendimiento de nuestra web, juego o aplicación cuando tengamos que usar una cantidad media o alta de sonidos.

Ver ejemplo

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 8.4/10 (5 votes cast)

Efecto girar foto 360 grados con HTML5 y CSS3

Publicado el: 3 comentarios

Este tutorial muestra como jugando con la propiedad “background-position”, el tipo de input “range” y un poco de javascript, podemos crear efectos de giro 360º.

Partiendo del mismo concepto buscaremos dos resultados diferentes: por un lado visualizaremos una fotografía panorámica de 360º y por otro crearemos un efecto de giro alrededor de un producto.

Ver ejemplo completo

Efecto panorámica 360º

Para este ejemplo necesitaremos contar con una fotografía de 360º similar a las que usa Google Maps en su Street View.

Seguramente no tendremos a nuestra disposición una cámara que tome este tipo de fotos, así que podemos seguir el manual para hacerlo con Photomerge de Photoshop. El resultado que ofrece Photomerge es bastante bueno si cuidamos la estabilidad y la iluminación durante la toma de fotos.

Imagen panorámica 360º

Una vez tengamos nuestra foto panorámica, creamos un documento HTML5 donde sólo incluiremos un div y un input del tipo ‘range’:

<div id="imagen360"></div>
<input id='rango' type="range" max='100' min='0' value='0'>

Las etiquetas range son similares a un control slider y responde entre otras a las propiedades max, min y value:

  • max es el valor máximo que puede tomar, cuando arrastramos el manejador al tope derecho.
  • min es el valor mínimo que puede tomar, cuando arrastramos el manejador al tope izquierdo.
  • value es el valor predefinido que posicionará el manejador a lo largo de la línea de control.

Hay que tener en cuenta que por ahora Firefox no da soporte a los inputs “range”, que las muestra como tipo “text”. Es curioso que IE10 sí las muestre. Se acerca el apocalipsis.

A la capa le aplicamos el fondo con la imagen panorámica. En mi caso he procurado que el alto del div coincida con el de la imagen. Aplicamos unos estilos básicos:

#imagen360{
 background: url(./img/imagen360.jpg);
 height: 300px;
 width: 300px;
}
#rango{
 width: 300px;
}

Ahora tendremos que relacionar los cambios de estado de nuestro range con la posición del fondo mediante javascript:

var anchoImagen = 4097 - 300;
var incremento = -1 * anchoImagen / 100;

//He usado jQuery por comodidad
$('#rango').on('change', function(e){
 var posicionImagen = $(this).attr('value') * incremento + 'px 0';
 $('#imagen360').css('background-position', posicionImagen);
});

La variable anchoImagen guarda el ancho del fondo quitándole los 300px del ancho del contenedor para que no se repita al llegar al final. incremento divide entre 100 para que corresponda con los pasos (min=’0′ max=’100′) del input.

La función que se dispara cuando hacemos ‘change’ (arrastramos el manejador) va cambiando el background-position del contenedor en función del valor del atributo value.

Efecto giro de 360º alrededor de un producto

Siguiendo la misma metodología, podemos usar range y background-position para crear la ilusión de estar rotando un artículo, por ejemplo, de una tienda online.

En este caso la imagen debería estar compuesta de varias fotos del producto tomadas desde distintos ángulos a modo de secuencia de fotogramas.

Imagen giratoria 360º

El código no sería muy diferente:

#imagengira{
 background: url(./img/imagengiratoria.jpg);
 height: 207px;
 width: 350px;
}
#giro{
 width: 350px;
}
<div id="imagengira"></div>
<input id='giro' type="range" max='18' min='0' value='0'>
var anchoframe = 350;
$('#giro').on('change', function(e){
 var rotacionImagen = -1 * $(this).attr('value') * anchoframe + 'px 0';
 $('#imagengira').css('background-position', rotacionImagen);
 });

En este caso sólo le damos 18 pasos a nuestro range (min=’0′ y max=’18′) que se corresponden con los 18 fotogramas que tiene y le disminuimos el ancho del frame (350) en cada uno.

Ver ejemplo completo

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 10.0/10 (2 votes cast)

Acceder a webcam y micrófono con HTML5

Publicado el: 6 comentarios

En este artículo te expondré una de las características de HTML5 más potentes: la capacidad de acceder a dispositivos como webcam y micrófono. El ejemplo que usaré es uno de los que expuse en uno de mis seminarios y que forma parte de los ejemplos de HTML5 y CSS3 para descargar aunque explicado en detalle.

Ver ejemplo completo

Funciona 100% en Chrome

El ejemplo pretende que recojamos el audio y vídeo de nuestro dispositivo y los mostremos en un elemento video de HTML5. No es demasiado práctico pero servirá para comprender el funcionamiento. La única estructura necesaria en HTML es la siguiente:


<!DOCTYPE html>
<html>
 <head>
 <title>getUserMedia</title>
 <meta charset="utf8">
 </head>
 <body>
 <!-- En este objeto vídeo reproduciremos lo que vayamos grabando -->
 <video autoplay></video>

</body>

</html>

Acceso a dispositivos con HTML5

HTML5 nos permite acceder, siempre que el navegador lo permita, a dispositivos como webcam y micrófono a través del método getUserMedia. Antes de nada tendremos que comprobar la compatibilidad del navegador:


//Comprobamos la compatibilidad de nuestro navegador con User Media
 if (tieneUserMedia()) {
 console.log("Ok, el navegador soporta UserMedia");
 } else {
 throw new Error('Mala suerte: getUserMedia() no está soportado en tu navegador. ¿Conoces Chrome?');
 }

//Comprueba los diferentes motores que dan soporte
 function tieneUserMedia() {
 return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
 }

Como ves comprobamos que cada motor (webkit, microsoft, gecko) puede tener su propio método getUserMedia. Para evitarnos duplicar código definimos que navigator.getUserMedia sea igual al getUserMedia que exista en este navegador:

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
 navigator.mozGetUserMedia || navigator.msGetUserMedia;

Perfecto, ahora pedimos acceso al dispositivo:

</pre>
if (navigator.getUserMedia) {
 //Le pasamos un array con video y/o audio para acceder a webcam y micro respectivamente. Después una
 //función que se ejecutará a modo de callback y otra a modo de fallback.
 navigator.getUserMedia({video: true, audio: true}, exito, error);
 //Llámamos getUserMedia, pedimos acceso a vídeo. Si tenemos éxito llamamos una función y si no lanzamos un error.
 } else {
 error();
 }

Veamos en detalle la estructura de getUserMedia: “navigator.getUserMedia({dispositivo: verdadero o falso}, función en caso de éxito, función en caso de error)”

En caso de éxito la función recibe un parámetro correspondiente al stream de video/audio recibido a través de nuestros dispositivos. Nosotros lo convertiremos en un objeto URL y lo aplicaremos al atributo src de nuestro vídeo para que reproduzca:

window.URL = window.URL || window.webkitURL;

//Si soportamos getUserMedia y damos permiso, nuestro tag de video mostrará el stream que recogemos.
 //esta función recibe un parámetro que es el stream de video y/o audio recogido por los dispositivos.
 function exito(stream) {
 video.src = window.URL.createObjectURL(stream);
 }

//Nuestro error lanza un simple mensaje alert.
 function error(e) {
 throw new Error("No me dejaste mostrarte las maravillas de getUserMedia");
 }

Finalizamos creando la función para el error, ya sea porque algo salga mal o bien el usuario no de permiso a compartir el dispositivo.

Ver ejemplo completo

Funciona 100% en Chrome
VN:F [1.9.22_1171]
Valora esta entrada
Rating: 7.7/10 (6 votes cast)

Importar modelos 3D con Three.js y WebGL

Publicado el: 7 comentarios

En un artículo anterior hice una breve introducción de Three.js, la librería de Javascript creada por MrDoob que facilita el trabajo con WebGL. Vimos cómo poner a punto nuestro escenario, cámaras, luces e incluso añadimos algunos elementos básicos como cubos o esferas. En esta ocasión comparto con vosotros la forma de importar modelos 3D a nuestro escenario.

Importar modelos 3D

Dentro de los archivos que podemos descargar de Three.js en github encontraremos una serie de loaders (“cargadores”) , que nos permiten importar a nuestra escena diferentes formatos de modelos tridimensionales.

Tal vez por una costumbre heredada de mi época con Away3D, he elegido para este ejemplo el importador de modelos Collada. Collada es un formato, similar a XML al que se pueden exportar modelos creados con Sketchup, Maya o 3DStudio. Para este caso he usado un modelo de la galería 3D de Google.

La explicación de la carga del modelo está incluida en los comentarios del código:

<script type="text/javascript" src='js/jquery-1.8.2.min.js'></script>
 <script type="text/javascript" src='js/threelast.js'></script>

<!--Cargamos el Loader de Collada -->
 <script type="text/javascript" src='js/ColladaLoader.js'></script>
 <script type="text/javascript">

 

 var grados = 0;

var ancho = 800,
 alto = 600;

var angulo = 30,
 ratio = ancho / alto,
 cerca = 0.1,
 lejos = 10000;

var escenario = $('#escenario');

var miRender = new THREE.WebGLRenderer();

var miCamara = new THREE.PerspectiveCamera(angulo, ratio, cerca, lejos);

var miEscena = new THREE.Scene();

 miRender.shadowMapEnabled = true;

miCamara.position.x = 0;
 miCamara.position.y = 400;
 miCamara.position.z = 400;

miRender.setSize(ancho, alto);

eje = new THREE.AxisHelper();
 eje.scale.set(100,100,100);

escenario.append(miRender.domElement);

var material = new THREE.MeshLambertMaterial({color: 0xebebeb});

/* SUELO */

var suelo = new THREE.Mesh(new THREE.CubeGeometry(400, 20, 400), material);
 suelo.position.x = 0;
 suelo.position.y = 0;
 suelo.position.z = 0;
 suelo.castShadow = suelo.receiveShadow = true;

/* MODELO */
 var modelo;
 //Creamos el objeto ColladaLoader
 var cargador = new THREE.ColladaLoader();
 //ConvertUpAxis corrige la orientación del modelo usando el plano XZ
 //como base, en lugar del XY que por defecto usa Collada.
 cargador.options.convertUpAxis = true;
 //El método load recibe dos parámetros: la url del modelo y una función
 //que hace de callback una vez cargado.
 cargador.load('./models/laevatein.dae',
 function(collada){
 modelo = collada.scene;
 //Ajustamos la escala del elemento.
 modelo.scale.set(0.1,0.1,0.1);
 //Ajustamos la posicion
 modelo.position.set(0,0,0);
 //Lo añadimos a la escena
 miEscena.add(modelo);
 //Enfocamos la cámara hacia él
 miCamara.lookAt(modelo.position);
 $('.cargando').hide();
 //Animamos la cámara
 animar(new Date().getTime());
 });

 /* LUZ */

var luzAmbiental = new THREE.AmbientLight(0x444444);

 var luz = new THREE.SpotLight(0xFFFFFF);

luz.position.x = 0;
 luz.position.y = 400;
 luz.position.z = 400;
 luz.castShadow = true;

 miEscena.add(eje);
 miEscena.add(luz);
 miEscena.add(luzAmbiental);
 miEscena.add(miCamara);

/* Esta función sólo realiza un movimiento de
 rotación de la cámara alrededor de nuestro modelo */
 function animar(t){
 grados += 1;
 rad = grados * Math.PI/180;
 var _x = Math.sin(rad) * 400;
 var _z = Math.cos(rad) * 400;
 miCamara.position.x = _x;
 miCamara.position.z = _z;
 miRender.render(miEscena, miCamara);
 miCamara.lookAt(modelo.position);
 window.requestAnimationFrame(animar, miRender.domElement);
}
 </script>

Ver ejemplo

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 10.0/10 (1 vote cast)

Qué aprender para ser diseñador y desarrollador web

Publicado el: 3 comentarios

Mucha gente me pregunta qué debe aprender y dónde puede empezar a formarse para ser diseñadores y desarrolladores web. En este artículo intentaré resumir los perfiles profesionales, los lenguajes, los frameworks y algunos materiales gratuitos para autodidactas.

Los dos grandes perfiles: back-end y front-end

Queda muy lejos la época en la que se hablaba del webmaster como un profesional que hacía una página web de inicio a fin. En la actualidad existen múltiples perfiles que pueden intervenir en el desarrollo de una página o aplicación web, pero nos centraremos en los dos principales: el desarrollador back-end y el desarrollador front-end.

Para entender estos perfiles imaginemos un coche. El back-end se encargaría de construir el motor, la centralita, el sistema de frenos y demás elementos que hacen que el coche haga su trabajo de transportar al conductor. Por otro lado el front-end tendría crearía el chasis, salpicadero, volante, palanca de cambios? es decir, todos aquellos elementos o bien estéticos o bien de interacción por parte del nuestro usuario.

Volviendo a la web, el profesional del back-end es el que crea la lógica interna y el del front-end el que se encarga de la visualización y la interacción del usuario.

Especializarse en uno de estos dos frentes es muy importante. A no ser que seas un auténtico genio, no lograrás ser excelente en ambos y la experiencia me ha enseñado que más vale ser excelente en una cosa que bueno en muchas. Sin embargo el profesional “perfecto” conoce lo suficiente de su “opuesto” para saber las posibles limitaciones técnicas y entenderse bien con el resto del equipo.

Diseño y desarrollo web

Si tienes claro que quieres dedicarte al back-end o al front-end, puedes leer cada uno de los títulos dedicados a ello. Si aún no te decides puedes seguir leyendo con normalidad:

Quiero ser Front-end developer

Quiero ser Back-end developer

Quiero ser Front-end developer

El front-end es un experto maquetador, genio de los estilos visuales y de la interacción.

Sus habilidades primarias son el uso avanzado de semántica HTML, manejo perfecto de CSS y programación fluida con Javascript. Conocen los formatos multimedia y como optimizarlos en este medio.

Entre sus aptitudes secundarias está el diseño o incluso la animación. Tendrán también nociones de usabilidad y de tecnologías de back-end.

Entre las tecnologías recomendables, para llegar a ser un auténtico samurai, encontramos los preprocesadores de CSS como LESS, SASS o Stylus, de HTML como HAML o ZenCode y de Javascript como CoffeeScript.

Por supuesto existen frameworks como jQuery, Mootols o Backbone que nos facilitarán la vida.

Quiero ser Back-end developer

El back-end es una máquina engrasada de crear lógica.

Sus habilidades primarias son el conocimiento de diferentes lenguajes de programación de lado de servidor como PHP, Python, Ruby o incluso Javascript (sí, con javascript puedes hacer back-end con Node.js). Normalmente el desarrollador de Back-end se especializa en uno o dos de ellos. Además, tiene un profundo conocimiento de bases de datos tanto relacionales como mySQL, como no relacionales como MongoDB.

Como características secundarias están HTML y CSS, servidores y programación de lado del cliente.

Es recomendable conocer los CMSs más usados como WordPress, Joomla, Magento, Prestashop y un largo etc. usados a menudo en proyectos pequeños.

Existe un largo número de frameworks para lenguajes de back como Symfony, Zend o CodeIgniter en PHP, Rails en Ruby o Django para Python, entre un enorme etcétera.

Dónde empezar a aprender

Aparte de la enseñanza tradicional y sistematizada de la que me ahorraré mi opinión personal, existen multitud de opciones en la web para autodidactas.

Por un lado están grandes comunidades hispanohablantes de desarrollo como Maestros del Web, Cristalab, Mejorando la Web o Desarrollo Web, repletas de artículos, manuales y aportaciones de usuarios.

También existen webs con tutoriales en inglés como W3Schools donde puedes experimentar tu propio código, sitios de gran calidad como dochub.io, MDN o plataformas interactivas como Codecademy.

Por último siempre puedes acudir a la enorme blogosfera repleta de personas que te ayudarán en casos concretos con tutoriales y artículos como este.

Para más dudas y consultas podéis preguntarme en twitter.

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 9.6/10 (10 votes cast)

Hacer webs en 3D con WebGL y Three.js

Publicado el: 4 comentarios

Una de las características más novedosas de HTML5 es su capacidad para usar gráficos tridimensionales.

WebGL es la especificación que se está desarrollando para mostrar sin plugins estos gráficos 3D. Además, WebGL permite renderizar mediante aceleración por hardware.

Estamos hablando de que los navegadores pueden mover aplicaciones similares a videojuegos como Quake o programas como 3DStudio. Parece increíble… pero es una realidad.

Renderizado real con WebGL

En este tutorial haré una introducción a Three.js, una librería Javascript muy similar a Papervision3D o Away3D, para desarrollar de forma ágil y eficaz (sorprende su rendimiento) entornos tridimensionales a tiempo real y animaciones.

Podéis ver el ejemplo completo aquí.

Primeros pasos con Three.js

En primer lugar descargaremos la última versión de Three.js de Github. En el repositorio encontraremos, además de la librería, una treintena de ejemplos espectaculares.

Crearemos un proyecto HTML5 sencillo, con un index.html y una carpeta js, donde copiaremos la librería jQuery (que usaré en ocasiones por comodidad) y la última versión de three.js.

Primero definiremos un div que usaremos de contenedor y le aplicamos un poco de CSS para definir tamaño y color:

<!DOCTYPE html>
<html>
 <head>
 <meta charset='utf8'>
 <title>Experimentos 3D</title>

 <style type="text/css">
 body{
 margin: 0;
 }
 #escenario{
 background: #000;
 height: 600px;
 position: fixed;
 width: 800px;
 }
 </style>
 </head>
 <body>
 <div id="escenario"></div>
 </body>
</html>

E importamos nuestras librerías:

<script type="text/javascript" src='js/jquery-1.8.2.min.js'></script>
<script type="text/javascript" src='js/threelast.js'></script>

Editor 3D three.js

A partir de aquí es donde nace la magia.

Primero definiremos nuestro motor de renderizado y nuestra escena. Nuestro render es el que hace que se interpreten y muestren nuestros elementos tridimensionales, nuestras luces, sombras… Para definir un render de WebGL incluiremos en javascript:

var miRender = new THREE.WebGLRenderer();

También crearemos una escena. La escena es el espacio tridimensional “infinito” donde incluiremos nuestros elementos:

var miEscena = new THREE.Scene();

Por último indicamos el tamaño del render y embebemos nuestro render dentro de la capa que creamos en HTML. De esta forma Three.js generará el canvas que mostrará el contenido de nuestra infografía.

//El ancho y alto coinciden con ancho y alto de nuestro
//div contenedor
var ancho = 800,
 alto = 600;

//Aplicamos los tamaños.
miRender.setSize(ancho, alto);

//Embebemos
escenario.append(miRender.domElement);

Luces, cámara, ACCIÓN!

Lo siguiente que necesitaremos en nuestra escena es la cámara que nos muestre el contenido. Nuestra cámara tendrá mínimo 4 valores: el ángulo, el ratio de proporción, la distancia focal mínima y la máxima.

//El ángulo definirá la lejanía o cercanía con la que
//veremos nuestros objetos. El ratio es la proporción
//resultante entre ancho y alto. Cerca y lejos definen
//la distancia mínima y la máxima focal que se renderizará.
var angulo = 30,
 ratio = ancho / alto,
 cerca = 0.1,
 lejos = 10000;

//Declaramos la cámara
var miCamara = new THREE.PerspectiveCamera(angulo, ratio, cerca, lejos);

//Definimos la posición de la cámara en coordenadas x, y, z
miCamara.position.x = 300;
miCamara.position.y = 300;
miCamara.position.z = -300;

Por defecto la cámara estará mirando hacia el punto 0,0,0 de coordenadas. Podríamos enfocarla hacia cualquier otro punto usando el método lookAt que veremos más adelante.

Para agrecar la cámara al escenario usaremos el método add:

miEscena.add(miCamara);

Ahora creamos una luz que ilumine nuestros futuros objetos 3D. Existen varios tipos de luces, aunque mi favorita es la SpotLight, ya que es la única que permite usar sombras.

//Declaramos nuestra luz. Esta recibe como parámetro el color.
var luz = new THREE.SpotLight(0xFFFFFF);

//Indicamos una posición para nuestra luz en cada eje.
luz.position.x = 0;
luz.position.y = 200;
luz.position.z = 200;

//Por último la añadimos a la escena
miEscena.add(luz);

Añadiendo objetos

Hasta ahora lo único que hemos logrado es tener un bonito entorno 3D sin mucha utilidad. Deberíamos crear alguna figura básica para contemplar el resultado de nuestro trabajo. Incluiremos un cubo:

//Material es un material del tipo Lambert, con un color
//hexadecimal gris claro. Esta será la textura de nuestro
//objeto
var material = new THREE.MeshLambertMaterial({color: 0xebebeb});

//Nuestros elementos son mallas (mesh) a los que les aplicamos
//estructuras geométricas (en este caso un cubo) y un material
var cubo = new THREE.Mesh(new THREE.CubeGeometry(60, 60, 60), material);

//Posicionamos
cubo.position.x = 0;
cubo.position.y = 50;
cubo.position.z = 0;

//Y añadimos a la escena
miEscena.add(cubo);

Para finalizar nuestro ejemplo, sólo debemos ordenar a nuestro render que visualice lo que hemos creado:

//Con el método lookAt, enfocamos con la cámara al cubo

miCamara.lookAt(cubo.position);

//Aplicamos el método render incluyendo la escena y la cámara que vamos a visualizar
 miRender.render(miEscena, miCamara);

Para terminar

Aunque algunos navegadores aún no incluyen soporte a WebGL, está claro que el 3D se va acercando cada vez más al mundo de la web. La posibilidad de usar estos gráficos sin tener que instalar plugins adicionales (como flash, unity o silverlight) es algo realmente bueno.

Podéis ver un ejemplo completo aquí (recomiendo usar Chrome) y no dudéis en consultar cualquier duda en los comentarios o en @ajnavajas

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 8.3/10 (3 votes cast)

Dibujar en canvas HTML5 compatible con tablets y smartphones

Publicado el: 10 comentarios

Hace bastante tiempo encontré un fabuloso artículo en la web de William Malone que enseñaba un script para crear una especie de “paint” con canvas y HTML5. Aunque es cierto que el script no es óptimo (iba guardando puntos y los redibujaba innecesariamente tras cada evento), me surgió un proyecto para un cliente  y en esencia este script cumplía ese objetivo.
Leer entrada completa

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 10.0/10 (3 votes cast)

Seminario HTML5 gratis

Publicado el: 3 comentarios

El próximo día 27 de septiembre impartiré un nuevo seminario gratuito de HTML5 en Córdoba. Una vez más el Grupo Alcántara lo hará posible con su apoyo e infraestructura. Hablaremos sobre semántica, multimedia, acceso a dispositivos, CSS, gráficos vectoriales, geolocalización y todo lo que hace de HTML5 un conjunto de tecnologías increíbles para crear la web.

Para todos aquellos que quieran asistir contactad con instituto@grupoalcantara.es. Las plazas son limitadas pero se emitirá online. Más info próximamente.

Actualización 25 septiembre 2012:

Finalmente el seminario se impartirá en el Instituto Alcántara, C/ Cruz Conde 19 1ª planta, y se podrá ver online a través de Webex.com.

Duración aproximada de 4 horas. la hora de inicio será:

  • 17:45 Madrid
  • 10:45 Bogotá – México – Lima
  • 11:45 Santiago de Chile – Caracas
  • 12:45 Buenos Aires

Trataremos de realizar grabación del evento para su posterior publicación.

Cartel Seminario Gratuito HTML5 en Córdoba

Cartel del seminario

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 10.0/10 (2 votes cast)

Sublime Text 2 – El mejor editor de código de 2012

Publicado el: 6 comentarios

Algo que nos caracteriza a los programadores es nuestro cariño por nuestro editor de código. Una vez te acostumbras a uno es como tu almohada: cuesta mucho cambiarla por otra.

Sin embargo debido a la buena crítica de la comunidad, recientemente instalé Sublime Text 2, el que según la opinión es el mejor editor de código del mercado. Tan buenas han sido mis impresiones que he decidido aparcar mi querido Komodo Edit y, como cientos de bloggers antes que yo, le voy a dedicar este artículo.
Leer entrada completa

VN:F [1.9.22_1171]
Valora esta entrada
Rating: 10.0/10 (3 votes cast)