Lecciones aprendidas

Andando por hacker news (hago muy frecuente), encontré un interesante desafió de instagram, que consiste en crear un programa que tome una imagen cortada en tiras y la “reconstruya”. leyendo los comentarios parece que para otros era algo trivial, pero para mi era todo un reto y una oportunidad de poner en practica conceptos aprendidos en alguna lecturas.

Durante el proceso de resolver este problema, aprendí varias cosas:

Estudiar siempre nuevos algoritmos, herramienta, librerías…, no intentando memorizar o convertirse en un “experto”. Basta con entender los conceptos aplicados y hacer algunas practicas. lo esencial es tener la capacidad de asociar estos conocimientos con nuevos problemas, ya luego podremos retornar y re-estudiarlos en el momento que los necesitemos.

Nunca compararnos con otros, al compararnos con otra persona pueden ocurrir dos cosas:

  • Nos frustramos pensando que no podremos llegar a ser tan buenos como EL(LA).
  • Dejemos de avanzar al creernos superior a otros y pensar que con lo que sabemos es suficiente, recordemos que somos novatoz.

Por otro lado al comparamos con nosotros mismos, veremos lo que realmente hemos avanzado: hace unos dos años no entendía ni el funcionamiento de un loop while, y hoy puede resolver un puzzle que aunque trivial para otros, para mi era como escalar el Everest.

Esto nos lleva a otro punto: Asumir retos, si nos quedamos auto contemplando lo bien que hacemos una tarea, no avanzamos, debemos desafiarnos. puede que fracasemos, pero esto no quiere decir que no aprendimos. Siempre aprendemos y lo hacemos mas de los errores que de los triunfos, si fracasamos, creemos una lista con las causas y usémosla como temas a estudiar.

Bueno eso es todo (creo), has tenido una “revelación” como esta. compártela los comentarios.

ConceptMapp – webapp para crear mapas conceptuales

Después de varios meses de posponerlo, por fin esta disponible mi primera aplicación web: ConceptMapp, una herramienta para la creación de mapas conceptuales completamente gratis.

La idea nació luego de estar experimentando con el elemento canvas, entonces me acorde de Cmaptools, uno de los mejores programas que he utilizado para crear mapas conceptuales, pero que a mi parecer tiene los siguientes inconvenientes:

  • Consume muchos recursos.
  • No es muy común: no se puede esperar encontrarlo instalado en otros computadores diferentes al personal, lo que impide realizar cambios cuando mas se necesitan.

Con ConceptMapp intento resolver estos problema, permitiendo acceder y editar mapas conceptuales desde cualquier computador con un navegador web moderno (a.k.a no ie <= 8) y una conexión a Internet, ademas de ser liviano*.

Si les parece útil, encuentran algún error o tienen sugerencias pueden dejarlas en los comentarios o usando el formulario de contacto.

* Probado en un PC de: 1 GB de RAM con procesador de 1.8 GHz.

mget ahora para windows

Actualización: se incluyeron las dependencias del wget que faltaban, que pena u_u.

Un amigo me pidió que le pasara el programa con el que descargo de megaupload, pero en cuanto le dije que tenia que:

  1. Descargar e instalar python 2.6.
  2. Descargar e instalar wget para Windows.
  3. Poner los directorios de wget y python en el PATH de Windows.
En seguida se desanimo (no se por que XD), así que me pase toda una tarde mejorando un poco el programa e intentando convertirlo en un ejecutable usando pyinstaller y he aquí el resultado:
Basta con descomprimir los archivos en la carpeta windows y a descargar de megaupload. Lo probé en varias maquinas con Windows XP y funciono correctamente, pero si tienen algún problema no duden en dejarlo en los comentarios.
Su uso es muy sencillo, abren la consola de comandos y:
mget -c url-con-link-de-megaupload

mget -i archivo-con-links

mget link1 link2 link3 ...

Para una próxima explico como fue lo de convertir el script en ejecutable, algo muy util para compartir los programas que hagamos con amigos.

Pueden seguirme en twitter o agregarme en Google+

Me decepciona el estudio

Viendo a mi hermano desesperado intentando grabarse un montón de formulas porque el día siguiente tenia una evaluación, me dí de cuenta que el sistema de “enseñanza” es una perdida de tiempo, los profesores no se preocupan por estimular a los estudiantes a aprender, sino por embutirles información. La única “motivación” que se tiene es la de pasar al siguiente curso.

Recuerdo cuando estaba estudiando que aunque era muy bueno para el álgebra y la geometría, realmente no le veía mucha utilidad practica y luego de pasar la nota dejaba de estudiar, ya que no me interesaba profundizar el tema.

Creo que la educación mejoraría si en lugar de hacer que los alumnos memoricen una gran cantidad de información, se hace que éstos ganen interés en el tema a estudiar.

Por ejemplo: matemáticas – promedios. En la escuela vi promedios alrededor del 6 grado. fuera de hacer muchos ejercicios como el promedio de edades, precios… cosas que a alguien de esa edad no le hacen mucha gracia. pero que tal si se muestra algo interesante (para un niño). por ejemplo como gracias a los promedios se puede convertir una fotografía a color en una a blanco y negro.

tal vez alguien diga que es algo muy complicado para explicar a un estudiante de 6 grado, pero el objetivo es hacer que éste diga: “WOW las matemáticas son una bacaneria” y entonces se interese realmente en aprender y no solo en ganar el año.

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 &amp;gt;= 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.