miércoles, 28 de febrero de 2018

Pensamiento Computacional con Wolfram Language - 0.0 - Todo Empieza Aquí

Todo Empieza Aquí

Cuando se trata de aprender y buscar una fuente inspiradora y generadora de curiosidad, uno puede empezar por hallar buenos libros que alimenten el deseo por el autodidactismo (o autogogía): seguramente podrán encontrarse ejemplares valiosos en estantes físicos o digitales. Y sin ir más allá, a unas pulsaciones del teclado o desplazamientos del mouse se abre un espacio infinito y emocionante: me estoy referiendo a Internet. Sin duda un espacio virtual que brinda una oportunidad tremenda para adentrarse en admirables, si no alucinantes, tópicos de aprendizaje.

¿A qué quiero llegar con el breve mensaje anterior? Simple y llanamente a un recurso invaluable: un libro digital que es fuente para el desarrollo del pensamiento computacional -no cabe duda de que es la habilidad que permeará los espacios educativos, laborales, el quehacer diario-... En fin, puede uno percatarse que este enfoque ya hace parte de la literatura de los primeros académicos. Y existen ejemplos de herramientas computacionales para habilitar el aprendizaje desde temprana edad:
Pueden encontrarse en la red una miríada de recursos similares para el aprendizaje del pensamiento computacional.

Sin elongar más en palabras, presento este recurso que será fuente para el desarrollo de de habilidades esenciales para el pensamiento computacion: Wolfram Language -el lenguaje de programación y un libro guía para su aprendizaje: An Elementary Introduction to The Wolfram Language.
Libro Wolfram Language
Figura 1. Libro Wolfram Language.
A partir de ahora se presentará contenido en formato de recetas y problemas para la ejercitación de la mente y desarrollo habilidades computacionales relevantes y útiles para la resolución de problemas existentes y emergentes.

Dejo esta publicación hasta este punto. Tengo mucho que contarles; así que atentos a nuevas publicaciones y mucho ánimo aprendiendo.

Continuará...

Literatura & Enlaces

Wolfram Language for Knowledge-Based Programming (2018). Recuperado desde: https://www.wolfram.com/language/
Introducción a Scratch 2.0 (2018). Recuperado desde: https://ortizol.blogspot.com.co/2014/02/introduccion-scratch-20.html
Download Kodu Game Lab from Official Microsoft Download Center (2018). Recuperado desde: https://www.microsoft.com/en-us/download/details.aspx?id=10056
Alice – Tell Stories. Build Games. Learn to Program. (2018). Recuperado desde: https://www.alice.org/
Anybody can learn | Code.org (2018). Recuperado desde: https://code.org/
Homepage | Minecraft: Education Edition (2018). Recuperado desde: https://education.minecraft.net/
O

Receta C# No. 7-9: Autocompletar en una Lista Desplegable

1. Problema

Usar una lista desplegable para autocompletar el contenido a medida que el usuario escribe.

2. Solución

Los controles ComboBox y TextBox cuentan con con las propiedades AutoCompleteMode -determina el comportamiento de autocompletado-, y AutoCompleteSource -especifica la fuente de datos para el autocompletado (Jones, Freeman, 2010).

3. Código C#


La interfaz está compuesta por 3 controles ComboBox:
  1. El primero (cbxAutocompletado1) autocompleta mostrando todas las opciones disponibles a medida que se escribe. No tiene lista de elementos.
  2. El segundo (cbxAutocompletado2) tiene como fuente una lista de elementos.
  3. El tercero (cbxAutocompletado3) tiene como fuente de datos los URL del historial de navegación.
Prueba de ejecución:
Autocompletado en ComboBox
Figura 1. Autocompletado en ComboBox.

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

Receta C# No. 7-8: Restringir a un Campo de Texto para Aceptar una Entrada Específica

1. Problema

Restringir a un campo de texto para aceptar una entrada específica.

2. Solución

Entre los controles especializados para esta tarea se halla MaskedTextBox: se debe establecer su propiedad Mask para determinar el tipo de entrada a aceptar.

3. Código C#


Los handlers para cada uno de los seis botones establecen un tipo de máscara:
  • Hora
  • ZIP de Estados Unidos
  • ZIP de Reino Unido
  • Moneda
  • Fecha
  • Clave

Prueba ejecución:
Uso de máscara moneda
Figura 1. Uso de máscara moneda.

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

martes, 27 de febrero de 2018

Programación Funcional en LINQ - 2.19: Teoría de Números: Generar Triángulo de Pascal (Versión Iterativa)

1. Problema

Generar un triángulo de Pascal.

2. Solución

Para la solución de este problema no se usará recursión; a razón de que puede resultar lento y podría ocasionar un desbordamiento de memoria.


Se recurre al uso de la técnica de memorización: almacenamiento externo para guardar cálculos, y que éstos sirvan para las siguientes iteraciones (Mukherjee, 2014).

3. Código C#




Aunque el código anterior incluye comentarios, valdría la pena hacer notas acerca de cómo se generan los nuevos valores:
  • Línea 32-33: El método de extensión First busca la primera coincidencia que cumpla la condición:

    v => v.Item1 == (filaActual - 1) && v.Item2 == (j - 1)

    Esto quiere decir que va a buscar el Item1 que cumpla la condición (filaActual - 1): fila anterior; y además, el Item2 que cumpla condición (filaActual - 1):  columna anterior.

    De forma análoga para el ítem que suma el siguiente valor de la fila anterior y de la columna actual:

    v => v.Item1 == (filaActual - 1) && v.Item2 == j

    Nótese que la expresión v.Item2 == j hace referencia al valor (Item3) que está enseguida de la columna anteriormente encontrada.
Prueba de ejecución:
Triángulo de Pascal con 12 filas.
Figura 1. Triángulo de Pascal con 12 filas.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Receta C# No. 7-7: Desplazar un Control Lista al Elemento Recién Agregado

1. Problema

Desplazar el scroll (barra de desplazamiento) de un control tipo ListBox al elemento recién agregado.

2. Solución

La clase ListBox cuenta con la propiedad TopIndex para indicar el primer elemento visible dentro de la lista (Jones, Freeman, 2010).

3. Código C#


Cuando se hace click en el botón integral de la interfaz se ejecuta el handler de las líneas 13-22; ahí ocurren las siguientes operaciones:
  • Líneas 15-18: Iteración para agregar 20 elementos al ListBox.
  • Línea 20: Se establece la propiedad TopIndex con el valor del índice del último elemento agregado: lbxElementos.Items.Count - 1
  • Línea 21: Se elecciona el último elemento agregado a la lista.
Prueba de ejecución:
Desplazamiento ListBox al último elemento agregado
Figura 1. Desplazamiento ListBox al último elemento agregado.

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

Receta C# No. 7-6: Guardar la Configuración de un Formulario

1. Problema

Guardar los ajustes de configuración de un formulario.

2. Solución

En .NET se cuenta con Application Settings: funcionalidad que permite en tiempo de diseño especificar la configuración de los formularios que se debe guardar (Jones, Freeman, 2010).


Desde la caja de Propiedades (Properties) del control seleccionado se especifican las configuraciones particulares para ese elemento.
Application Settings para un control
Figura 1. Application Settings para un control.

Los ajustes de configuración se guardarán en la clase Settings: Esta clase implementa el patrón singleton, y cuenta con las propiedades de cada uno de los nombres de configuración definidos. Esto facilita que al momento de carga de la aplicación, los controles definidos en la interfaz carguen su configuración.

3. Código C#


Nótese cómo en las líneas 15-23, cuando se hace click en un botón, se cambia el color de fondo del campo de texto.


En la línea 23 se cambia el color del texto modificando la propiedad definida ColorTexto.


Mientras que se cierra el formulario, líneas 27-35, se guarda la configuración del formulario.

Repositorio: https://github.com/Fhernd/Recetas.CSharp

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

lunes, 26 de febrero de 2018

Receta C# No. 7-5: Encontrar Todos los Formularios Hijos en un Contenedor MDI

1. Problema

Entontrar todos los formularios hijos visibles de una aplicación MDI (Multipl-Document Interface).

2. Solución

Un componente MDI padre cuenta con una propiedad -MdiChildren-; la cual es una colleción de todos los formularios hijos (Jones, Freeman, 2010).

3. Código C#

Para esta receta se crearán dos formularios:
  1. Formulario padre como contenedor MDI: se debe especificar la propiedad IsMdiContainer en true.
  2. Formulario hijo representando por la clase FormularioHijo: contiene un botón para mostrar la información de todos los formularios hijos del formulario padre, y un Label con la información de fecha y hora.
Operaciones el evento click del ítem de menú de Archivo:
  1. Línea 15: Crea un nuevo formulario hijo.
  2. Línea 16: Le asigna el MDI padre al formulario actual -this.
  3. Línea 17: Hace que se muestre el formulario hijo en el contenedor padre.

En este caso las operaciones relevantes son:
  1. Línea 25: Al cargarse el formulario se asigna la fecha y hora actuales al Label que integra la interfaz del formulario.
  2. Líneas 13-21: Cuando el usuario hace click sobre el botón que integra la interfaz, se itera cada uno de los formularios contenidos en el formulario MDI padre.
Prueba de ejecución:
Formularios hijos de un contendor MDI
Figura 1. Formularios hijos de un contendor MDI.

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

Programación Funcional en LINQ No. 2-18.4: Teoría de Números - Generar Factoriones

1. Problema

Generar factoriones en LINQ.

2. Solución

Un factorión es un número natural que es igual a la suma del factorial de sus dígitos. Algebraicamente, queda expresado como:
Definción algebraica de un factorión

Un ejemplo sería 145:


145 = 1 + 24 + 120 = 1! + 4! + 5!

3. Código C#


En las líneas 12-25 está definido el método de extensión Digitos(): permite descomponer un número dado en sus dígitos.


Por su parte, el método Main() (líneas 1-8) efectúa las siguientes operaciones:
  • Línea 3: Genera un rango de números enteros entre 0 y 1000.
  • Línea 4: Aplica el filtro que comprueba que la suma del factorial de los dígitos de k es igual a k:
    • Línea 5: Un nuevo filtro es aplicado para obtener sólo aquellos digítos que son mayores a 0: n > 0
      • Línea 6: Se hace la proyección que consiste en calcular el factorial de cada uno de los dígitos y luego hallar su suma:

        Select(d => Enumerable.Range(1, d).Aggregate((x, y) => x * y)).Sum()
Prueba de ejecución:
Factoriones
Figura 1. Factoriones.

4. Literatura & Enlaces

Bernard J. (2016). Python Recipes Handbook: A Problem-Solution Approach. Canada: Apress.

O

domingo, 25 de febrero de 2018

Programación Funcional en LINQ No. 2-18.3: Teoría de Números - Obtener Números Suma-Producto

1. Problema

Generar números suma-producto utilizando LINQ.

2. Solución

Un número suma-producto es un entero que se obtiene a partir del producto entre la sumatoria y la productoria de los dígitos. Esta definición se puede expresar así:
Definición algebraica de un número suma-producto

La variable l indica la cantidad de dígitos en el número; y las variables d con índice i o j indican el enésimo dígito del número n.

3. Código C#


En las líneas 14-26 se define el método de extensión Digitos(); este método se usa para obtener cada uno de los dígitos de un número como una secuencia.


Entre las líneas 1-9 está definido el método Main(); aquí ocurren las siguientes operaciones:
  • Línea 3: Se genera una secuencia con valores enteros entre 0 y 1000.
  • Línea 4: Se aplica la aplicación filtro Where.
    • Línea 5: Para el k número de la secuencia se obtienen sus dígitos.
    • Línea 7: Se comprueba el predicado que define un número suma-producto; es decir:

      digitos.Sum() * digitos.Aggregate((x, y) => x * y) == k

      Si el producto entre la sumatoria y la productoria de los l dígitos del k número es igual k, entonces k es un número suma-producto.
Prueba de ejecución:
Números suma-producto entre 0 y 1000.
Figura 1. Números suma-producto entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Programación Funcional en LINQ No. 2-18.2: Teoría de Números - Generar Números de Dudeney

1. Problema

Generar números de Dudeney usando programación funcional.

2. Solución

El cubo perfecto de un número entero positivo se conoce como número de Dudeney: consiste en sumar cada uno de los dígitos y luego elevarlo al cubo; el resultado será el número original (Mukherjee, 2014).


Por ejemplo:

Número de Dudeney

3. Código C#


El método de extensión Digitos() (líneas 12-24) permite descomponer un número en sus dígitos.


En el bloque de código del método Main() (líneas 1-6) se lleva a cabo las siguientes operaciones:
  1. Línea 3: a través de la función generadora Range() se crea una secuencia de números entre 0 y 1000.
  2. Línea 4: Se aplica la función filtro Where() para obtener sólo los números que cumplan con el predicado que define un número de Dudeney representando por e:
    1. La suma de los dígitos de e al cubo es igual al número e; en otras palabras:

      Math.pow(e.Digitos().Sum(), 3) == e
Prueba de ejecución:
Números de Dudeney entre 0 y 1000
Figura 1. Números de Dudeney entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Programación Funcional en LINQ No. 2-18.1: Teoría de Números - Generar Números de Armstrong

1. Problema

Generar números de Armstrong utilizando los elementos de programación funcional que dispone LINQ.

2. Solución

Un número de Armstrong es número que se obtiene a partir de la suma de los dígitos elevados al cubo (Mukherjee, 2014); es decir:
Número de Armstrong

3. Código C#

Archivo C# numeros-armstrong.cs [enlace alternativo]:



El método de extensión Digitos() (líneas 4-16) es el que permite descomponer un número dado en sus dígitos.


En el método Main() (líneas 19-24) se realizan las siguientes operaciones:
  • Se genera el rango 0-1000: Enumerable.Range(0, 1000)
  • Se utiliza la función filtro Where para comprobar que la suma de los dígitos (cada uno elevado al cubo) es igual al número actual k.
    • Por cada número k del rango (0-1000) se realiza la proyección de elevar al cubo cada dígito (obtenidos con la método de extensión Digitos()); y finalmente aplicar la función estadística de Sum() para sumar todos los cubos.
Prueba de ejecución:
Números de Armstrong entre 0 y 1000.
Figura 1. Números de Armstrong entre 0 y 1000.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

sábado, 24 de febrero de 2018

Receta Multithreading en C# No. 5-9: Usar Tipos Dinámicos con el Operador await

1. Problema

Usar el operadir await con un tipo dinámico de C#.

2. Solución

Para esta receta se usa el paquete ImpromptuInterface: manejo de tipos dinámicos para la versión 4.0 o superiores de C#. Este paquete se agrega desde el administrador de paquetes NuGet (Agafonov, 2013).

3. Código C#

Archivo C# Programa.cs [enlace alternativo]:


Prueba de ejecución:

La tarea se está ejecutando en el thread con ID: 1. ¿Thread en el pool de threads?: true 
La tarea se está ejecutando en el thread con ID: 2. ¿Thread en el pool de threads?: true 

Repositorio: https://github.com/Fhernd/Recetas.Multithreading.CSharp

4. Literatura & Enlaces

Agafonov, E. Multithreading in C# 5.0 Cookbook. Copyright 2013 Eugene Agafonov, 978-1-84969-764-4.
NuGet Gallery | ImpromptuInterface 6.2.2 (2018). Recuperado desde: https://www.nuget.org/packages/ImpromptuInterface/
O

Receta C# No. 7-4: Contar los Formularios Visibles de una Aplicación

1. Problema

Contar los todos los formularios abiertos en una aplicación.

2. Solución

El objeto iterable FormCollection se obtiene desde la propiedade static OpenForms, la cual pertenece al objeto general Application (Jones, Freeman, 2010).

3. Código C#

Se creó una interfaz gráfica con el siguiente formulario y un botón; éste último lanza una ventana de diálogo mostrando la cantidad de formularios abiertos:
Contador de formularios abiertos
Figura 1. Contador de formularios abiertos.

La lógica de click para el botón Contar es esta:

int contadorFormulariosAbiertos = Application.OpenForms.Count;

MessageBox.Show("Cantidad de formularios abiertos: " + contadorFormulariosAbiertos, "Formularios",
                MessageBoxButtons.OK);


Se usa la propiedad Count de OpenForms para inspeccionar la cantidad de formularios abiertos actualmente.


Repositorio de recetas C#https://github.com/Fhernd/Recetas.CSharp

4. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

O

viernes, 23 de febrero de 2018

Programación Funcional en LINQ No. 2-17: - Colecciones - Encontrar el Valor Mínimo y Máximo por Índice

1. Problema

Encontrar el valor mínimo y máximo por índice en distintas sequencias.

2. Solución

El operador Zip se aplica a una sequencia que recibe como argumento otra secuencia, y luego, como segundo argumento los valores de los índices 0, 1, etc. de cada una de las secuencias. Estos valores son comparados con los métodos Math.Min(val1, val2) y Math.Max(val1, val2) (Mukherjee, 2014).

3. Código C#

Archivo C# minimos-maximos-por-indice-secuencias.cs [enlace alternativo]:

Prueba de ejecución en LINQPad:
Mínimos y máximos por índice en secuencias
Figura 1. Mínimos y máximos por índice en secuencias.

4. Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.

O

Receta Python No. 16-4: Leer Datos desde el Bus GPIO de una Raspberry Pi

1. Problema

Leer datos provenientes del bus GPIO de una Raspberry Pi.

2. Solución

El módulo RPi.GPIO de Python permite leer datos de entrada del bus GPIO de una Raspberry Pi (Bernard, 2016).

3. Código Python

4. Literatura & Enlaces

Bernard J. (2016). Python Recipes Handbook: A Problem-Solution Approach. Canada: Apress.

O