Xwork's Blog

The lord is waiting to take your hand.

Mostrando las entradas con la etiqueta MatLab. Mostrar todas las entradas
Mostrando las entradas con la etiqueta MatLab. Mostrar todas las entradas

Vamos a programar #21 - Formateando código para HTML.

Hola de nuevo a todos. El día de hoy traigo una aplicación muy corta. Cómo todos sabrán, la mayor parte de este blog trata sobre cosas de programación, por lo que es muy común que publique código fuente en variedad de lenguajes.
Pero al momento de publicar algo, surge un pequeño problema, al copiar el código del editor al blog, este pierde todo el formato. Actualmente uso unos scripts que permiten darle color a la sintaxis, pero cosas como la indentación, se pierden. En lo personal, siempre me gusta ver código que este visiblemente bien, es decir; que se distinga en "donde estás". Un indicador muy claro, es la sangría. Si vez que todo está a la misma distancia, resulta fácil ver que todo es parte de un "if" o parte de un "while".
Para solucionar todo esto y poder formatear el código de una forma más rapida, decidí hacer una aplicación que se encargue del trabajo sucio.

La aplicación es realmente simple, de hecho solo son 10 lineas de código, es una versión beta, y lo único que hace es convertir todos los caracteres que no están admitidos en el html (como "< o >" ).
Dentro las funciones que nos proporciona el api de .NET existe a siguiente función:

RtBResultCode.Text = WebUtility.HtmlEncode(RTBInputCode.Text);

Está función se encuentra en el espacio System.Net; y hace exactamente lo que queremos, formatear todo el código para que lo podamos usar en el lenguaje HTML. Pero bueno si solo quisiera hacer eso no sería una solución a la indentación, de hecho si revisamos el siguiente código (que viene de este blog)
<resources>
<string name="app_name">Calculador de resistencias</string>
 <string-array name="Colores1">
 <item>Negro</item>
 <item>cafe</item>
 <item>Rojo</item>
 <item>Naranja</item>
 <item>Amarillo</item>
 <item>Verde</item>
 <item>Azul</item>
 <item>Violeta</item>
 <item>Gris</item>
 <item>Blanco</item>
 </string-array>
 <string-array name="Colores2">
 <item>Dorado</item>
 <item>Plata</item>
 </string-array>
</resources>


Pero eso no es lo que quiero, si nos damos cuenta todas las tabulaciones han sido reemplazadas por espacios que visualmente son más pequeños.
En cambio cuan usamos el código producido por el programa; lucirá de la siguiente forma:

<resources>
<string name="app_name">Calculador de resistencias</string>
 <string-array name="Colores1">
  <item>Negro</item>
  <item>cafe</item>
  <item>Rojo</item>
  <item>Naranja</item>
  <item>Amarillo</item>
  <item>Verde</item>
  <item>Azul</item>
  <item>Violeta</item>
  <item>Gris</item>
  <item>Blanco</item>
 </string-array>
 <string-array name="Colores2">
  <item>Dorado</item>
  <item>Plata</item>
 </string-array>
</resources>

Por ahora el código solo hace eso, pero si por ejemplo el código tiene espacios en blanco, no obtendremos un resultado diferente al del primer caso.

En la siguiente versión vamos implementar funciones que se encarguen de hacer todo de forma automatica. Si lo que quieres es publicar código, lo ,mejor es que luzca, que al momento de echar un vistazo rápido, puedas ver que al menos está bien estructurado.
 Además lo dejo así porque ando un poco corto de tiempo, pero espero ya no estarlo para la próxima semana. Como siempre, el programa lo puedes bajar de dropbox, en cuanto lo actualice haré el siguiente Post.

Por ahora es todo. Los leo luego.

Vamos a programar #14 - Un poco de MatLab

Hola de nuevo a todos, el día de hoy vamos a hacer una pausa a VEncoder y al código de C# para ver un poco de otro lenguaje.
MATLAB (abreviatura de MATrix LABoratory, "laboratorio de matrices") es una herramienta de software matemático que ofrece un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio (lenguaje M). Wikipedia/MatLab


Recientemente una persona me pidió ayuda para hacer algunos scripts que le pedían en la universidad, a pesar de que nunca antes lo había manejado, resulto relativamente fácil empezar a hacer los scripts básicos con los que generalmente se empieza en cualquier lenguaje de programación (llámese "hola mundo").
Lo bueno del scripting de MatLab es que la sintaxis es muy similar a C y VB, de hecho desde mi punto de vista es una mezcla de ambos, entonces eso me facilito un poco comprender como hacer lo sencillo. Cosas especificas de MatLab requieren un poco más de tiempo. MatLab es una herramienta realmente potente y sin ningún esfuerzo se puede empezar con lo básico, pero eso si, para dominarlo tendrás que dedicarlo un buen rato.

Ahora vayamos a lo que quería mostrarles. Hace algunos días publiqué esto:

Si miras la imagen (ignorando la parte de pokemon), notarás que es un script que sirve para calcular los años, meses y días que han transcurrido desde una fecha dada hasta la fecha actual que MatLab obtenga del sistema en el que se ejecuta.
Cuando me lo plantearon, sabia que este tipo de problemas representan un problema para aquellos que apenas inician en el mundo de la programación, este tipo de problemas puede ser un poco "truculento" y cuando le pedí a muchos que los resolvieran, siempre cometían el mismo error.

Resolviendo el problema.

El código en MatLab para calcular las diferencia entre dos fechas es el siguiente:

%%Código por Xwork
%Calcula la edad
clear all
clc
BornDay = input('Que dia naciste?\n');
BornMonth = input('Que numero de mes naciste?\n');
BornYear = input('De que año?\n');
if mod(BornYear,4) == 0
days = [31 29 31 30 31 30 31 31 30 31 30 31];
else
days = [31 28 31 30 31 30 31 31 30 31 30 31];
end
%AA MM DD
ActualDate = fix(clock);

%Calcular años
TotalYear = ActualDate(1) - BornYear;
%Calcular los meses
TotalMonth = ActualDate(2) - BornMonth;
%calcular los dias
TotalDays = ActualDate(3) - BornDay;
if TotalDays < 0
    TotalMonth = TotalMonth - 1;
    if TotalMonth < 0
        TotalYear = TotalYear - 1;
        TotalMonth = TotalMonth + 12;
    end
    TotalDays = days(BornMonth) + TotalDays;
end
if TotalMonth < 0
   TotalYear = TotalYear - 1;
   TotalMonth = TotalMonth + 12;
end
fprintf('Tienes %g Años(s), ',TotalYear)
fprintf('%g Mes(es), ',TotalMonth)
fprintf('%g Dia(s)',TotalDays)

El código es realmente simple, primero le pedimos al usuario que introduzca la información requerida en formato numérico; es decir: se usara el numero de mes en lugar del nombre; ahora supongamos una fecha importante 28/12/1993; se introducirá de la siguiente manera:

  • Que dia naciste?
  • 28
  • Que numero de mes naciste?
  • 12
  • De que año?
  • 1993
Con los datos introducidos, el script avanzará y primeramente encontrará un if que sirve para determinar si un año es bisiesto o no, esto se logra dividiendo el año de nacimiento entre 4 (solo por si acaso, recuerda que los años bisiestos ocurren cada 4 años y se le agrega un día mas a febrero), esto solo lo hacemos para agregar un poco mas de precisión. Después se crea una matriz que contiene la cantidad de días para cada mes; enero tiene 31 días, febrero tiene 28 días normalmente, pero en año bisiesto 29, incluso se podía crear la matriz afuera del if y ya dentro solo editar los días para febrero, pero preferí dejarlo así para obviarlo un poco.
Luego obtenemos la fecha actual con la función clock, pero ademas usamos la función fix para que los valores dentro de la matriz no estén en decimales.
Si llamamos a la función clock esta devolverá la siguiente matriz

   1.0e+03 *
    2.0160    0.0090    0.0050    0.0140    0.0060    0.0513

La primera linea nos indica que todos los valores dentro de la matriz se deben de multiplicar por 1.0e+03, luego los valores de la matriz en orden de izquierda a derecha representan:

  • Año.
  • Mes.
  • Día.
  • Hora
  • Minuto
  • Segundo
Al usar la función fix en la matriz obtenemos los siguiente:

ans =
2016           9           5          14           6          51

Luego vienen los "cálculos". en primer lugar restamos directamente el año de nacimiento (o de la fecha que se quiera) y esto nos daría la diferencia en años que hay entre las dos fechas. Antes de proseguir, debo de mencionar que asi como esta, es propenso a errores, suponiendo que es el año 2016 y alguien pone que nació en el año 2020 obviamente no es posible, pero el codigo asi como esta ahorita devolvería -4, que técnicamente está bien, pero para términos de edad; "menos algo" no es válido.
Para los meses hacemos exactamente lo mismo que con los años, hacemos la resta directamente entre la fecha actual y la fecha de nacimiento (o de lo que sea), en este caso si es posible que nos resulte un numero negativo, supongamos que el mes actual es el mes 10 y el mes de nacimiento es el 12; al hacer nuevamente el calculo obtenemos un valor de -2, por ahora conservaremos ese valor asi como esta.
Luego hacemos el calculo de los días,para eso repetimos lo anterior y al igual que los meses, podemos esperar un resultado negativo, luego procedemos a ajustar los días.
Primero comprobamos si la cantidad de días son menores que 0; si es así restamos a la cantidad de meses que teníamos almacenados y dentro de esa misma comprobación si al momento de restarle a la cantidad de meses, está resulta en un numero negativo, procederemos a restarle 1 a la cantidad de años. Finalmente obtenemos los días agregando los días que contiene el mes al calculo de días que teníamos almacenado.
Luego volvemos a hacer otra comprobación para la cantidad de meses, ya que en el if anterior primero se comprueban los días pero no necesariamente va a entrar a esa condición y como tenemos almacenados los meses directamente como los dio el resultado del calculo previo. Para evitar números negativos le agregamos 12 (cantidad de meses que tiene el año).
Y ya solo resta mostrar el resultado al usuario.

Una explicación un tanto mas humana.

De nuevo tomemos una fecha, la misma que para la explicación anterior: 28/12/1993 y el dia actual es 5/9/2016

  1. 2016-1993=23
  2. 9-12=-3
  3. 5-28=-23
  4. Como el resultado de la resta de los días es negativo, restamos 1 a los meses y nos queda -4. Cómo el resultado es negativo; a los años le restamos 1 y queda 22, luego sumamos 12 a la cantidad de meses que tenemos almacenados y resulta 8. Hacemos la suma de los días que contiene el mes de nacimiento y el numero que tenemos almacenado para los días; diciembre tiene 31 días +(-23)=8
  5. El resultado: 22 años, 8 meses y 8 días.
Hay que entender como usamos los datos, para el caso de los días veamos lo siguiente. para nuestro caso, el dia es 28 de diciembre, este mes tiene 31 días, para "cerrar" al mes, faltan 3 días + 5 que han transcurrido del mes, esto nos da 8, lo mismo para lo meses.

Y bueno por ahora es todo. Dudas o bugs que quieras reportar, no dudes en hacerlo.

Los leo luego.