sábado, 13 de octubre de 2018

Instalar Maven en Windows

Apache Maven es una herramienta de manejo de proyectos de software, que permite compilar proyectos, documentarlos y generar reportes a partir del concepto de un Modelo de Objetos de Proyecto (POM).

domingo, 23 de septiembre de 2018

SQL Server Snippets - Aproximación de valor real a N-ésimo decimal superior/inferior

Supóngase que se tiene un valor real o float, que se quiere aproximar al N-ésimo decimal superior. Por ejemplo:

Nuevo proyecto: Juego para Android


Hola. Esta entrada la escribí en mi antiguo blog de WordPress, en marzo de 2013. Tristemente a la fecha no he siquiera iniciado el proyecto, e incluso ha sido reemplazado por otros... pero quién sabe, tal vez algún día retome la idea. Por completitud, les dejo la entrada original a continuación (con algunas notas nuevas en rojo 😅):

Después de algunos sucesos, me he sentido motivado y animado a iniciar un proyecto a mediano-largo plazo, que consiste en un juego para Android. El único detalle está en que jamás en mi vida he hecho un juego, y mucho menos un programa para Android, jejeje... Lo más que hice fue una guardar una tabla de resultados para un proyecto en la materia de Gráficos por Computadora de la universidad. Pero me gusta correr antes que caminar (en este caso en particular), así que quiero hacer un juego 3D. A continuación describo mis ideas.

El juego

De momento, mi idea es que el juego sea más o menos estilo Star Fox 64, pero solamente en el espacio. ¿Por qué? Primero, porque me gustan los aviones. Segundo, porque creo que es más fácil que la nave siga una ruta predefinida, en vez de un mundo abierto. Tercero, porque creo que es difícil hacer un terreno y que el avión interactúe con él, así que mejor contar con la libertad del espacio.

Star Fox 64
Star Fox 64

Por otra parte, quiero tomar las partes más adictivas que se me ocurran de juegos como Space Invaders (variedad de enemigos con dificultad variable), Asteroids (asteroides, jejeje) y Fury 3 (múltiples armas agotables), para hacerlo entretenido. Finalmente, quiero que parte o todo el juego sea de código abierto (open source), pero hasta el momento en que lo termine, o que ya esté considerablemente maduro.

Asteroids
Asteroids

Fury 3
Fury 3

Algo importante que quiero es que las misiones no estén quemadas en el juego, sino que sea posible programarlas mediante algún metalenguaje, como YAML o XML o JSON, o bien un lenguaje de programación, pero de forma completamente externa al juego. Es decir, el kernel sería el juego, y las misiones serían como plugins. E incluso, me gustaría que los usuarios pudieran programar las misiones a su creatividad, dejando abierto todo un mundo de posibilidades. (Se me ocurrió un año antes que anunciaran Super Mario Maker 😮😮😮)

¿Por qué para Android?

Bueno, porque creo que para esta plataforma los gráficos no son lo principal, y considerando que soy un principiante (o menos que eso, jajaja...), creo que es adecuado. En segundo lugar, me llama la atención los juegos en dispositivos móviles, y creo que hay muchas posibilidades. Tercero, espero algún día poder publicar el juego en Google Play, y creo que los usuarios de Android están más abiertos a juegos pequeños.

¿Cómo hacer el juego?

Bueno, usualmente me gusta reinventar la rueda, y hacer todo desde cero, pero para este caso creo que sería muy difícil, así que mejor probaré primero con algún motor de juegos ya existente. Las características que espero del motor son las siguientes:
  • Idealmente que sea de código abierto, y gratuito. Si no es gratuito, que al menos pueda usarlo gratis para la etapa de desarrollo, pruebas y uso personal, y que adquiera la licencia (relativamente barata) en caso de que lo quiera publicar.
  • Que permita importar modelos 3D desde programas como Blender, o bien algún programa CAD gratuito.
  • Que no sea muy pesado o sobrecargue la memoria RAM de los dispositivos móviles.
  • Muy ideal sería que fuera multiplataforma, es decir, que no se limitara a Android, sino que también permitiera desarrollar juegos para computadoras, e incluso para consolas.

¿El plan? ¡Cuál plan!

Son bromas. Ahorita, el plan es simple: conseguir un motor de juegos para Andorid que cumpla los requisitos previos. Una vez lo encuentre, veremos que estrategia seguir...

Saludos.

Publicado originalmente el 2013-03-24, en https://itsouvenirs.wordpress.com/2013/03/24/nuevo-proyecto-juego-para-android/.

domingo, 19 de agosto de 2018

Mi primera aplicación web con React


Bueno, por azares del destino, finalmente fue inevitable tener que adquirir el gusto de React. Es la tendencia, culpa de Facebook. Habiéndome desahogado, empecemos.

Intro a React.js

React.js es una herramienta de JavaScript para construir interfaces de usuario. La forma más fácil de crear el esqueleto de una aplicación de React, es utilizar la herramienta de Node JS llamada create-react-app (😒), la cual podemos instalar de forma global a través de la terminal mediante el siguiente comando (nótese que debe ejecutarse como administrador -en Windows- o root -en Linux-):

# npm install -g create-react-app

Luego, procedemos a crear la aplicación base, con el nombre "peliculas-app" (pronto verán el porqué del nombre):

$ create-react-app peliculas-app

Luego, nos trasladamos al nuevo directorio creado para la app, y la probamos ejecutar:

$ cd peliculas-app/
$ npm start

Esto compila la aplicación con Webpack y la ejecuta con un servidor interno de desarrollo, publicándola localmente en el puerto 3000, por defecto. Al abrir la aplicación web, se muestra lo siguiente:

Al observar la estructura de la aplicación, tenemos algo similar a esto:
La página principal se encuentra en el archivo public/index.html. Por otra parte, el componente principal de React, el cual renderiza todo el contenido mostrado en la página inicial, se encuentra en el archivo src/App.js. En este último archivo, por ejemplo, podemos reemplazar el contenido del párrafo que usa la clase App-intro, con el texto "Hola mundo", así:

Una vez que se guarda el archivo, se recompila la aplicación de forma automática, por lo que podemos ver el cambio reflejado en el navegador de forma casi inmediata:

Creación de la aplicación: lista de películas

Luego de esta rápida introducción práctica a React, procederé a crear mi primera aplicación web con React. La aplicación consistirá en mostrar en pantalla un listado de nombres de películas, obtenidos desde un arreglo de datos. La película incluirá el título, una breve sinopsis y una imagen. El listado, así como cada ítem de este, será un componente distinto. Comencemos:

1. Primero agregaremos el listado de películas en el estado de la aplicación. Pondremos 3 para este ejemplo:


2. Luego crearemos un nuevo componente para mostrar cada ítem de la lista, en el cual mostraremos la imagen, el nombre y la sinopsis de esta. Cada ítem sera un elemento de tipo <li>. Dicho componente se creará en un nuevo archivo de JavaScript, al que llamaremos Item.js, dentro de la carpeta src.


En este componente se recibe como parámetro la variable props, la cual nos sirve para recibir datos de quien invoque este componente. En este caso, dentro de props recibiremos el campo pelicula, el cual contendrá la información de un elemento de la lista de películas: id, nombre, sinopsis y urlImagen. El componente renderiza la vista HTML que definimos en el cuerpo de la función, y en la cual podemos hacer uso de los props al incluirlos entre llaves.

3. Seguidamente procedemos a crear un tercer componente, en un nuevo archivo que nombraremos Lista.js. Este componente será el encargado de renderizar la lista, haciendo uso del componente Item para renderizar cada elemento, de la siguiente forma:


Nótese que este componente recibe el parámetro listaPeliculas dentro de los props, el cual contendrá el arreglo de películas. Este arreglo se itera mediante la función map(), dentro del cuerpo de la lista (<ul></ul>), para convertir cada elemento del arreglo en una vista, haciendo uso del componente Item. Puede observarse que el elemento es pasado a cada Item mediante el atributo pelicula, que es el nombre con el que se le hace referencia en dicho componente. Cabe mencionar que para hacer uso del componente Item, debemos importarlo al inicio del archivo de javascript.

4. Para armar la aplicación final, sustituimos en el componente principal (App.js) el párrafo que contenía la frase "Hola Mundo", por un div, y dentro de este colocamos el elemento Lista, al cual le proporcionaremos el arreglo de películas a través del atributo listaPeliculas, que es el nombre con el cual le hacemos referencia en dicho componente. Cabe recordar que para poder utilizar el componente Lista, debemos importarlo antes.


El resultado final del componente principal contenido en App.js es el siguiente:


5. Finalmente, para mostrar las películas de forma ordenada, agregamos algunos estilos CSS al final del archivo App.css, para aplicarlos globalmente a través del componente principal:


El resultado es el siguiente:
El código fuente de este ejemplo lo pueden encontrar acá: https://github.com/guillegr123/react-primera-app

Intenté que los commits fueran quedando conforme a cada paso descrito en esta entrada del blog. Pueden consultarlos acá: https://github.com/guillegr123/react-primera-app/commits/master

Conclusiones

Después de haber hecho esta primera prueba con React, resulta que se parece a Vue 2, jajaja. Al menos hasta donde pude ver, el concepto de componente es similar. Seguiré viendo qué tan parecido es a medida vaya progresando con esta herramienta.

Saludos. Happy coding!

jueves, 16 de agosto de 2018

SQL Server Snippets - Columna de fecha de última modificación en SQL Server

Supongamos que por cuestiones de control de modificaciones y auditoría, se quiere contar con un campo de fecha de última modificación en todas las tablas de una base de datos de SQL Server.

El inconveniente es que SQL Server no posee nativamente un tipo de dato que guarde la fecha de última modificación de un registro, el cual se actualice automáticamente al modificar una fila de datos. Por ello, una alternativa a esto es definir una columna de tipo datetime en cada tabla que se actualice cada vez que se modifique uno o más registros de esta, a través de un trigger.

Futuros nuevos posts... (viejo post del 2013)

¡Howdy! No pude resistirme, tengo varios posts en mente, pero no he tenido el tiempo de escribirlos, así que para mientras, quiero comentarles mis ideas, que espero alguna vez publicar:
  • Técnicas DRY para SQL Server: Son varias ideas para evitar código repetitivo en SQL Server.
  • Más SQL Server Snippets:Sé que tengo un par más por allí...
  • El regreso de las ventanas DIV: Ventanas DIV móviles, con sombra y otros efectos.
  • Symfony 2 y casos especiales de Symfony 1.4: Casi siento que he traicionado a Symfony por MVC, pero espero retomar el tema en este año, y compartir algunas cosas interesantes sobre la vieja y confiable versión 1.4.
  • Instalación de Oracle en Ubuntu: Ya tengo el PDF, y me gustaría publicarlo. Fue una tarea que hicimos en conjunto con unos amigos para la materia de Administración y Seguridad de Bases de Datos en la universidad. Ha sido el proyecto de computación más frustrante que he hecho hasta la fecha, creo que repetimos la instalación al menos unas 15 veces en dos semanas, hasta que sirvió... Menos mal que existía VirtualBox, porque si no, nos hubiera tocado formatear la computadora de pruebas 15 veces, jajaja...
  • FluentViewModel: La cereza de mi sundae, jejeje. Es un proyecto en C# que hice, que consiste en una interfaz fluida para la definición de Modelos de Vista (View Models) en MVC Framework, que hace uso de clases genéricas y expresiones lambda. Está basado en FluentValidation para .NET. Espero publicar el código fuente como Open Source algún día.
Espero publicar estos posts en un futuro cercano, ojalá lo logre...

Saludos, feliz viernes :)

Publicado originalmente el 2013-03-14, en https://itsouvenirs.wordpress.com/2013/03/14/futuros-nuevos-posts/.

Viejos posts publicados

Saludos a todos. Estuve revisando un poco mis documentos y encontré algunos posts que ya tenía listos para publicar desde hace varios años. Un par de ellos fueron colaboraciones al blog de un amigo de la universidad, y otros en realidad son manuales que escribí para acordarme cómo hacer las cosas. Les dejo abajo los enlaces a dos de estos posts, y espero posteriormente incluir otros más:
Para finalizar esta entrada, les dejo una frase un tanto soberbia de Nikola Tesla, con respecto al trabajo de Thomas Alva Edison:
"If Edison had a needle to find in a haystack, he would proceed at once with the diligence of the bee to examine straw after straw until he found the object of his search... I was a sorry witness of such doings, knowing that a little theory and calculation would have saved him ninety per cent of his labor."
- Nikola Tesla, New York Times, October 19, 1931
Traducido:
"Si Edison tuviera que encontrar una aguja en un pajar, procedería inmediatamente con la diligencia de una abeja a examinar paja por paja hasta que encontrara el objeto de su búsqueda... Fui testigo arrepentido de tales hechos, sabiendo que un poco de teoría y cálculo le hubiera ahorrado el noventa por ciento de su tarea."
- Nikola Tesla, New York Times, 19 de octubre de 1931
Es muy curioso que esta frase parece mostrarse reactiva o contrastante a la siguiente frase de Edison:
"No me equivoqué mil veces para hacer una bombilla, descubrí mil maneras de cómo no hacer una bombilla."
- Thomas Alva Edison
Esta frase la encontré en un archivo viejo en el que tenía una recopilación de frases que me habían llamado la atención. Nikola Tesla es uno de mis científicos favoritos, y según parece sus invenciones no son muy conocidas incluso en la actualidad, en comparación con el trabajo de Thomas Alva Edison.

Feliz día.

Publicado originalmente el 2013-03-04, en https://itsouvenirs.wordpress.com/2013/03/04/viejos-posts-publicados/.
Con la tecnología de Blogger.