miércoles, 24 de agosto de 2011

Rehacer - Deshacer en javascript

En este tutorial intentaré explicar la forma de implementar la funcionalidad de deshacer y rehacer, una característica muy usada en los programas de escritorio y que muchas aplicaciones web no tienen (y hace mucha falta ya que errar es de humanos).
Descargar código
La idea consiste en tener objetos que representen las acciones (mover, eliminar, resaltar...), los cuales deben guardar el estado anterior del objeto afectado.
ChangeColorCommand = function(obj, color) {
  this.obj = obj;
  this.new_color = color;

  // guardar estado anterior
  this.prev_color = obj.style.backgroundColor;
}
		
ChangeColorCommand.prototype.execute = function() {
  this.obj.style.backgroundColor = this.new_color;
}
		
ChangeColorCommand.prototype.undo = function() {
  this.obj.style.backgroundColor = this.prev_color;
}
Cada objeto cuenta con dos métodos
  • execute: ejecuta la acción (dah)
  • undo: deshace la acción valiéndose de los datos guardados previamente en el constructor.
Las acciones son administradas por un objeto que mantiene dos pilas de acciones: las que se pueden deshacer y las que se pueden rehacer:
  • cuando ejecuta una acción, la guarda en undo_stack y borra toda acción que se podía rehacer
  • cuando se deshace algo, saca el ultimo objeto de la pila undo_stack, ejecuta el método undo y guarda la acción en la pila redo_stack.
CommandManager = function(max_undo) {
  // máxima cantidad de acciones guardadas
  max_undo = max_undo || 30;  

  // pilas de acciones
  this.undo_stack = [];
  this.redo_stack = [];

  // ejecutar comando cmd
  this.executeCommand = function(cmd){
    cmd.execute();

    // si se sobrepasa cantidad de acciones
    // eliminar primer elemento
    if (this.undo_stack.length >= max_undo) {
      this.undo_stack.shift();
    }
    this.undo_stack.push(cmd);
    this.redo_stack = [];
  }

  // deshacer acción 
  this.undoCommand = function() {
    var cmd = this.undo_stack.pop();
    
    // si existe acción
    if ( cmd ) {
      cmd.undo();
      this.redo_stack.push(cmd);
    }
  }
}
Para realizar una acción creamos una instancia del objeto apropiado y la pasamos al CommandManager (previamente creado).
var UndoRedo = new CommandManager(),
    box = document.getElementById("box");

// cambiar color a rojo
UndoRedo.executeCommand(new ChangeColorCommand(box, "red"));

// cambiar color a verde
UndoRedo.executeCommand(new ChangeColorCommand(box, "green"));

// cambiar de verde a rojo
UndoRedo.undoCommand();

// cambiar de rojo a blanco
UndoRedo.undoCommand();
Ahora solo resta crear mas acciones (mover, negrita, itálica...) dependiendo de la aplicación que estemos desarrollando.

Eso es todo, espero les haya servido; si tienen alguna duda o critica no duden en dejarla en los comentarios.

miércoles, 13 de julio de 2011

Objetivos

Luego de participado en el campus party, me di cuenta de mi total desconocimiento en temas importantes en la computación, por ejemplo en el desafió de desarrollo con solo saber un algoritmo de búsqueda, habría logrado un mejor puesto. Así que a partir de ahora pienso estudiar - y practicar - algunos temas mas "profundos", en lugar de solo centrarme en el desarrollo web y uso de frameworks, así como por el momento centrarme en aprender python y dejar de lado C.

viernes, 24 de junio de 2011

Rumbo a campus party

¿Como? ¿que voy a campus party gratis?
Pues eso, por fin puedo ir a campus party y lo mejor de todo: gratis. iré en representación del SENA Vichada a hacer una presentación de canvas-event, la noticia me sorprendio tanto que solo lo creí hasta el día que fui a comprar los boletos de avión.

P.D.: Estaré publicando en twitter lo que me parezcan importantes.

miércoles, 15 de junio de 2011

No soy picado ni raro, soy introvertido

Andando por la web me encontré este interesante articulo, en donde se desmienten algunos de los mitos que se tienen sobre las personas introvertidas, está en perfecto ingles, pero luego de algo de búsqueda encontré una traducción decente.

La verdad me parece muy acertado todo, pero resalto los siguientes puntos:

Mito #1 - A los introvertidos no les gusta hablar
Esto no es cierto. Es solo que los introvertidos no hablan a menos que tengan algo que decir. Odian la charla. Haz que un introvertido se ponga a hablar acerca de algo que le interesa, y no se callará por días

Mito #2 - Los introvertidos son tímidos
La timidez no tiene nada que ver con ser un introvertido. A los introvertidos no necesariamente les asusta la gente. Lo que necesitan es una razón para interactuar. No interactúan solo por interactuar. Si quieres hablar con un introvertido, solo empieza a hablar. No te preocupes por ser educado.

Mito #6 - Los introvertidos siempre quieren estar a solas
Los introvertidos están perfectamente cómodos con sus propios pensamientos. Piensan mucho. Sueñan despiertos. Les gusta tener problemas en los cuales trabajar, rompecabezas que resolver. Pero también pueden sentirse increiblemente solos si no tienen a nadie con quién compartir sus descubrimientos. Ansían una conexión auténtica y sincera con UNA PERSONA a la vez

Mito #7 - Los introvertidos son extraños
Los introvertidos suelen ser individualistas. No siguen a la multitud. Preferirían ser valorados por sus maneras originales de vivir. Piensan por sí mismos y, por ello, frecuentemente desafían las normas. No toman la mayoría de las decisiones basadas en lo que es popular o está de moda.

Mito #9 - Los introvertidos no saben cómo relajarse y divertirse
Los introvertidos típicamente se relajan en casa o en la naturaleza, no en lugares públicos concurridos. Los introvertidos no son buscadores de emociones fuertes ni adictos a la adrenalina. Si hay mucha charla y ruido, se encierran. Sus cerebros son muy sensibles al neurotransmisor llamado dopamina. Los introvertidos y los extrovertidos tienen diferentes vías neuronales dominantes. Simplemente consúltalo.

Mito #10 - Los introvertidos pueden arreglarse a sí mismos y volverse extrovertidos
... hay todavía abundantes técnicas que un extrovertido puede aprender para interactuar con un introvertido. (Sí, puse al revés esos dos términos a propósito para mostrarte cuán parcializada está nuestra sociedad). Los introvertidos no pueden "arreglarse a si mismos" y merecen respeto por su temperamento natural y contribuciones a la raza humana...

Como ven, los introvertidos no somos picados o raros por el hecho de no hablar mucho ni salir de rumba, es simplemente que como a todos, hay cosas que no nos llenan.

jueves, 28 de abril de 2011

Personas que me desagradan

El titulo del post puede parecer fuerte, pero esto tengo de decirlo o sino exploto, hay cierto tipo de personas que me desagradan y últimamente me encuentro con muchos de ellos:
  • Los que no aceptan estar equivocados: esas personas que ni aun con pruebas en la mano de que lo que están diciendo es un completo disparate aceptan la corrección, realmente no entiendo a este tipo de personas ya que equivocarse es necesario para aprender y mejorar.
  • Los que menosprecian a los demás: esas personas que creen que son mas que los demás, especialmente los que porque saben algo tratan a los demás como estúpidos que no pueden llegar a tener el "vasto" conocimiento que ellos poseen, tal vez no se acuerdan que ellos en un momento también fueron novatoz.
  • Los que quieren que les den todo mascadito: esas personas que quieren las respuestas mas no aprender, no estoy en contra de los que preguntan, estoy en contra de los que quieren que les hagan el trabajo, por ejemplo: "necesito hacer X pero no se, alguien puede darme el código para poder hacerlo", se ve que al tipo le importa un comino aprender,  y: "no se realizar X, alguien podría decirme como lo puedo realizar", se nota que quiere aprender.
Listo, lo dije, Ahora me siento mas liberado.

viernes, 15 de abril de 2011

Beta 2 de canvas-event disponible

Ya esta disponible la beta 2 de canvas-event, esta revisión cuenta con algunas mejoras y corrección de errores como:
  1. Posibilidad de adicionar una función a varios eventos simultáneamente
  2. Las figuras dibujadas dentro de un manejador de eventos ahora si se visualizan
  3. Los Objetos Line ahora también pueden ser arrastrados
  4. Los bordes redondeados ahora también funcionan en Opera
Espero que les sea tan útil como lo ha sido para mi.

lunes, 24 de enero de 2011

script: descarga automática de Megaupload

Aprovechando que estoy aprendiendo a programar en bash y que megaupload ahora no requiere llenar ningún captcha para realizar las descargas, decidí rescribir el anterior script (escrito en python) y agregarle nuevas características.

Ahora es posible indicar una URL (con la opcion -c) y el script extrae los links de Megaupload que encuentre, me parece una funcionalidad muy conveniente ya que con el anterior script era necesario copiar a mano todos los links a un archivo de texto, lo cual puede ser muy tedioso.

Otra funcionalidad es la de usar la dirección ip de los servidores para realizar las descargas, esto ayuda a saltarse algunos proxies que están configurados para bloquear paginas por nombres de dominio en lugar de direcciones ip XD.

El script ha sido probado con Ubuntu 10.10 que es el OS que uso actualmente, pero no creo que tengan problemas usándolo en otra distro, siempre y cuando tenga instalado wget que es el programa que usa para realizar las descargas.

Pueden descargarlo del siguiente enlace:
Luego le damos permisos de ejecución y lo copian en el directorio bin:
novatoz@sney2002:~$ chmod +x mget
novatoz@sney2002:~$ sudo cp mget /bin/
Espero les sea de utilidad, y si tienen alguna inquietud o sugerencia no duden en dejarla en los comentarios.

update: corregido error que impedía descargar archivos cuyos nombres contuvieran  caracteres no ascii, los cuales están codificados usando html entities, ejemplo:
# este link no apunta a ningún archivo
http://www465.megaupload.com/files/f4f4ab2163558f1f/Capacitación.mp4
# el link es valido al cambiar ó por ó
http://www465.megaupload.com/files/f4f4ab2163558f1f/Capacitación.mp4
ahora es necesario tener instalado w3m
 
© 2009 NovatoZ. All Rights Reserved | Powered by Blogger
Design by psdvibe | Bloggerized By LawnyDesignz