About Clayder Alejandro Gonzalez Cadenillas

http://ifxperu.com

Informático por vocacion. Empecé programando en visual basic a los 12 años, no me gusto. En la universidad vi mas a fondo el lenguaje de programacion Java y luego mi curiosidad me llevo a aprender C++, C y luego lenguaje ensamblador. Soy un apasionado por los lenguajes de programacion, lo que ultimamente me ha llevado a la teoria de lenguajes formales, tambien soy un aficionado de los microcontroladores PIC y me gusta ver a fondo la arquitectura del computador. Mi lema es: "Quieres optimizar tu codigo?. Programa en lenguaje ensamblador!!"

Posts by Clayder Alejandro Gonzalez Cadenillas:

Máximo común divisor y mínimo común múltiplo según Euclides

Euclides fue un matemático griego que vivió desde el año 325 hasta el 265 a.C. También es conocido como el padre de la geometría. La cuestión es que el patín este, en una de sus tantas masturbaciones cerebrales, eyaculo un método muy eficaz para calcular el máximo común divisor de 2 números; es decir, cualquiera de nosotros, mediante la forma que nos fue enseñada en el colegio, es capaz de hacer un programa para que calcule el máximo común divisor de 2 números, pero la cuestión es que, Euclides ideó un algoritmo que lo hace con menor cantidad de operaciones, ósea de menor complejidad computacional en comparación al algoritmo clásico del MCD.

El algoritmo comprende de pocas operaciones, sin embargo Euclides debe haber tenido una gran imaginación para encontrar una relación entre el MCD y la operación de modulo o resto; siendo esta ultima operación sobre la que este algoritmo basa su funcionamiento. Su implementacion en el lenguaje de programación Java es como sigue:

Seguir leyendo …

Brazo robot controlado por voz II

Anteriormente ya había posteado el video de un trabajo de un brazo robot controlado por instrucciones de voz y programadas en lenguaje ensamblador de PIC. En este oportunidad grabé otro video, pero el algoritmo esta vez esta implementado en PIC C, el cual me permite mas fácilmente trabajar con enteros de 16 bits, los cuales me ayudan a diferenciar los diferentes rangos de las instrucciones de voz.

El circuito de este proyecto consiste simplemente en 1 microcontrolador, 1 microfono, y 1 pantalla lcd de 2×16, esta ultima solo es util para el momento de entrenar la voz, ya que es ahí donde se muestra la intensidad de sonido y la longitud de cada instrucción de voz.

httpv://www.youtube.com/watch?v=0zhj25Yz99g

Si les interesa el diagrama del circuito me escriben para postearlo.

Saludos.

Feliz año 2011!!!

El año 2010 ya se esta yendo[ya se fue ¬¬] y en él han quedado grabadas todas nuestras experiencias vividas; buenas y malas, divertidas y aburridas, cosas que hicimos y que nos llenan de orgullo, cosas que hicimos y que nos arrepentimos de haber hecho, amistades que se hicieron mas fuertes, amistades que se debilitaron, amores no correspondidos, amores concretados…, en fin tantas cosas que uno ha hecho y que ha dejado de hacer en este año que ya se va, y las cuales de alguna u otra forma nos han hecho ganar experiencia y además, aprender y comprender que nuestra estancia en este mundo no es tan fácil como se piensa.

Personalmente, este no fue un buen año para mi; sin embargo, me sirvió –creo- para darme cuenta que aun tengo muchos puntos débiles que fortalecer, puntos débiles que debo erradicar de mi forma de ser, puntos débiles que, quizás, son producto de mi inmadurez y mi forma errónea de ver la vida. Y así pues como lo hacen las redes neuronales, uno debe equivocarse, pero para aprender a no cometer los mismos errores; así como el backtracking usa el segmento de pila y sus llamadas recursivas para encontrar la salida del laberinto; así como un carrito seguidor de líneas se ayuda de su CNY70 para no salirse del camino…

Para IFX, este año fue menos intenso que el anterior; es decir, ya no hubo aquellas reuniones entre Will y Clayder como las solían haber, ni las amanecidas de programación, ni las caminatas al Super Win por una cangreburguer. Por otro lado, en la parte creativa se propusieron muchas ideas, se intentaron algunas, resultaron fallidas todas; falta de organización aparentemente, y falta de interés de mi parte debido a que por épocas entro en un bucle infinito en el cual hay solo un if() que es el único que puede llevarme al break que terminará momentáneamente con el bucle, al cual luego volveré mas adelante por culpa de un goto que hasta el momento no puedo evitar.

En resumen, aunque mis metas no han cambiado, me he alejado mucho de los objetivos que van junto a ellas para lograrlas; y aunque no tengo mucha experiencia, solo me queda decirles algo, cada uno tiene su misión en este mundo, no intenten comportarse, ni traten de ser alguien que uno no es, eso solo traerá situaciones incomodas, ya que estar fuera de nuestro hábitat es muy incomodo -lo digo por experiencia propia. Si te crees que lo tuyo es salir a juerguear, bien! haz todo por ser el mas juerguero, si crees que lo tuyo es solo estudiar, también bien!, trata de sobresalir en el aspecto académico; si quieres buscar el equilibrio, pues es la mejor opción y la mas difícil –creo- solo una recomendación, siempre hay un proceso con mayor prioridad solo trata de que, en función del tiempo, el proceso con mayor prioridad sea aquel del cual sacarás mas provecho y si en serio vale la pena otórgale todo los recursos que requiera. Lo ultimo que diré no se quien lo dijo, solo lo parafrasearé:

Estudia como si fueras a vivir siempre; vive como si fueras a morir mañana.

Ya es 2 de enero del 2011, me demoré en escribir este post porque estoy de mala noche. Todos los exitos del mundo para ustedes.

Hasta otro post…

Buenas practicas de programación y convenciones Java

Cuando empieza a programar, el desorden de nuestro código es impresionante, es decir, nombramos variables con nombres inentendibles tipo:

mVar, suel_emp, atX_W

Hasta el día de hoy sigo viendo algunos códigos como esos. Yo digo, nunca han pensado que otra persona necesitará revisar su código?, pues creo que la respuesta a eso es NO.

Ahora, en todo lenguaje de programación existen ciertas convenciones para hacer nuestro código mas prolijo y entendible. A continuación adjuntaré un pdf escrito por Angel Castiglia, el cual me parece buenísimo porque te da excelentes consejos de como tener buenas practicas en programación para programar en Java, siguiendo los estándares de java.

Buenas practicas de programación Java

Además, aquí adjunto el link de un post muy bueno del blog Java Tutoriales, el cual describe las convenciones de java para nombrar a las clases, métodos, atributos, etc.

http://javatutoriales.blogspot.com/2010/10/sun-certified-java-programmer-6-cx-310_10.html

No me queda nada mas que decir, que por favor pedirles que sigan esas recomendaciones, por el bien de los que alguna vez tenemos que revisar códigos ajenos =)

Bibliotecas en C/C++ [Actualizado]

Cuando uno empieza a programar, la forma de modularización del nuestro código es bien pobre; es mas!, tanto así que hasta a veces metemos todo en el main. Luego que superamos la fase de meter todo el main, comenzamos a modularizar mediantes funciones, las cuales las ubicamos dentro del mismo archivo. Hasta aquí ya sabemos programar; y pues ya no aparecen los errores en tiempo de compilación, pero nos falta algo aun para hacer proyectos mas grandes, ese algo, es aprender a usar y crear bibliotecas o librerías.

En C++ y en algunos otros lenguajes de programación, se pueden crear 2 tipos de bibliotecas: dinámicas y estáticas. En Windows, las primeras toman la extensión *.dll y las segundas *.lib o *.a. En linux cambia la extensión de estas por *.so y *.a, respectivamente. Si quieren saber mas sobre el uso de bibliotecas en linux, pueden pasarse por el site de chuidiang.com (sitio que, cuando empecé a programar, me sacó de muchos apuros).

Ahora, para comprender un poco mas de las bibliotecas hay que comprender un poco como funciona el proceso de hacer un programa en un lenguaje de programación compilado, desde su codificación hasta su ejecución. Repasando un poco de teoría, hay que saber que cuando creamos un fichero fuente, este al compilar crea ficheros objeto con extensión .o u .obj. Haciendo un paréntesis, quisiera decir que cuando comencé en la programación me malacostumbré a que con un botón “Build all” o “Make all”, me tuviera listo todo el proyecto y listo para ejecutar y distribuir. Es por eso, que antes de usar cualquier IDE –creo yo- hay que conocer que sucede al hacer clic sobre estos botones. Como había dicho líneas atrás, al trabajar con un lenguaje compilado, al compilar se crean ficheros objeto y NO ejecutables. Los ejecutables son creados recién por el linker, el cual junta todos los ficheros objeto -que no es mas que código de maquina- para poder crear un ejecutable. Si alguna vez han programado en lenguaje ensamblador, se podrán dar cuenta que el proceso es parecido, solo que en lugar del compilador, esta el ensamblador(MASM, TASM, NASM, etc.). Como dijo mi profesor del curso de arquitectura de computadoras, ya con los ficheros objeto tenemos una pista para poder comunicar varios lenguajes de programación, pero ese es otro tema. Por ultimo, también está el no menos importante “librarian”, que es el que se encarga de extraer los ficheros objeto de las bibliotecas, para que así el linker pueda crear el fichero ejecutable apropiadamente.

image

Figura 1. Proceso de compilación

 

image

Figura 2. Proceso de creación de un ejecutable en C no detallado

Seguir leyendo …

Bibliotecas en C++

Cuando uno empieza a programar, la forma de modularización del nuestro código es bien pobre; es mas!, tanto así que hasta a veces metemos todo en el main. Luego que superamos la fase de meter todo el main, comenzamos a modularizar mediantes funciones, las cuales las ubicamos dentro del mismo archivo. Hasta aquí ya sabemos programar; y pues ya no aparecen los errores en tiempo de compilación, pero nos falta algo aun para hacer proyectos mas grandes, ese algo, es aprender a usar y crear bibliotecas o librerías.

En C++ y en algunos otros lenguajes de programación, se pueden crear 2 tipos de bibliotecas: dinámicas y estáticas. En Windows, las primeras toman la extensión *.dll y las segundas *.lib o *.a. En linux cambia la extensión de estas por *.so y *.a, respectivamente. Si quieren saber mas sobre el uso de bibliotecas en linux, pueden pasarse por el site de chuidiang.com (sitio que, cuando empecé a programar, me sacó de muchos apuros).

Ahora, para comprender un poco mas de las bibliotecas hay que comprender un poco como funciona el proceso de hacer un programa en un lenguaje de programación compilado, desde su codificación hasta su ejecución. Repasando un poco de teoría, hay que saber que cuando creamos un fichero fuente, este al compilar crea ficheros objeto con extensión .o u .obj. Haciendo un paréntesis, quisiera decir que cuando comencé en la programación me malacostumbré a que con un boton “Build all” o “Make all”, me tuviera todo el proyecto listo para ejecutar y distribuir. Es por eso, que antes de usar cualquier IDE –creo yo- hay que conocer que sucede al hacer clic sobre estos botones. Como habia dicho lineas atras, al trabajar con un lenguaje compilado, al compilar se crean ficheros objeto y NO ejecutables. Los ejecutables son creados recien por el linker, el cual junta todos los ficheros objeto -que no es mas que codigo de maquina- para poder crear un ejecutable. Si alguna vez han programado en lenguaje ensamblador, se podran dar cuenta que el proceso es parecido, solo que en lugar del compilador, esta el ensamblador(MASM, TASM, NASM, etc.). Como dijo mi profesor del curso de arquitectura de computadoras, ya con los ficheros objeto tenemos una pista para poder comunicar varios lenguajes de programación, pero ese es otro tema. Por ultimo, también está el no menos importante “librarian”, que es el que se encarga de extraer los ficheros objeto de las bibliotecas, para que así el linker pueda crear el fichero ejecutable apropiadamente.

Todo esto es un poco de teoría de los lenguajes de programación, que la verdad es un poco aburrido, A MENOS QUE lo pongamos en practica. Quizás la mayoría de nosotros al querer usar una librería en C++, tenemos que buscar un pequeño tutorial de como instalarlo si estamos usando Dev C++ o si usamos Codeblocks, Visual C++, etc. Pero, como les decía antes, esto va contra mi pensamiento de hacer clic sobre botones que me esconden su funcionalidad. Debido a esto, cogeremos uno de estos IDE, pero NO USAREMOS EL IDE, sino SOLAMENTE EL COMPILADOR CON EL QUE VIENE. En este caso usaremos el Codeblocks, el cual viene con el G++(compilador de C++ de GNU) y además usaremos el API OpenGL y GLUT.

El API OPENGL ya viene incluido en los últimos sistemas operativos; y como toda api, tiene sus bibliotecas estáticas y dinámicas, solo hay que saber cuales son necesarias. En este caso para nuestro ejemplo necesitamos opengl, glu y glut. Entonces, como estamos en windows debemos buscar las librerías estáticas y dinámicas y los headers con los mismos nombres. Generalmente, las librerías dinámicas llevan el mismo nombre y terminan en 32, si nuestro windows es de 32 bits y las librerías estáticas comienzan con libNOMBREDELALIBRERIA32.a, como mi computadora es de 32 bits, encontré los siguientes archivos:

  • libopengl32.a
  • libglu32.a
  • libglut32.lib

Como OPENGL y GLU ya vienen con el compilador y/o el sistema operativo, no es necesario especificarle al compilador donde están las librerías dinámicas, ni los headers; ya que el compilador al instalarse, siempre setea la variable de entorno PATH y pone ahi las rutas. Si quieren probar usando solo el compilador y el linker, prueben, debería funcionarles normal, solo que habría que indicarle al compilador donde estan los .dll y los headers de opengl y glu.

Para glut, si hay q bajarse la librería completa, es decir: headers, librerias estaticas y dinámicas y luego decirle al compilador donde las puede encontrar para que al momento de linkear, pueda crear el ejecutable sin problemas.

Finalmente, todo esto que he escrito, lo pondremos en practica, como les dije antes, usando el compilador gcc. Para esto, solo hay q saber que parámetros hay q darle al compilador. En este caso sería:

g++ -omain main.c -I”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -L”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -lopengl32 -lglu32 –lglut32

donde –I indica donde encontrar los headers, –L donde buscar las librerías y –l, es la llamada al linker para que cree el ejecutable incluyendo los ficheros objeto que se encuentran en “opengl32, glu32 y glut32”, los cuales van a ser manipulados por el librarian.

Olvidaba que hay que tener en cuenta que el archivo g++.exe esta en la carpeta /bin de Codeblocks y que para que podamos llamarlo directamente hay que agregar dicha ruta al path, manualmente o en todo caso poner toda la ruta del archivo, ejemplo:

“C:\Archivos de programa\CodeBlocks\MinGW\bin\g++.exe” -omain main.c -I”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -L”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -lopengl32 -lglu32 –lglut32

Para no aburrirlos mas, pondré un ejemplo de programa de opengl que me pasaron en un minicurso de opengl que lleve en el congreso pasado de la UPAO. Lo principal es que pueden editar este código desde el bloc de notas y compilarlo desde línea de comandos (en este caso use un .bat).

Aquí pueden bajar el ejemplo:

Ejemplo OPENGL con bloc de notas

Hasta otro post =).

Brazo robot controlado por voz

Este es un proyecto en el que vengo trabajando hace 3 meses, más o menos. El proyecto consiste en que mediante un micrófono, el kit de brazo robótico OWI-535, responda a instrucciones pre-definidas en el programa almacenado en un microcontrolador pic.

Este proyecto tiene parte electrónica en la cual no ahondaré mucho ya que no es mi área, solo diré que toda la voz es procesada por el pic y luego la señal de activación de la orden va como entrada a un l293B, el cual permite amplificar el amperaje para hacer que se mueva el brazo robot. Para la parte del algoritmo tampoco es muy complicado, solo que estoy haciendo un informe bien preparado para que así pueda ser entendido el algoritmo.

Esta es en realidad la segunda prueba del proyecto en el cual le agregue una instrucción mas de voz “arriba” , “para” y “salúdame”. Como pueden ver, para mi algoritmo le es más difícil diferenciar el “arriba” del “para”, ya que hay una orden mas agregada al programa, la cual hace que mezcle a veces los valores de los rangos de cada orden.

Para ser implementado con los registros de propósito general de 8 bits del 16f877A, ya es suficiente con 3 instrucciones de voz. Espero actualizar el algoritmo de procesamiento de voz, pero ya implementarlo en PIC C.

PD: Ahora esta implementado en asm de pic

Tipos de estudiante informático

Antes de comenzar el post en sí, solo diré que en estos momentos me encuentro con la laptop en las piernas (dicen que me puedo volver estéril al ponerla ahí, pero en fin no me gustan los niños) con los ojos agotados y con la parte superior de la ceja derecha latiéndome. Mi semblante no es de los mejores, pero al menos creo que el ejercitarme regularmente ayuda en algo. Además quisiera decir que esta clasificación la saqué de mi experiencia universitaria –que aun no acaba- y puede que no todos estén de acuerdo con ella.

image

En fin, comencemos:

1.  El/la que no programa ni su horario, pero es muy hábil sobre el papel: Este tipo de estudiante generalmente comprende muy rápido los problemas y plantea inteligente soluciones a ellas, sin embargo, al momento de llevarlo a un lenguaje de programación, pues simplemente se nubla.

2.  El/la que no programa ni su horario, y solo usa el papel para ir al baño: Este tipo de estudiante es un zángano completo pues no sabe programar y parece que tiene pereza de pensar porque quiere –como diría Jaimito- evitar la fatiga.

Seguir leyendo …

Merece Windows ser tan vapuleado?

Antes que todo, empezaré diciendo que este es un post de mi opinión y experiencia personal, la cual tampoco es mucha. Lo que quiero evitar –como dice Borja Perez- es que salga el típico listo sabelotodo y que salte sobre las opiniones vertidas sobre este post. No quiero que no comenten, sino dejar en claro que es una opinion personal u_U.

Veamos; desde hace algunos años que esto del software libre se esta haciendo cada vez mas famoso y cada vez mas accesible a los usuarios finales, como es el caso de la distribución de gnu/linux, Ubuntu. Esto, también esta trayendo cada vez mas gente muy radical con respecto a eso; en el sentido de que piden que se use software libre para todo; y pues aunque yo también estaba metido antes en ese grupo de apoyo incondicional al sw libre, ahora expondré, de acuerdo a mi experiencia estudiantil personal, que tenemos mucho que agradecerle al software propietario y mas específicamente al tan odiado WINDOWS.

image

Desde que era niño, mi viejo me tenia traumado con las computadoras; recuerdo que cuando tenia 7 años dormía con una música de fondo bastante particular, la cual era dada

Seguir leyendo …

La clase Robot de Java

Hace tiempo, cuando recién empezaba a programar en Java, ví el nombre de esta clase Robot. A mi me pareció un nombre bastante atractivo, por lo que decidí ver en la documentación del API de Java para saber como usarla.

Yo tenía las sospechas de que seria algo bastante dificultoso de hacer, pero no fue así; solo sabiendo lo básico de la programación orientada a objetos fue necesario para poder hacer unos ejemplos.

Esta clase nos permite manejar mediante metodos las pulsaciones del teclado y del mouse e incluso añadirles un cierto delay(retardo), por lo que se me ocurrio jugarle una broma a mis amigos.

El código lo adjunto aquí en archivo rar que contiene el fuente .java, está un poco desordenado ya que no es un trabajo o algo por estilo, sino un programa que se me ocurrio hacer en mis tiempos de ocio para probar el funcionamiento de esta clase(^^’).

El fuente es un applet, por lo que no podran ejecutarlo así como así, ya que al acceder a metodos nativos del sistema(pulsaciones de teclado), necesito primero firmarlo, lo cual si les interesa lo pueden buscar en google o simplemente me lo hacen saber para responderles.

Además les dejo la url del applet ya subido a un hosting gratuito, en donde podran ver en funcionamiento la broma, la cual no hace mas que escribir algo en el bloc de notas y luego te reinicia la pc.

http://claydergc.webs.com/applet.htm

Como decía es necesario firmar el applet, por lo que por ser una broma les aparecerá que acepten que se ejecute el applet en su browser el cual esta con un nombre que no es mio, si mal no recuerdo el nombre que le puse fue “Juan”, para que mis amigos no sepan que fui yo.

Por lo demás no se preocupen, solo es una prueba del funcionamiento de la clase java.awt.Robot, lo unico si les recomiendo que guarden todo lo que esten haciendo porq les reiniará la pc; en todo caso eso pueden verlo en el codigo que adjunté si es que no deseean ejecutar el applet.

http://seccperu.org/files/PruebaRobot.rar

Bueno, espero les haya servido de algo este post.

Saludos.