Coding to learn

No soy mucho de ver vídeos, pero a lo largo de este tiempo he encontrado algunos (obviamente relacionados con la programación) que realmente disfruto ver una y otra vez. Los dejo a continuación:

Learning to Code, Coding to Learn.

There is nothing a Code can't do.

Code Stars.


Los tengo que encontrar en español, o al menos con subtítulos. Lo prometo.
¡Saludos!
@fferegrino :)

Reference App (C#, XAML y ¿algoritmia?)

Hoy es día de presentarles otra app, en este caso es una que conjunta varias de las cosas que aprendí en MVA ya que se trata de una implementación "completa", es decir la conexión con la base de datos, el servicio web y la aplicación cliente. La idea de la aplicación fue simular una guía de consulta que suelen emplear los competidores en concursos de programación y digo simular puesto que:

  1. es muy poco probable que en una competencia te permitan sacar tu teléfono o tablet.
  2. el contenido de la app es bastante genérico, probablemente sea mejor que tu tengas una guía que hayas hecho tu a tu medida
En fin, la descripciones de las aplicaciones son:

Reference.Data
Ubicadoen el servidor (este proyecto es una librería de clases), el código facilita la conexión a la base de datos alojada en azure, conexión hecha con la ayuda del Entity Framework V 6.1.1

Reference.WebRole
Este proyecto aloja el servicio web al cual se realizan las consultas, es decir, se conecta con Reference.Data.

Reference.Cloud
Es solo un proyecto que envuelve el WebRole y permite que sea publicado como un servicio de la nube de Azure.

Reference.Apps.Shared
Proyecto compartido que contiene todos los rescursos y clases que tienen en común las aplicaciones para Windows y Windows Phone, recursos como estilos, ViewModels y la conexión al servicio web.

Reference.Apps.Windows
El proyecto de la aplicación para Windows 8.1 que contiene código específico de para tablet/pc. Hace uso del paquete de Nuget MVVM Light (solo liberías).

Reference.Apps.WindowsPhone
El proyecto de la aplicación para Windows Phone 8.1 que contiene código específico de para el teléfono. Hace uso del paquete de Nuget MVVM Light (solo liberías).

Reference.Tools.CodeTransformer
Una herramient simple para transofrmar el código para que sea almacenado en la base de datos a algo que el servicio web y las aplicaciones puedan entender.

Otra cosa a resaltar es que todo el código está disponible en CodePlex para su descarga, y las aplicaciones están también en la tienda. Por el momento la app carece de contendio, cosa que espero ir ampliando a la par de mi aprendizaje en el Club de Algoritmia de ESCOM:



¡Saludos!
@fferegrino :)

Aprende ruso


De nuevo en época de vacaciones aproveché el tiempo y me puse a completar cursos en MVA, uno de ellos, llamado Designing Your XAML UI with Blend Jump Start me motivó a crear una aplicación un tanto diferente a las que ya había hecho, y es que esta es visualmente más atractiva.

La aplicación en cuestión se llama Aprende Ruso, y como su nombre lo indica, es una pequeña guía para los que apenas van iniciando en el aprendizaje de esa extraño idioma. La aplicación tiene cosas simples, como las letras, algunos números y frases comunes, la idea es que la iré extendiendo conforme aprenda más de el lenguaje.

Técnicamente la aplicación hace uso de algunos controles para Windows 8.1 y Windows Phone 8.1, además de que ambos proyectos comparten la misma lógica, bajo el concepto de las Universal Apps de Windows, es por ello que al momento de que descargas la app en una de esas dos plataformas tienes automáticamente disponible la descarga para la otra. Por cierto, tengo todo el código fuente en un repositorio de GitHub, por si le quieres echar un ojo, mejorarla o contribuir con el desarrollo.

Usa los enlaces para descargar la app para tu dispositivo:


¡Saludos!
@fferegrino :)

Extendiendo Construct 2 con C++

Últimamente me he dedicado de lleno a aprender sobre videojuegos, desde el diseño y planeación hasta el desarrollo y publicación. A la par he estado trabajando en un juego para Windows/Windows Phone 8.1 llamado Falling Dodge desarrollado casi por completo en Construct 2.

Y digo casi por completo porque hay algunas cosas que no es sencillo realizar dentro de C2 o bien, no entendemos de primera mano cómo se hace. Por ello decidí aprovechar los runtime components delegando cargas de trabajo pesado o complicado a C++. Con ello podemos aprovechar toda la facilidad de manejo de canvas, colisiones, sprites y otras tantas que nos otorga Construct 2 mientras que dejamos la carga pesada de operaciones matemáticas, algoritmos complejos, etc. al runtime component.

Como ya les había contado antes, podemos llamar a rutinas escritas en C++ mediante JavaScript y para llamarlas desde Construct 2 a nuestro juego debemos crear un plugin que haga uso de él. En el gráfico más abajo trato de explicar un poco mejor cómo es que se realiza. Podrá parecer bastante, pero lo que está rodeado con un borde amarillo es lo único que nos toca hacer a nosotros (bueno, eso y referenciar los proyectos manualmente).


A modo de ejemplo, me he creado un "juego" que nos pide colocar una cierta cantidad de árboles y luego los une formando el árbol de mínima expansión empleando el Algoritmo de Kruskal. He dejado todo el código necesario en GitHub dentro del repositorio kruskal-cpp2 o bien, descargar todo el proyecto en zip además de que ya saben que cualquier duda o comentario pueden dejarlo acá o escribirme y con gusto responderé.

¡Saludos!
@fferegrino :)

win-plus-c2, un plugin para Construct 2 y las Universal Apps


Hacía mucho que no le metía la mano a Construct 2 y ahora que lo volví a hacer, gracias a la unidad de aprendizaje Ingeniería de Software, me di cuenta que si bien es una herramienta extremadamente útil para realizar juegos y prototipos rápidos utilizando HTML5 tiene ciertas limitantes a la hora de querer realizar una aplicación preparada para cualquier tienda de apps.

La gran ventaja que nos presentan sus creadores es la posibilidad de extender nuestro juego a través del Construct 2 Javascript SDK y el empleo de plugins. Y es precisamente eso lo que tuvimos que ya que nuestra aplicación debía cumplir ciertos requisitos de diseño para contar como un proyecto de buena calificación.

El plugin se enfoca por completo en extender Construct 2 para el desarrollo de aplicaciones para Windows Store y más recientemente de la Windows Phone Store (aunque ahora estará centrado en las aplicaciones universales). El plugin nos ayuda a presentar mensajes en la pantalla, identificar cuando la aplicación pierde foco, cuando la pantalla es cambiada de tamaño, entre otras cosas.

El código está en GitHub win-plus-c2 junto con los archivos .c2addon listos para instalar y un poco de documentación. Desde luego, espero que quieran contribuir al desarrollo con código o sugerencias.

¡Saludos!
@fferegrino :)

Hora de formatear

Terminando el ciclo escolar fue hora de formatear mi computadora personal, era necesario después de casi un año sin hacerlo. La novedad fue que ahora no tuve que respaldar nada de información en un disco externo gracias a OneDive, Dropbox y GitHub. Casi todos mis archivos escolares de este semestre estaban alojados en OneDrive, mientras que algunos otros estaban en Dropbox, para el código de los proyectos usé GitHub (hay un proyecto que inclusive está ahora en una tienda de apps). 

Por primera vez el formateo fue más rápido  de lo ya era. En menos de 15 minutos ya estaba con la computadora como nueva. Este es el software que le instalé:

  • SO: Windows 8.1 Pro
  • De IDEs: Microsoft Visual Studio Ultimate 2013 Update 2, Construct 2, NetBeans 8.0 y ADT Bundle
  • Navegadores: Internet Explorer y Google Chrome
  • Editores: Notepad++
  • Otros: Office Professional 2013, VirtualBox, GitHub for Windows, Paint.NET, WinMerge, Dropbox
  • Además de los compiladores libres de C y C++ que vienen con Cygwin.

No es mucho pero será suficiente para divertirme estas vacaciones con algunos de los proyectos que espero contar por acá más adelante.


¡Saludos!
@fferegrino :)

Puro AC, un nuevo blog

A pesar de mi poca experiencia en la solución de problemas de programación competitiva he decidido crear un blog para explicar algunos de los que vaya resolviendo de entre todas las plataformas que hay en línea tratando de explicar lo escencial del problema, detallar la solución, la complejidad de esta y el códdigo (o en su caso, pseudocódigo), siguendo la manera en que se escriben las editoriales de cada problema en Code Chef, como la entrada anterior a esta, mi editorial del problema Chef and Digits.

A esta iniciativa se sumará mi amigo y compañero de equipo Adrián Fernandez (@ferProgramming en Twitter), quien además propuso que en el blog también se explicaran además algunos algoritmos, estructuras y técnicas de programación que ambos estamos aprendiendo en el Club de Algoritmia, del que ya les había hablado antes.

En el blog he invertido algo de tiempo, dejándolo a punto con algunos extras y mejoras, como MathJax para que se vean mucho mejor las expresiones matemáticas, google-code-prettify para mejorar la apariencia del código escrito y el traductor de Google Translate, para traducir cualquier entrada a cualquier idioma disponible. Sin dejar de mencionar los plugins sociales para hacer que compartir una entrada en particular sea sencillo y a la vez descriptivo para quien lo lea.

Otro punto importante es que modifiqué la plantilla para que fuera adaptable a dispositivos móviles con un diseño responsivo. Además es posible imprimir la explicación ya que con el uso de @media queries pude crear una versión del blog que fuera amigable para imprimir (tamaño adecuado, colores en blanco y negro, etc...)

Sin más les dejo el enlace al blog, que hasta el momento cuenta con 3 entradas explicando soluciones a problemas, a la espera de que mi compañero publique algo más.


PD: Si te gustaría anexarte a la iniciativa, deja un mensaje en esta entrada o escríbeme por donde quieras. Entre más seamos, mejor.

¡Saludos!
@fferegrino :)

Chef and Digits (ADIGIT) - Editorial

Link al problemaADIGIT (Practice)
Link al editorial en CodeChefADIGIT - Editorial

Dificultad: Fácil

Problema:
Dados $N$ ($N ≤ 10^5$) dígitos y $M$ ($M ≤ 10^5$) consultas que consisten en un entero $x$ ($1 ≤ x ≤ N$), que llamaremos step (paso), imprimir el resultado de $B1 - B2$, donde:
  • $B1$ := Sumatoria de todos los $b = a_x - a_y$ tal que $x > y$ y $b > 0$
  • $B2$ := Sumatoria de todos los $b = a_x - a_y$ tal que $x > y$ y $b < 0$

Solución:
Veamos el siguiente caso, con entrada a = 0123152397

Calculando los valores para todos los pasos tenemos lo siguiente:

En la tabla anterior he marcado dos casillas, para observar a detalle lo que sucede:
  • Para el paso 4 tenemos: $B1 = (3 -0) + (3 - 1) + (3 - 2) = 6$ y $B2 = 0$ lo cual nos da el valor de $6$
  • Para el paso 8 tenemos: $B1 = (3 - 0) + (3 - 1)+  (3 - 2) + (3 - 1) + (3 - 2) = 9$ y $B2 = (3 - 5) = - 2$, por lo tanto tenemos $B1 - B2 = 11$
Observando las ecuaciones anteriores, podemos notar que el paso 11 se compone del paso 3 en las sumas $(3 - 0) + (3 - 1)+ (3 - 2)$ más otras 3 sumas, así que ¿qué pasaría si los almacenamos para no volver a calcularlo todo? Basándonos en eso, almacenamos los resultados en otro arrelgo.

Ahora, ¿cómo es que sabemos que tenemos un valor ya calculado?, esto es sencillo de encontrar y ocurre cuando los números $a_x$ y $a_y$ son iguales. Si los calculamos de manera secuencial, es decir de 1 hasta N, estaremos garantizando que para cada paso los pasos previos ya estarían precalculados, como solo hay 10 dígitos distintos, en el peor de los casos terminaremos sumando 10 veces. Al terminar el precálculo, para cada consulta que nos hagan la respuesta será obtenida en tiempo constante

Complejidad: $O(10 * N) + O(M)$

Código (C++):
Definiremos un arreglo A, donde A[i] es es valor de paso i-ésimo del problema y s, un arreglo de char, donde s[j] es la posición del dígito j-esimo.
void precalc(){
 int t = 0;
 for(int step = 0; step < n; step++){
  int ans = 0;
  for(int i = step-1; i >= 0; i--){
   t = (s[step] - '0') - (s[i] - '0');
   if(t == 0){
    ans += A[i];
    A[step] = ans;
    break;
   }
   ans += abs(t);
   A[step] = ans;
  }
 }
}
Haciendo que para responder a las consultas q, solo será necesario imprimir el valor almacenado en A[q-1]
int main(){
 scanf("%d%d",&n,&m);
 scanf("%s",s);
 precalc();
 while(m--){
  scanf("%d",&q);
  printf("%d\n",A[q-1]);
 }
 return 0;
}

¡Saludos!
@fferegrino :)

Leyendo de la entrada estándar con scanf y fgets

Hace tiempo, les contaba que me inicié en la programación competitiva, en la cual, la mayoría de problemas nos piden leer información de la entrada estándar o stdin seguramente me lo van a creer... yo no sabía cómo hacerlo de una manera "correcta" (._. ), en especial cuando de cadenas se trataba. En este post trataré de explicar cómo es que lo hago (y he aprendido que lo hacen) en C o C++.

La función scanf

Esta función mágica llega a nosotros gracias a la librería <stdio.h> en C o <cstdio> en C++, resulta la manera básica de recuperar valores. Nos sirve para todo tipo de entradas y si no tienes algo muy complicado de leer, esta es tu mejor opción, recuerda que esta función trata de leer el tipo de dato que le especifiques hasta que encuentra un salto de línea o un espacio en blanco. El uso de esta función depende de los especificadores de formato para recuperar los valores que deseas.

Por ejemplo, supongamos que tenemos la siguiente entrada
10 3161565164181
aab baa aba
y este código para leerlo
int a;
long long int b;
char cadena[15];
scanf("%d %lld", &a, &b); 
scanf("%s", cadena); // 'cadena' es ya una referencia a memoria
Una vez que se ejecute, en a tendremos 10, en b tendremos 3161565164181 y cadena será "aab" (¡porque solo lee hasta el espacio en blanco!).

La función fgets

Pero, qué pasa si la entrada es un poco más complicada, como la del problema Wetlands of Florida en la que vienen secuencias de caracteres seguidas inmediatamente por un par de números enteros:
// ...
LLLLLLLLL
3 2
// ...
Para ello se ocupa la función fgets (que es parecida a gets, solo que más segura), en combinación con sscanf que funciona de manera similar a scanf solo que esta "lee" de una secuencia de caracteres y no de stdin. En cuanto a fgets, sus parámetros son: la dirección de memoria, la cantidad de caracteres que esperamos leer como máximo, y el flujo del que los vamos a extraer, de tal manera que tenemos algo así:
int i, j;
char entrada[10];
fgets(entrada,10,stdin);
// Procesamos 'entrada', que contiene la siguiente secuencia de caracteres: 
// 'L','W','W','W', 'L', 'L', 'L', 'L', 'W' y '\n' <= ¡Sí! el salto de línea
// Recuperamos los enteros:
fgets(entrada,10,stdin);
sscanf(entrada,"%d %d",&i,&j);
Ya para finalizar es necesario remarcar esto: fgets recupera hasta que encuentra el salto de línea. Repito: fgets recupera hasta que encuentra el salto de línea por lo que es necesario eliminarlo "a manita" con '\0' si es que no es lo que deseamos de él. 
Espero que les sirva como a mi me ha servido, ya que hay que recordar que una parte importante de resolver los problemas es saber interpretar de manera adecuada la entrada que nos dan, así como saber introducirla dentro de nuestra probable solución a este.


¡Saludos!
@fferegrino :)

Métricas y estimación de software [y otra app]

En el ámbito del desarrollo de software (y en especial cuando se habla de proyectos grandes), es necesario conocer el tamaño de un proyecto de desarrollo, por diversos motivos, entre los que podemos encontrar algunos como los siguientes:

  • Debemos conocer el costo del proyecto para presentar una propuesta al cliente
  • Deseamos saber cuántos programadores necesitamos para completar el proyecto
  • Buscamos una fecha de finalización aproximada para fijar los plazos de entrega

Esto podría sonar fácil si es que llevamos ya bastante experiencia en el desarrollo de software, ya que podríamos estimar al aire los datos anteriores. Sin embargo, en el campo de la ingeniería de software existen unas herramientas llamádas métricas, que nos ayudan a resolver muchas dudas como las propuestas anteriormente.

Nuestra amiga Wikipedia nos dice que: Una métrica es la medida de alguna propiedad de alguna parte de software o de sus especificaciones. Dado que mediciones cuantitativas son escenciales en todas las ciencias (ehem, iIngeniería de software). La meta de las métricas es producir información objetiva, reproducible y cuantificable que tiene aplicaciones valiosas en la calendarización, realización de presupuestos, aseguramiento de la calidad, manejo de personal... 

En mi opinión sirven para dar un estimado rápido y aproximado, puesto que muchas de ellas parecen ser muy idealistas o nos piden datos que en realidad son cualitativos y realizar una conversión a cantidades medibles resulta muy subjetivo y complicado. Pero de que tienen utilidad, la tienen y muy amplia y aceptada.

tl:dr: Para la unidad de aprendizaje Ingeniería de Software que curso en la ESCOM, la maestra nos solicitó como un proyecto extra la realización de una aplicación que calculara métricas y estimación de un proyecto Software. Y pues ya ven como es uno, la cosa era sencilla y pues un rato de ocio no se le niega a nadie. La app es bastante sencilla y puede ser mejorada (y tiene que ser mejorada) porque ahora solo calcula la métrica de Punto Función. Les dejo el link por si la quieren checar, bajarla y hacerle lo que quieran.




¡Saludos! 
@fferegrino :)

El Club de Algoritmia de la ESCOM y mi arrepentimiento

[Se supone que la primera regla del club es no hablar de él, pero meh]


A partir de este semestre por fin entré al Club de Algoritmia de la ESCOM, al cual desde mi llegada a la ESCOM tuve ganas de entrar pero por motivos laborales no podía asistir regularmente... tiempo después, cuando ya no tenía tanta carga en el trabajo, ese impedimento más bien se convirtió en un pretexto para mi desidia, sentía que quienes estaban ahí sabían más que yo y que podría no encajar con ellos, que nunca entendería nada de lo que estaban viendo, o que eso de la algoritmia nada más no era para mi.
Que equivocado estaba.

Hay pocas cosas de las que me arrepiento, y créanlo o no, el no haber entrado desde antes a participar en él es una de ellas, todo por mi desidia. Hasta ahora que llevo ya un poco más de un mes asistiendo a las sesiones me doy cuenta de lo equivocado que estaba, he aprendido bastante, los compañeros son de lo mejor y cada vez me motivo más. De vez en vez me haré un tiempo para escribir sobre lo que he visto y me ha fascinado.

Definitivamente enfrentarte a estos tipos de problemas, te abre la mente, te enseña a pensar de maneras distintas para resolver no solo retos de programación, si no de otras áreas. No solo es complicarse la vida o resolver problemas solo por hacerlo como muchos erróneamente dicen.

Seguramente hay personas que piensan lo que yo pensaba pero hay que atreverse, no es tan difícil hacerlo. No te esperes "tanto" (porque nunca es tarde, pero si es posible hay que hacerlo cuanto antes). Si tu, al igual que yo y muchas personas más, tienes interés en la programación competitiva no dudes en acercarte ya sea a este o a uno más cercano a ti. Acá están los capítulos estudiantiles de la ACM en México para que sepas a quién acercarte para ver qué es lo que ofrecen.

¡Saludos!
@fferegrino :)

Prácticas de Aplicaciones para comunicaciones de red

Pues ya estoy de vuelta en la escuela, y esta vez de nuevo hay una asignatura que me da la oportuindad de escribir código, me refiero a la Aplicaciones para comunicaciones de red (o Redes II, pa' los cuates). Al profe le gusta que hagamos prácticas y pues se me ocurrió otra vez abrir un repositorio de GitHub para publicarlas ahí, además de colaborar con mi compañera de equipo @FannyEvia.

Hasta ahora llevamos un servidor de FTP y un carrito de compras...  sobra decir que son muuuuy sencillas, pero funcionan para conocer el concepto, de ahí se pueden hacer tan complejos como uno desee. Las prácticas son solicitadas en Java o C, así que será lo principal que se pueden encontrar en el repositorio, sin embargo C# también se merece una mención, así que en la medida de lo posible también procuraré hacerlas en ese lenguaje.

Ya saben, pueden mirar el código y preguntar :)


¡Saludos!
@fferegrino :)

Los Windows Runtime Components

Hace tiempo descubrí (en MVA) los Runtime Components, estos funcionan como librerías que nos permiten compartir código de distintos lenguajes dentro de una misma plataforma. Es decir, podemos usar código escrito en Visual Basic dentro de una aplicación hecha con C#, o un caso más extremo, y el que más me "impresionó": usar C++ en una aplicación hecha con Javascript. Y digo dentro de una misma plataforma ya que al contrario de las PCL, en este caso solo pueden funcionar para un solo sistema.

Lo que se genera junto con este tipo de proyectos son los metadatos para hacer nuestro código accesibles desde cualquier otro proyecto que haga referencia a él, de tal manera que si creamos un componente en C# desde C++ lo podamos llamar sin escribir ni una sola línea más de código y con la sintaxis del lenguaje desde el que estemos llamándolo.

En este caso me referiré a Windows 8, sin embargo me parece que también existen para Windows Phone 8. El ejemplo es bastante sencillo se trata de un método para realizar una suma, sin embargo es bastante extendible y muy funcional cuando se sabe como usarlos. Desde luego, tiene sus resticciones, pero siempre hay alguna forma de darles la vuelta o encontrar una mejor manera de hacerlo (¡por algo son restricciones!)

De tal manera que podríamos tener el siguiente código en C++:

Suma.h
#pragma once

namespace BlogPost_Component
{
    public ref class Suma sealed
    {
    public:
  // Propiedades
  int a;
  int b;
  // Métodos
  int Resultado();
  // Constructores
  Suma(int x, int y);

    };
}

Suma.cpp
// Suma.cpp
#include "pch.h"
#include "Suma.h"

using namespace BlogPost_Component;
using namespace Platform;

Suma::Suma(int x, int y)
{
 this->a = x;
 this->b = y;
}

int Suma::Resultado(){
 return a + b;
}

De tal modo que podemos usar la clase desde C# de esta manera:
private void Button_Click(object sender, RoutedEventArgs e)
{
 int n1 = int.Parse(numero1.Text);
 int n2 = int.Parse(numero2.Text);

 var suma = new BlogPost_Component.Suma(n1,n2);

 resultado.Text = suma.Resultado().ToString();
}

En JavaScript así:
function accionBoton(sender) {
 var n1 = parseInt(document.getElementById('numero1').value);
 var n2 = parseInt(document.getElementById('numero2').value);

 var suma = new BlogPost_Component.Suma(n1, n2);

 document.getElementById('resultado').textContent = suma.resultado();
};
Y en Visual Basic así:
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
 Dim n1 As Integer = Integer.Parse(numero1.Text)
 Dim n2 As Integer = Integer.Parse(numero2.Text)

 Dim suma As New BlogPost_Component.Suma(n1, n2)

 resultado.Text = suma.Resultado().ToString()
End Sub

El código del ejemplo anterior puede ser descargado aquí.

Como hobbie me puse a convertir el proyecto de la Codificación de Huffman a una aplicación para Windows 8 (escrita en JavaScript con el código de la codificación en C++), hasta el momento me he encontrado con algunas dificultades relacionadas con el acceso a archivos desde aplicaciones Metro, como sea, el proyecto está en GitHub.

PD: Lamento mencionarlo hasta ahora, pero solo es posible crear los componentes en C#, C++ y Visual Basic, lo sentimos, JavaScript.

¡Saludos!
@fferegrino :)