domingo, 30 de diciembre de 2012

Punteros y arreglos en C que se unen.

Cuando trabajamos en C/C++ usamos punteros debido a que son una herramienta muy buena para facilitarnos la vida, pero un detalle interesante de estos que no siempre funcionan como uno quiere.

Como sabemos los punteros son direcciones de memoria y utilizar estos puede ocasionar que la aplicación colapse por acceso de memoria no autorizado, pero los utilizamos porque reducen el código y nos ayudan muchísimo.

Aquí un ejemplo de punteros que nos dan problemas cuando iniciamos y no sabemos por que. Para sorpresa del profesor se encuentra raro cuando nos revelamos a utilizar C y optamos por un lenguaje de alto nivel.


#include <stdio.h>

int *a, *b, *c;

void f(int x) {
  int i[3];
  i[0] = x;
  i[1] = x + 1;
  i[2] = x + 2;
  a = i;
}

void g(int x) {
  int i[3];
  i[0] = x;
  i[1] = x + 1;
  i[2] = x + 2;
  b = i;
}

void h(int x) {
  int i[3];
  i[0] = x;
  i[1] = x + 1;
  i[2] = x + 2;
  c = i;
}

int main() {
  f(1);
  printf("a = {%d,%d,%d}\n", a[0], a[1], a[2]);
  g(2);
  printf("a = {%d,%d,%d}\n", a[0], a[1], a[2]);
  h(3);
  printf("a = {%d,%d,%d}\n", a[0], a[1], a[2]);
}

Noten que imprimo siempre a[0], a[1] y a[2] siempre, pero después de llamar a una de mis funciones para asignar valores a otro puntero.


domingo, 23 de diciembre de 2012

Una función que retorna FALSE, pero es TRUE

Muchas veces en la programación habituamos a usar los booleanos y por alguna razón aveces empleamos el sistema de ellos en base a lo que necesitamos, dígase "1" para verdadero y "0" para falso y según nos acostumbramos a hacer estas asociaciones ligamos dicha sintaxis a nuestros software principalmente en ciclos que ejecutan una determinada acción u/o ciclos que son servicios o demonios que escuchan en espera de un evento específico.

Algunos ejemplos de estos son en los juegos con el ciclo principal, hilos que escuchan puertos en espera de conexiones u otro caso similar y se ven linea como "while(1)" en vez de "while(true)" y de vez en cuando cuando tenemos una función que retorna un booleano le ponemos al final "return 0" o "return 1" y el lenguaje no los acepta, ya que simbólicamente para el lenguaje estos representan lo mismo, pero ¿es en su totalidad cierto?

Aquí les muestro un código que rompe con cualquier lógica de aquellos que trabajamos con booleanos:

#include <stdio.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {
  return FALSE;
}

int main() {
    if(function_returning_false) {
printf("La funcion retorna True.\n");
    }else {
        printf("La funcion retorna false.\n");
    }
}

Más adelante seguiré publicando más comportamientos extraños de los código, cualquier pregunta o sugerencia no dudar en preguntar.

viernes, 21 de diciembre de 2012

Time Analysis Tool Android (Proyecto)

Aquí les presento un pequeño proyecto que estoy desarrollando en Android para el departamento de industrial de la Pontificia Universidad Católica Madre y Maestra (PUCMM).

Aunque todavía esta en su fase prototipo y se continua su desarrollo este podrá ser la siguiente herramienta que ayudará a los estudiantes de ingeniería industrial en sus prácticas del análisis y estudio del tiempo.

Aquí os presento el logo, aunque simple, pero simpático:


Según se continué el proyecto su interfaz cambiará, pero así es que se encuentra actualmente. A continuación algunas capturas de la aplicación corriendo en Android.


Mostrar/Ocultar Fotos
Seleccionar lugar para salvar los archivos.
                                                                                                         


Presentación vacía de la pantalla.

Presentación de como se capturan los datos.

Funcionamiento del menú.

Detalle del botón acerca del menú.

lunes, 17 de diciembre de 2012

Algunos Comandos De Git


Siempre que desarrollamos proyectos que requieren más de 1 persona necesitaremos compartir código y siempre que no conocemos las herramientas hacemos un caos con el código y se nos dificulta trabajar en equipo, pero tenemos los SCM (Software Configuration Manager) y que son herramientas que controlan el caos en los proyectos de equipos.

Existen diferentes software para controlar el código que se desarrolla con varias personas como son: Git, SubVersion (con este existen variantes, pero solo conozco la versión apache), Microsoft Team Foundation Server 2010, y otros más. Estos software se conocen como controladores de versiones y es más o menos una descripción de lo que hacen.

Controladores de versiones?, como es eso?, es el proceso tal y cual lo indica el nombre, pero es más complejo de lo que parece en los mecanismos sin embargo su uso es bien simple y nos permite trabajar con mucha flexibilidad, con esta herramienta podemos subir código a un proyecto y hacer que todo el grupo de trabajo tenga los cambios realizados reflejados inmediatamente.

En caso de que la aplicación tenga un rumbo erróneo y exista código que no debe estar es posible retroceder en el árbol de cambios y regresar al código a un punto exacto donde empezaron los cambios que no iban.

También estos SCM pueden controlar cuales archivos son subidos para evitar que se suban archivos compilados al repositorio si lo único que se quiere son los archivos de source existen los [.ignore].

Después de explicar un poco el proceso entonces podemos proceder a explicar algunos comandos de un SCM, el cual será el que le doy uso (GIT).

Comandos básicos de git

  1. Comando git init: Este inicia el proyecto de git y habilita para enviar cambios.
  2. Comando git add: Adiciona elementos al árbol del repositorio. Cuando se quieren adicionar todos los cambios sin tener que hacerlo uno a uno si alteramos muchos archivos y no sabemos cuales cambiaron usamos el comando (git add -A) y este le agrega todos los cambios y respeta el [.gitignore] que puedes crear.
  3. Comando git rm: Remueve elementos del árbol del repositorio.
  4. Comando git commit -m "comentario": Crea un punto de envío de datos y le asigna un nombre.
  5. Comando git push: Este subo los cambios al repositorio oficial.
Existen más comandos para crear brach, pero como es un manual básico no los expongo o explico, pero más adelante se hará la parte 2 explicando lo demás.

Para aquellos que le gusta indagar más aquí hay un libro sobre git donde se explica en mucho detalle la forma de administración de git.

http://git-scm.com/book/es

jueves, 13 de diciembre de 2012

Como buscaban en los 60?

Curioseando se encuentran cosas interesantes y más ahora que es muy fácil buscar y encontrar información acerca de algo que estas interesado, pero antes de que estos sistemas estuvieran tan avanzados ¿como se buscaba información en los años 60?, la respuesta es simple y es como están pensando, haciendo uso de un computador y tarjetas perforadas con un gran tiempo de procesamiento, pero por suerte tenemos la posibilidad de experimentar esa experiencia usando la tecnología de hoy día.

Para aquellos que quieren probar dicha experiencia podrán ver el método de búsqueda  pero con la información actualizada de hoy día en el siguiente enlace.

http://www.masswerk.at/google60/

miércoles, 5 de diciembre de 2012

Que es lo que necesita un ingeniero para ser un ingeniero como tal?

Según obtengo experiencia y avanzo más en lo que es la carrera y el ámbito profesional me doy cuenta de que los ingenieros necesitamos de un elemento crucial para poder hacer uso de ese título que se nos entrega y es algo que perdemos con el paso del tiempo, debido a que la misma sociedad se encarga de destruir toda forma de curiosidad que tiene el ser humano, tal y como dijo Albert Einstein "cada flor de curiosidad es aplastada por la sociedad en sí misma".

La naturaleza del hombre es ser un ente sociable y este nace con características muy particulares, pero desde el momento en que nacemos buscamos e indagamos para saber como funcionan las cosas y según crecemos esta cualidad se pierde igual e inclusive llega a casi desaparecer en el individuo, pero que es lo que hace que la curiosidad desaparezca de aquel que nace con ella?, la respuesta radica en lo que afirmó Albert Einstein y es la sociedad, ya que los cursos que hacemos según nos desarrollamos, dígase escuela primaria y secundaria solo se nos enseñar a memorizar y cada vez que un estudiante presenta cualidades de innovación y curiosidad este es instigado por el sistema obligando a este a solo memorizar y no a razonar y entender el por que de la cosas.

Un ejemplo claro es la deficiencia de matemática y física que existe en la República Dominicana, debido a que solo nos muestran a como sustituir variables en ecuaciones y a realizar la operación que obtiene el resultado. Es por esto que si se nos quita una variable y se nos obliga a buscar la manera de encontrarla usando otras formulas y despejes simplemente no podemos ver la solución y realizar el problema, ya que no entendemos, sino que memorizamos y repetimos.

Aquí les comparto un video muy relacionado al tema y que es de uno de los más grandes físicos del siglo Michio Kaku.
http://www.youtube.com/watch?v=fjkVoW4Y3x0