"Ecotower" y "La épica aventura", proyectos del taller de programación de videojuegos en M Montessori

Ecotower y La épica aventura

Ecotower (izquierda) y La épica aventura (derecha).

Durante los últimos 3 meses estuve impartiendo por parte de El Garage el taller de programación de videojuegos a niños de primaria y secundaria del colegio M Montessori. En el taller, estuvimos utilizando Scratch, Pico-8, TIC-80 y Makey Makey para realizar distintos proyectos con los que se buscaba aprender las bases de la programación.

El final de este curso (y de muchos otros talleres de El Garage) coincidió con el Cruce 2PM, que es un evento que, en sus propias palabras, es «el punto de encuentro de ideas, cultura, innovación, tecnología, emprendimiento en la región noroeste», por lo que se organizó un concurso en el que se invitó a participar a todos los niños que toman talleres impartidos por El Garage.

El concurso se llamó "Bring a Solution" y consistió en que los niños aplicaran lo que habían aprendido en sus talleres para crear un prototipo funcional que resolviera una problemática local dentro de los temas de medio ambiente, identidad, espacio público y hogar.

Los proyectos que se presentaron fueron muy interesantes, sobre todo porque los talleres que El Garage imparte son muy variados (Robótica, Makey Makey, Crafts, Diseño en 3D, Programación, entre otros), lo que provocó que hubieran prototipos muy diferentes.

Por mi parte, hubo cuatro prototipos dentro del taller que impartí:

  1. La épica aventura: un juego hecho con Pico-8 que te enseña sobre el desarrollo sustentable. Tienes manzanas que sirven para comer y para lanzarlas como proyectiles a los enemigos, pero son un recurso que se acaba, por lo que debes también plantarlas y regarlas para poder sobrevivir.
  2. Regado plantero: un regador de plantas inteligente que utiliza Makey Makey, un sensor de flujo de agua y un programa hecho con Scratch para recordarte que debes regar tus plantas y decirte exactamente cuanta agua debes de usar.
  3. Ecotower: un juego estilo tower defense hecho con Pico-8 en el que debes combatir la contaminación colocando "torres" (que son árboles, botes de reciclaje o el sol) para acabar con el dióxido de carbono, la basura, o la contaminación en el agua. Éste proyecto ganó el segundo lugar en el concurso.
  4. Lock: una alarma para casas inteligente, hecha con Scratch y Makey Makey, que te avisa cuando alguien abre una puerta o ventana y puedes personalizar los sonidos que produce.

Debido a que Lock y Regado Plantero necesitan hardware especial para funcionar, no se los puedo mostrar por este medio, pero sí pueden jugar los dos juegos de video:

  • Jugar Ecotower (Utiliza las flechas para mover el seleccionador y presiona Z para colocar una torre o cambiarla).
  • Jugar La épica aventura (Utiliza las flechas para mover al personaje, presiona Z para plantar un árbol, tomar agua del pozo, regar un árbol seco, o comer en la mesa y presiona X para lanzar una manzana).

La verdad, me parecieron excelentes proyectos los que realizaron los niños, y no lo digo sólo porque a estos yo les impartí el taller, casi todos los participantes hicieron un gran trabajo. Pueden ver fotografías de los demás proyectos en la página de Facebook de El Garage.


Problemas de la entrevista con Microsoft

Microsoft

A finales del noviembre pasado fui a la Ciudad de México a realizar cuatro entrevistas en las oficinas de Microsoft, con el fin de participar en un internship que se llevará a cabo el próximo verano. Varios conocidos me han preguntado sobre los problemas que me pusieron en las entrevistas, por lo que he decidido escribir este post.

Los problemas podían resolverse en cualquier lenguaje, pero sin utilizar nada que no estuviera en la librería estándar de C, por lo que decidí resolverlos en éste.

Intentaré que el código que ponga aquí se parezca lo más posible a lo que contesté durante las entrevistas, pero como programé en papel, probablemente se me pasaron unos cuantos errores de sintaxis, o algún error tonto de lógica.


Problema 1: Árboles binarios de búsqueda

El primer entrevistador era de nacionalidad hindú y trabajaba en el equipo de actualizaciones, tanto de Windows como de Xbox.

Comenzó preguntándome un poco de teoría de estructuras de datos: ¿qué es un árbol binario?, ¿cuál es la diferencia entre un árbol binario y un árbol binario de búsqueda?, y otras preguntas similares. Ya que contesté las preguntas, me puso el siguiente problema:

Implementa una función que convierta un arreglo en un árbol binario de búsqueda.

struct node {
  int value;
  struct node *left;
  struct node *right;
};

void insert_value(struct node *root, int value) {
  struct node *current = root;
  int found = 0;
  while(!found) {
    if(value <= current->value) {
      if(current->left == NULL) {
        found = 1;
        current->left = malloc(sizeof(struct node));
      }
      current = current->left;
    } else {
      if(current->right == NULL) {
        found = 1;
        current->right = malloc(sizeof(struct node));
      }
      current = current->right;
    }
  }
  current->value = value;
}

struct node *array_to_tree(int *array, int len) {
  struct node *root;
  if(len >  0) {
    root = malloc(sizeof(struct node));
    root->value = array[0];
    for(int i = 1; i < len; i++) {
      insert_value(root, array[i]);
    }
  }
  return root;
}

Una vez terminada mi tarea, añadió un poco más de dificultad a ésta:

Implementa una función que permita eliminar un valor del árbol.

void insert_tree(struct node *root, struct node *to_insert) {
  if(to_insert != NULL) {
    insert_value(root, to_insert->value);
    insert_tree(root, to_insert->left);
    insert_tree(root, to_insert->right);
    free(to_insert->left);
    free(to_insert->right);
  }
}

struct node *delete_value(struct node *root, int value) {
  struct node *current = root;
  struct node *parent = NULL;
  while(current->value != value) {
    if(value < current->value && current != NULL) {
      parent = current;
      current = current->left;
    } else {
      parent = current;
      current = current->right;
    }
    if(current == NULL) return root;
  }
  if(parent != NULL) {
    if(parent->left == current) {
      parent->left = NULL;
    } else {
      parent->right = NULL;
    }
    insert_tree(parent, current->left);
    insert_tree(parent, current->right);
  } else {
    if(current->left != NULL) {
      root = current->left;
      parent = current->right;
      current->right = NULL;
      insert_tree(root, parent);
    } else if(current->right != NULL) {
      root = current->right;
      parent = current->left;
      current->left = NULL;
      insert_tree(root, parent);
    }
  }
  return root;
}

Los problemas de este entrevistador fueron bastante sencillos, muy teóricos, supongo que sólo estaba probando mi conocimiento sobre estructuras de datos.

Problema 2: Invertir palabras

Implementa una función que, dada la cadena "I love Mexico City, and I love to code", la convierta en "I evol ocixeM ytiC, code to love I and".

La segunda entrevistadora también era de origen hindú y trabajaba en el equipo de Bing.

Éste creo que fue el problema más truculento, porque la entrevistadora quería cierto nivel de eficiencia, o sea, que no recorriera la cadena varias veces. Me tomó bastante rato darme cuenta de que si volteaba cada palabra de la oración como lo pide antes de la coma

I evol ocieM ytiC, dna I evol ot edoc

y luego volteaba toda la oración a partir de la coma, quedaría la cadena buscada

I evol ocieM ytiC, code to love I and

Una vez notado ésto, fue sencillo programar la función:

void reverse(char string[], int len) {
  int comma_i = 0;
  int last_space = -1;
  char b;
  for(int i = 0; i <= len; i++) {
    if(string[i] == ' ' || string[i] == ',' || i == len) {
      for(int j = i - 1; j > (last_space + i) / 2; j--) {
        b = string[j];
        string[j] = string[last_space + i  - j];
        string[last_space + i - j] = b;
      }
      last_space = i;
      if(string[i] == ',') comma_i = i;
    }
  }

  for(int i = len - 1; i >= comma_i + 2 + (len - comma_i - 1) / 2; i--) {
    b = string[i];
    string[i] = string[comma_i + len + 1 - i];
    string[comma_i + 1 + len - i] = b;
  }
}

Problema 3: Bolsa de valores

Implementa una función que, dado un arreglo de 24 números que representan el valor de una acción a lo largo de las 24 horas del día, retorne las horas de compra y venta óptimas para obtener la mayor ganancia.

La tercera entrevistadora era originaria de Ucrania y trabajaba en varios productos relacionados con cloud computing, entre ellos Azure.

Este problema también requirió que pensara un rato para idear la manera eficiente de recorrer el arreglo.

int *shares(double values[]) {
  static int result[2] = {0,1};
  int local_l = -1;
  for(int i = 2; i < 24; i++) {
    if(values[i] < values[result[0]]) local_l = i;
    if(values[i] > values[result[1]]) {
      result[1] = i;
      if(local_l > result[0]) result[0] = local_l;
    }
  }
  if(values[result[0]] >= values[result[1]]) return NULL;
  return result;
}

Problema 4: Fechas

Implementa una función que, dado el string "12/10/2016", retorne "December 10, 2016".

El último entrevistador era de Turquía y trabajaba en Windows Defender.

Este problema me pareció super sencillo cuando me lo explicaron y comencé a "resolverlo" de inmediato, hasta que se me ocurrió preguntar si debía validar el string ingresado y me dijeron que sí, lo que aumentó un poco de dificultad, pero nada del otro mundo.

char *months[] = {"January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"};

struct date {
  int day;
  int month;
  int year;
};

int is_leap_year(int y) {
  if(y % 4 != 0) return 0;
  else if(y % 100 != 0) return 1;
  else if(y % 400 != 0) return 0;
  else return 1;
}

int is_valid_month(int m) {
  if(m >= 1 && m <= 12) return 1;
  return 0;
}

int has_valid_format(char date[]) {
  if(strlen(date) == 10) {
    if(
        isdigit(date[0]) && isdigit(date[1])
        && date[2] == '/'
        && isdigit(date[3]) && isdigit(date[4])
        && date[5] == '/'
        && isdigit(date[6]) && isdigit(date[7]) && isdigit(date[8]) 
        && isdigit(date[9])
      ) return 1;
  }
  return 0;
}

int c_to_i(char c) {
  return c - 48;
}

struct date *string_to_date(char datestr[]) {
  struct date *d = malloc(sizeof(struct date));
  d->month = c_to_i(datestr[0]) * 10 + c_to_i(datestr[1]);
  d->day = c_to_i(datestr[3]) * 10 + c_to_i(datestr[4]);
  d->year = c_to_i(datestr[6]) * 1000 + c_to_i(datestr[7]) * 100
    + c_to_i(datestr[8]) * 10 + c_to_i(datestr[9]);
  return d;
}

int is_valid_day(struct date *d) {
  if(d->day < 1) return 0;
  switch(d->month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
      if(d->day <= 31) return 1;
      break;
    case 4: case 6: case 9: case 11:
      if(d->day <= 30) return 1;
      break;
    case 2:
      if(d->day <= 28) return 1;
      if(is_leap_year(d->year) && d->day == 29) return 1;
      break;
  }
  return 0;
}

int is_valid_date(struct date *d) {
  if(is_valid_month(d->month) && is_valid_day(d)) return 1;
  return 0;
}

char *convert_date(char date[]) {
  static char new_date[18] = {0};
  if(has_valid_format(date)) {
    struct date *d = string_to_date(date);
    if(is_valid_date(d)) {
      sprintf(new_date, "%s %d, %d", months[d->month - 1], d->day, d->year);
      free(d);
      return new_date;
    }
    free(d);
  }
  return NULL;
}

Una semana más tarde, me enviaron un correo electrónico avisándome que había pasado las entrevistas y me ofrecían un empleo de verano en Seattle, Washington, específicamente en el equipo de Bing.

MS Interview Results


We Can Code Hackathon Ensenada 2016

We Can Code Hackathon 2016

Este fin de semana pasado, asistí por tercer año consecutivo al We Can Code Hackathon, organizado por la empresa Advancio en la ciudad de Ensenada, Baja California. A diferencia de los años pasados, en esta edición no había temas en específico, sólo programar algo cool.

Salimos de Mexicali a las 10:00, por lo que llegamos muy temprano a Ensenada (el registro comenzaba a las 17:00) y tuvimos tiempo de visitar a un amigo que estudia su maestría en el CICESE, y echarnos unas cheves en la playa

Cheves en la playa

con el objetivo de alcanzar el pico de Ballmer antes del hackathon, por supuesto.

A las 17:00 llegamos a la cede del evento, que era en el campus de CETYS Universidad, y como ya era tradición de años pasados, no teníamos ni idea de qué era lo que íbamos a hacer.

Varios integrantes del equipo habíamos leído sobre los WebTorrents en los últimos días y teníamos ganas de utilizarlos, así que de ahí partió la idea para desarrolla VideoWatch.Me (probablemente el link no sirva en el momento que lean este post).

VideoWatch.me

La idea de nuestro proyecto es un sitio web para compartir videos de forma distribuída.

YouTube, por mencionar un ejemplo, ha tenido últimamente problemas con sus usuarios, por sus EULAs restrictivos, la manera en que censuran videos que contienen propiedad intelectual de terceros (muchas veces bajo fair use), o sus políticas de no permitir a los creadores ganar dinero con sus videos si estos presentan ciertas temáticas. Sin embargo, la posición de esta plataforma es entendible: ellos hospedan los videos de sus usuarios, por lo que podrían llegar a tener problemas legales por el contenido de estos.

En VideoWatch.Me no existe tal problema, pues nosotros no hosteamos los videos, sino simplemento los magnet links. De hecho, nadie en particular tiene los videos en el sentido tradicional, pues estos se descargan de las computadoras de todos aquellos que lo estén viendo.

Otra ventaja del servicio es que no habría que esperar a que el video se "subiera" a la plataforma, sino que éste estaría listo para ser consumido desde el momento en que el creador lo decidiera.

Nos divertimos mucho creando este proyecto, aunque también tuvimos nuestros momentos de estrés. Al final se podría decir que "medio funcionó", porque nunca entendimos por qué dejaba de funcionar de repente.

El código está en GitHub (lo sentimos por el cochinero, es culpa de la desesperación).

A diferencia del año pasado, no ganamos ningún puesto ahora, pero por lo menos el tercer lugar se vino a Mexicali, con unos amigos de El Garage que hicieron un "bastón inteligente" para ciegos. Tendremos que pedirles la revancha el año que entra 😉.


¡Feliz día del programador!

Code Monkey

[javierrizzo@Kamino ~]$ node
> Math.round((new Date() - new Date(2016, 0, 0)) / (1000 * 60 * 60 * 24));
256

El día de hoy es el ducentésimo quincuagésimo sexto (256) día del año, que es lo mismo que 28, o la cantidad de números que se pueden representar con un byte. Por eso es que hoy es el día del programador. Esta fecha normalmente se celebra el 13 de septiembre, pero como este año es biciesto, se recorre un día.

Como el 256 es el número FF en hexadecimal, el día se celebra usando una camisa azul (0000FF en RGB Web) o blanca (FF en muchos sistemas de 256 colores). Pero además de esto, hay muchas otras formas de celebrar, como

Muchos opinan que, en este día, los programadores debemos tomarnos un tiempo para reflexionar sobre lo que hemos aprendido o desarrollado referente a la programación en el año que ha pasado.

Por mi parte, empecé a trabajar como freelancer en Skyworks Inc. y como becario en el área de informática de CETYS Universidad. Los lenguajes que más he utilizado para proyectos personales son JavaScript y Haxe, mientras que para el trabajo es C#. Asistí a dos hackathones, y en menos de un mes asisitiré a otro más. También he tratado de difundir un poco mi gusto por la programación, con talleres de programación, electrónica y licencias libres en El Garage Project Hub.

Además de vestirme de azul, me uniré a la celebración programando en el trabajo, y usando una computadora vieja (necesaria para las prácticas de la clase de Diseño de Interfaces). ¿Tú cómo piensas celebrarlo?


Verano Innovador SkyKids

Verano Innovador SkyKids

Esta semana (y la siguiente) se lleva a cabo el "Verano Innovador SkyKids", donde El Garage da cursos de varios temas de innovación y tecnología a niños hijos de empleados de Skyworks Inc.

Yo estoy encargado de dar uno de los cursos de electrónica con Arduino. Para este tipo de talleres (niños + Arduino) me gusta utilizar Scratch 4 Arduino, en vez del Arduino IDE, porque resulta más intuitivo para los niños y al mismo tiempo enseña la lógica de la programación.

El pasado miércoles el taller trató sobre las bases de la electricidad (resistencias, LEDs, protoboard, multímetro, voltaje, etc.), hoy viernes trató sobre las bases de la programación (Scratch) y la siguiente semana será juntar ambas para realizar proyectos con Arduino.

Los niños se divirtieron mucho en el taller de hoy, aprendiendo a programar al crear su propio videojuego, y me pidieron que pusiera sus juegos en mi sitio web.

Y como lo prometido es deuda, aquí están los juegos hechos por los "SkyKids".


#JamForLeelah: Un game jam en pro de la comunidad LGBTIQ

Nota: Esta entrada fue publicada el 19 ene de 2015 @ 15:40 en un blog que tenía anteriormente en Wordpress, y republicada aquí para el record.


#JamForLeelah

Leelah Alcorn era una muchacha transgénero (hombre a mujer) de 17 años que, lamentablemente, eligió quitarse la vida el pasado 27 de diciembre (dejando una nota suicida en su página de Tumblr). Ella tomó esta decisión debido a que sus padres (fervientes cristianos) no apoyaron su identidad de género: la sacaron de la escuela, le prohibieron el contacto con sus amigos y la forzaron a tomar "terapia de conversión". Estas terapias, que son un lavado de cerebro que intenta cambiar la identidad de género o la orientación sexual, son reconocidas como causas de angustia para quienes son sometidos a estas, que normalmente son jóvenes menores de edad obligados por padres que no los apoyan. Muchos consideramos estas prácticas como abuso infantil, pues obviamente conllevan a graves consecuencias psicológicas, y sin embargo son legales en muchos países.

#JamForLeelah tiene el objetivo de crear consciencia sobre este tipo de problemáticas, no solamente para los transgénero, sino para toda la comunidad LGBTIQ. Como Leelah estaba muy interesada en el desarrollo de videojuegos, a los organizadores les pareció oportuno crear un game jam.

El jam tiene 3 simples reglas:

  • Estar centrado en cuestiones de identidad de género, obviamente de forma respetuosa.
  • Usar inspiración del arte, la música, o las ideas de Leelah.
  • Y ser inspirado en los intereses de Leelah, publicados en su Tumblr.

Además de apoyar creando un juego, puedes ayudar firmando las peticiones para crear la Leelah's Law (aquí y aquí), ley que podría llegar a prohibir la terapia de conversión en los Estados Unidos. También tienes la opción de decidir cobrar la cantidad que elijas por tu juego y donar estos fondos a caridades pro transgénero.

Hay mucha más información disponible en el sitio web del jam.

Yo ya tengo una idea con la cual participar en este evento, sólo es cuestión de desocuparme de otros pendientes que tengo por el momento. Lo bueno es que todavía hay bastante tiempo, ya que el jam cierra hasta el 17 de febrero.


Introducción a la POO en Java

Nota: Esta entrada fue publicada el 22 dic de 2014 @ 21:38 en un blog que tenía anteriormente en Wordpress, y republicada aquí para el record.


Logo de Java

Estas vacaciones decidí adelantar la materia de Métodos de Programación II, en la que se ve la Programación Orientada a Objetos en Java, porque quería tomar una materia sencilla para mí que me subiera el promedio. La verdad es que todos estos conceptos ya los sabía desde antes, pero parece que mis compañeros tienen dificultades con ella, y como me están pidiendo ayuda, decidí crear esta serie de posts para explicarlos.

En este tutorial veremos algunos de los conceptos más básicos de la Programación Orientada a Objetos: objeto, clase, atributo, método, constructor; y llegaremos a crear el objeto de un carro. Comencemos pues, con una introducción a la POO.

¿Objetos? ¿Qué es eso?

Sí ya has programado antes, probablemente has usado int, double, char, float, etc. como tipos de dato, estos se llaman primitivos porque son los únicos tipos de dato que no son objetos (Java tiene 8 primitivos, además de los ya mencionados también están byte, short, long y boolean).

La necesidad de los objetos surge de que aveces queremos utilizar datos que no son solamente números. ¿Qué tal que quisiéramos tener un carro en el programa? Un carro no es un double ni un char, porque no es un solo dato sino que tiene varios atributos. Entonces para declarar un carro en el programa no sirve con sólo poner algo como

int carro = 1;

porque no es un número, es un objeto y debemos tratarlo como tal.

Las fábricas de objetos: clases y atributos

Sigamos con los carros. Si voy a una fábrica mecánica y les pido que me hagan el carro que quiero ¿me lo pueden hacer? Pues pueden solamente si tienen el plano de este, las instrucciones para fabricarlo.

Si tienen el plano de un carro pueden fabricar millones de carros a partir de este. Para crear un objeto en Java es lo mismo, se necesita tener un plano de dicho objeto y a partir de estos podemos fabricar todos los objetos que queramos de este tipo. Estos planos se llaman clases. Para definir cómo se fabrica nuestro objeto, debemos identificar primero sus característircas o atributos. En el caso de un carro, estos podrían ser

  • Fabricante (String).
  • Modelo (String).
  • Año (int).
  • Litros de gasolina (double).

Java exige que las clases estén en un archivo con extensión .java con el mismo nombre de la clase, y se recomienda que las clases comiencen con mayúscula, entonces nuestro archivo Carro.java para crear objetos Carro va quedando así:

public class Carro {
    String fabricante;
    String modelo;
    int anio;
    double ltGasolina;
}

Ya tenemos la clase con sus atributos. Ahora, para crear un objeto a partir de esta, se llama al método constructor, que es un método dentro de la clase con el mismo nombre de esta, sin tipo de dato de retorno (ni siquiera void), su función es recibir las características del objeto y asignarlas a los atributos.

public class Carro {
    String fabricante;
    String modelo;
    int anio;
    double ltGasolina;

    public Carro(String fabricante, String modelo, int anio, double ltGasolina) {
        this.fabricante = fabricante;
        this.modelo = modelo;
        this.anio = anio;
        this.ltGasolina = ltGasolina;
    }
}

De esta manera ya podemos crear cuantos carros queramos. Tal vez llame la atención la palabra this dentro del constructor, esta es necesaria en este caso porque el nombre de los parámetros es el mismo que el de los atributos, entonces para que no haya confusión se antepone this para hacer referencia a los atributos de este objeto.

Para crear un objeto a partir de la clase que creamos, simplemente escribimos en otro archivo Java lo siguiente:

Carro carro = new Carro("Nissan", "Quest", 2010, 20);

Tal vez parezca extraña esta sentencia, pero comparémosla con la definición de un entero:

int entero = 10;

En ambos casos, se pone primero el tipo de variable que queremos declarar: Carro (el nombre de la clase) en el primer ejemplo, int (el tipo de dato de los enteros primitivos) en el segundo.

Posteriormente, le damos un nombre a nuestra variable: la variable de tipo Carro se llama carro (nótese la diferencia de mayúsculas), mientras que la variable de tipo int se llama entero.

Por último, asignamos un valor a estas variables. En el caso del entero, como es un primitivo podemos simplemente asignarle una literal numérica 10; para carro, al ser objeto, tenemos que crear una instancia de este objeto, y esto se hace llamando al contructor, anteponiéndole la palabra new, que, como su nombre lo indica, crea un nuevo objeto a partir del constructor.

Los objetos realizan funciones

Ya tenemos definida nuestra clase, con sus propiedades, que puede crear objetos. Ya creamos un objeto llamado carro a partir de esta. Pero hasta ahora no hace mucho nuestro carro. Claro, podemos llamar a sus propiedades:

System.out.println(carro.modelo);

(Si declaramos el objeto carro tal y como está en el ejemplo de arriba, la línea anterior debería imprimir Quest).

Pero los objetos no sólo tienen propiedades, también realizan acciones. Por simplicidad, diremos que nuestro carro puede realizar dos acciones:

  • Recorrer distancia: Que toma una distancia a recorrer y reduce la gasolina (diremos que 1 Lt equivale a 1 Km, por simplicidad). Este método imprime cuántos kilómetros se recorrieron, y si hace falta gasolina imprime un mensaje.
  • Echar gasolina: Recibe una cantidad de litros de gasolina y los agrega a ltGasolina.

Las acciones, como podrá sospecharse, son solamente métodos públicos del objeto. Nuestra clase, pues, va quedando así:

public class Carro {
    String fabricante;
    String modelo;
    int anio;
    double ltGasolina;

    public Carro(String fabricante, String modelo, int anio, double ltGasolina) {
        this.fabricante = fabricante;
        this.modelo = modelo;
        this.anio = anio;
        this.ltGasolina = ltGasolina;
    }

    public void recorrerDistancia(int km) {
        if(km <= ltGasolina) {
            System.out.println("Se recorrieron " + km + " km.");
            ltGasolina -= km;
        } else {
            System.out.println("Hace falta gasolina para recorrer esa distancia.");
       }
    }

    public void echarGasolina(int lt) {
        ltGasolina += lt;
        System.out.println("Se echaron " + lt + " litros de gasolina al carro.");
    }
}

¡Nuestro objeto ya realiza acciones! Vamos a crear otro archivo de Java que contenga el main para poder usar usar nuestro objeto como es debido.

public class Programa {

    public static void main(String[] args) {
        Carro carro = new Carro("Ford", "F150", 2010, 1);
        System.out.println("Estas usando un " + carro.modelo + " de " + carro.fabricante + " anio " + carro.anio + " que tiene " + carro.ltGasolina + " litro(s) de gasolina.");
        carro.recorrerDistancia(1);
        carro.recorrerDistancia(1);
        carro.echarGasolina(3);
        carro.recorrerDistancia(3);
        carro.recorrerDistancia(1);
    }
}

Los dos archivos (Carro.java y Programa.java) deben estar guardados en el mismo directorio para que el programa funcione. Si corremos Programa.java debería imprimirse algo como esto:

Estas usando un F150 de Ford anio 2010 que tiene 1.0 litro(s) de gasolina.
Se recorrieron 1 km.
Hace falta gasolina para recorrer esa distancia.
Se echaron 3 litros de gasolina al carro.
Se recorrieron 3 km.
Hace falta gasolina para recorrer esa distancia.

¡Terminamos!

Hemos terminado con la creación de nuestro primer objeto. Siéntete libre de experimentar con este para ver qué sucede al modificarlo, también puedes agregarle más atributos y métodos para practicar:

  • Una característica de los carros es que tienen un color.
  • Los carros pueden ser pintados.
  • Puedes girar el carro.
  • Intenta crear varios objetos Carro distintos, llamar a sus métodos y ver qué sucede.
  • Hay carros que gastan más gasolina que otros.

Cualquier duda que tengas, puedes dejarla en los comentarios. Próximamente publicaré más tutoriales de conceptos de Orientación a Objetos.


Congreso DiGeek, Ensenada, B.C.

Nota: Esta entrada fue publicada el 21 dic de 2014 @ 01:51 en un blog que tenía anteriormente en Wordpress, y republicada aquí para el record.


Congreso DiGeek

Los pasados jueves 27, viernes 28 y sábado 29 de noviembre participé en el congreso DiGeek, que se celebró en el CETYS campus Ensenada. El evento fue organizado por los estudiantes de Ingeniería en Software de esta escuela y estuvieron invitando a los de Ciencias Computacionales de aquí de Mexicali, como yo soy de Cibernética Electrónica, casi no sabía nada del evento, pero me llamó mucho la atención cuando avisaron que iba a haber un Hackathon. Dos amigos de ICC me invitaron a que fuera con ellos y acepté.


El día jueves salí temprano, junto con mis amigos, rumbo a Ensenada y llegamos a la mitad de la primera conferencia, "Ubiquitous computing: living in a smart environment for autism", impartida por Mónica Tentori. Me pareció muy interesante, a pesar de que no puede escucharla desde el principio. Ella habló sobre cómo ha logrado implementar tecnologías de realidad aumentada para asistir en el aprendizaje de niños que padecen autismo.

La segunda conferencia del día fue "Diseño y desarrollo en Smart TV", en ella participaron dos empleados de Samsung Tijuana. Primeramente Josué Aguilar explicó cómo es el diseño orientado a Smart TVs, que es muy diferente al diseño móvil o al diseño web, pues a diferencia de estos, las televisiones utilizan como entrada los controles remotos y hay que adaptarse a ello. Después, Cristian Valladares habló más sobre la parte técnica del desarrollo de estas aplicaciones y mostró algunas de las que se han hecho en Tijuana.

La tercera y última conferencia del día fue una "Introducción al testing" dada por Verónica Cañizares, que por cierto es egresada de CETYS Universidad. Explicó el proceso que realiza al probar programas, los principales errores que el software puede llegar a tener, y las herramientas de debugging que utiliza en su trabajo diario.

Al terminar las conferencias se impartieron los talleres, que eran "Desarrollo de aplicación para Smart TV", "Ilustarción de personajes" y "Quality assurance". Yo tomé el de las aplicaciones de Smart TV, que fue dado por quienes dieron esa misma conferencia. Nos ofrecieron el código de una de sus aplicaciones, "Scarry Box", y nos guiaron en el desarrollo de una parte de este.

Terminamos como a eso de las 19:00 horas. El boleto del congreso incluía algunos eventos sociales en la noche, para el jueves teníamos barra libre en el Papas & Beer, además yo quería salir con una prima mía que vive allá, así que fuimos al hotel a cambiarnos y proseguimos a la vida nocturna de la ciudad.


El viernes tuvimos como primer conferencista al Dr. Arturo Serrano, con "Tecnología móvil y educación". Habló sobre los cambios que las tecnologías móviles han provocado en la educación, el potencial que tienen estas, y la nueva visión que se debe tomar para el proceso educativo.

Fue seguido por "Google apps for education", en la que Julio Soto, empleado de Google, mostró las aplicaciones que esta empresa tiene disponible para los estudiantes, como el almacenamiento en la nube, la colaboración en línea, el desarrollo web, las encuestas de Google Drive, e incluso el nuevo servicio de Google, Inbox.

Finalmente estuvo con nosotros José Alberto Juárez con "La interdisciplina en los medios creativos". Él está trabajando actualmente en la película que está por estrenarse de Huevo Cartoon y nos habló sobre el proceso que siguen al llevar a cabo proyectos como este. Dato interesante: la película fue desarrollada utilizando la CentOS Linux.

Los talleres de este día fueron "Composición digital", "Desarrollo mobile", "Bootstrap", y "Modelado digital". Yo tomé el de Bootstrap, que lo impartió el M.C. Mahajide Payán Hernández, maestro de CETYS Ensenada. Aprendí lo básico de Bootstrap, el framework de diseño web creado por Twitter.


Ya para el sábado, el congreso había técnicamente terminado, pues el hackathon era algo así como un evento aparte. El equipo debía ser de cinco personas, y como sólo éramos tres quienes fuimos desde Mexicali, tuvimos que adoptar a dos ensenadenses.

Tuvimos 8 horas, de las 8:00 a las 16:00, para desarrollar nuestro proyecto. Nosotros hicimos un software, en C# y .Net, capaz de digitalizar lo que se escriba en cualquier pizarrón común. Este funcionaba gracias a la comunicación con un Wiimote (utilizando la biblioteca WiimoteLib), que captaba, con el sensor infrarrojo que tiene en la punta, un LED infrarrojo colocado en la parte posterior del plumón de la pizarra. Lo llamamos WhiteBoard, el código, por supuesto, está disponible en GitHub.

El equipo trabajando

Hubo muchos muy buenos proyectos desarrollados en el hackathon, yo estoy orgulloso de lo que logramos, y sin duda nuestro equipo se divirtió muchísimo. Aquí una foto del equipo, junto a Karim Jernite, de Advancio, empresa que organizó el evento, y a Petter Hdz, representante de MX Hacks.

Al finalizar el evento

Participar en DiGeek y el We Can Code Hackathon fue una gran experiencia, sin duda la repito el año que entra. Conocí a grandes amigos con los que todavía sigo en contacto y no dudo que seguiremos en un futuro. Como el Hackathon terminó ya tarde y no quisimos manejar a oscuras en la carretera, decidimos quedarnos una noche más en Ensenada y tomar unas cervezas con los amigos que conocimos allá.

Unas cervecitas en el Wings Army