Integrales

31 Octubre 2007

A una semana de rendir el segundo parcial de Análisis Matemático 1 y sin saber que era una integral baje el Derive (para ir chequeando si los ejercicios que hacia estaban bien) pero es horroroso, por suerte encontré esta pagina, es de los creadores de Mathemática y dada una función te tira la integral.
La url es: http://integrals.wolfram.com/index.jsp

Integrator

VB.Net vs C# parte 1

30 Octubre 2007

Una comparación de sintaxis bien basica:

Estructura de una clase en Vb.Net

Namespace gente

Public Class Persona

    Private _nombre As String

    ‘Propiedades

    Public Property nombre()

      Get

        Return _nombre

      End Get

      Set(ByVal value)

       _nombre = value

      End Set

    End Property

 

    ‘Constructor

    Public Sub Persona(ByVal nombre As String)

       Me.nombre = nombre

    End Sub

End Class

End Namespace

Estructura de una clase en C#

namespace gente

{

    public class Persona

    {

        private string _nombre;

        //Propiedad

        public string nombre

        {

            get { return this._nombre;}

            set { this._nombre = value;}

        }

 

        //Constructor de la clase

        public Persona(string nombre)

        {

            this._nombre = nombre;

        }

    }

}

Operadores en VB.Net

Comparacion
=  <  >  <=  >=  <>

Aritmeticos
+  -  *  /  Mod  \(division de enteros)

Logicos
AndAlso  OrElse  And  Or  Xor  Not
AndAlso y OrElse evaluan en circuito corto
Asignacion
=    +=    -=    *=    /=   \=    &=   <<=   >>=

Concatenacion
+    &

Operadores en C#

Comparacion
==  <  >  <=  >=  !=

Aritmeticos
+  -  *  /  %(Mod)

Logicos
&&  ||  &  |  ^  !
&& y || evaluan en circuito corto
Asignacion
=    +=    -=    *=    /=  %=    &=   <<=   >>=   ++  –
Concatenacion
+
Estructuras de control en Vb.Net

‘If comun

If (nombre = “Juan”) Then

    ‘…

Else

    ‘…

End If

 

‘If con varios else

If (nombre = “Juan”) Then

    ‘…

ElseIf (nombre = “Daniel”) Then

    ‘…

Else

    ‘…

End If

 

‘IIF

‘Setea apellido a “Hernandez” si nombre = “Juan”, sino a “Gonzalez”

apellido = IIf(nombre = “Juan”, “Hernandez”, “Gonzalez”)

 

‘Select Case

Select Case nombre

    Case “Juan”

        ‘…

    Case “Daniel”,”Ismael”

        ‘…

    Case Else

        ‘…

    End Select

Estructuras de control en C#

//If comun

if (nombre == “Juan”)

    {/*…*/}

else

    {/*…*/}

 

//If con varios else

if (nombre == “Juan”)

    {/*…*/}

else if (nombre == “Daniel”)

    {/*…*/}

else

    {/*…*/}

 

//?

//Setea apellido a “Hernandez” si nombre = “Juan”, sino a “Gonzalez”

apellido = nombre == “Juan” ? “Hernandez” : “Gonzalez”;

 

//Switch

//La variable a evalar debe ser int o string

//El break; va si o si al finalizar cada case.

switch (nombre)

{

    case “Juan” :

        {/*…*/;break;}

    case “Daniel” :

        {/*…*/;break;}

    default :

        {/*…*/;break;}

}

Estructuras de iteración en VB.net

Dim contador As Integer

 

‘While

While (contador <= 100)

    ‘…

End While

 

‘Do Until … Loop

Do Until (contador = 100)

    ‘…

Loop

 

‘Do While … Loop

Do While (contador <= 100)

    ‘…

Loop

 

‘Do … Loop While

Do

    ‘…

Loop While (contador <= 100)

 

‘Do … Loop Until

Do

    ‘…

Loop Until (contador = 100)

 

‘For … Next

‘Step puede ser negativo para ir de un maximo a un minimo

For contador = 1 To 100 Step 2

    ‘…

Next

 

‘Recorrer una coleccion

Dim listaDeNombres As List(Of String) = New List(Of String)

For Each nombre As String In listaDeNombres

    ‘…

Next

Estructuras de iteración en C#

int contador  = 0;

//While

while (contador < 100)

{

    { /*…*/}

}

 

//For

for (contador = 0; contador <= 100; contador += 1)

{

    { /*…*/}

}

 

//Do … While

do

    {/*…*/}

while (contador == 100);

 

//foreach

List<string> listaDeNombres = new List<string>();

foreach (string nombre in listaDeNombres)

{

    { /*…*/}

}

Es nena!!!!

26 Octubre 2007

Por fin en la eco de ayer se dejo ver y nos dejo bien en claro que es nena!!, se viene Amparo para el 2008 :D

Iconos gratis y libres.

23 Octubre 2007

Miles de iconos de calidad para bajar, de todas las categorias, para Windows, Mac y Linux.
La URL: www.iconarchive.com

Icon Archive

Si hay algo que me jode en ciertos programas es que apretas un botoncito (por lo general llamado Buscar) y el programa se paraliza. Después de esperar 20 segundos, si todo sigue igual lo único que queda es Ctrl-Alt-Del y empezar de vuelta. Ahora en realidad nunca nos enteramos si el programa estaba buscando, si algún parámetro de búsqueda hizo que se colgara o si simplemente el proceso de búsqueda es terriblemente lento. Ósea el usuario esta reperdido y por lo tanto inseguro. Cuanto más inseguro más se nos va a quejar y peor va a laburar, así que obviamente es algo a no olvidar.

La descripción técnica seria así:

No Threading

Obviamente el problema esta en que el proceso de búsqueda se realiza en el mismo thread que atiende la UI del programa. Entonces cuando el thread esta ocupado realizando la búsqueda todo lo demás se paraliza, incluyendo maximizar, minimizar, o cancelar el proceso. El programa queda “colgado” y sin respuesta.

La solución estaría en hacer algo así:

Multithreading

Hay diferentes maneras de lograrlo: crear un thread a mano, usar el nuevo componente BackgroundWorker o Thread pooling.
En este primer post voy a usar la mas simple de todas, ósea crear un thread a mano, asignarle un metodo y luego ejecutar el metodo en el thread asignado.

Los proyectos de ejemplo para bajar son 2, uno sin multithreading y otro con multithreading.

Ahora el codigo :-) :

El unico namespace necesario es:

using System.Threading;

 

 

 

El proc que va a generar los números es simple:
/// <summary>

/// Itera de 0 al nro que elijamos mostrandolo en lblNumero.

/// </summary>

private void generarNumeros()

{

    int max;

    int.TryParse(txtCantNumeros.Text,out max);

    for (int i = 0;i <= max;i++)

        {

 

            this.updateLabel(i);

            //Esta linea es para evitar la saturacion de la UI

            //Ya que si el worker thread genera muchas actualizaciones

            //seguidas el thread de la UI se va a saturar y no va a

            //poder atender nuevos eventos.

            Thread.Sleep(100);

        }

}

 

El codigo anterior es igual que la version sin multithreading, la diferencia esta en como se lo ejecuta:

 

private void btnGenerar_Click(object sender,EventArgs e)

{

        //El constructor de Thread le pasamos un ThreadStart que apunta

        //al metodo que va a ejecutar le proceso largo.

        Thread worker = new Thread(new ThreadStart(this.generarNumeros));

        //Inicio el thread

        worker.Start();

}

 

 

 

Con el código visto hasta ahora la generación de números se hace en un thread diferente al thread de la UI y por lo tanto este no se bloquea y queda libre para responder a otros eventos.

Ahora hay que tener en cuenta algo, si intentamos actualizar lblNumero desde el thread que genera los números se va a producir la siguiente excepción:
InvalidOperationException: Cross-thread operation not valid: Control ‘lblNumero’ accessed from a thread other than the thread it was created on.

Esto se debe a que hay una regla en Windows que dice que ningún control puede ser accedido desde un thread diferente al que lo creo. Para remediar esta situación el codigo que actualiza lblNumero pasa de:

lblNumero.Text = numero.ToString();

 

 

 

a:

 

 

 

/// <summary>

/// Delegate que uso cuando llamo recursivamente al proceso

/// que actualiza lblNumero.

/// </summary>

/// <param name=”numero”>Numero a setear</param>

private delegate void updateUI(int numero);

 

 

 

/// <summary>

/// Actualiza la UI con el nro que pasamos por parametro.

/// </summary>

/// <param name=”numero”>Nro a mostrar en lblNumero</param>

private void updateLabel(int numero)

{

        //Chequeo si el metodo fue llamado de un Thread que no

        //creo el Form. Si InvokeRequired es TRUE entonces hay

        //que llamar recursivamente al mismo metodo hasta que

        //el thread sea el correcto para actualizar el label.

        if (this.InvokeRequired == false)

        {

            lblNumero.Text = numero.ToString();

        }

        else

        {

            //Creo un delegate que apunte al metodo de actualizacion.

            updateUI updateMethod = new updateUI(this.updateLabel);

            //Invoco el delegate que apunta a updateLabel() desde el

            //form!!!!

            //Si haces updateMethod.Invoke no va a funcionar

            this.Invoke(updateMethod, new object[] { numero });

        }

}

Como ultimo detalle, al momento de hacer Invoke, el thread que realiza el proceso largo se paraliza hasta que la UI sea actualizada, si cambiamos eso por un BeginInvoke la tarea de actualizar la UI para a ser una tarea asincronica y entonces no hay demora en el otro thread. Igual magia no se puede hacer y si la maquina en que lo estas ejecutando no es lo suficientemente rapida y el thread que trabaja genera muchas actualizaciones seguidas en la UI, el thread de la UI se va a poner lento y no va a poder atender otros eventos (estariamos en lo mismo de antes), la unica solución sería dormir el thread entre cada número generado por unos milisegundos y asi darle tiempo a la UI para que se actualize bien y atienda los demas eventos que se generen sobre ella.

Resumiendo, para que un proceso no nos cuelgue el sistema lo ejecutamos en un thread diferente y a los metodos que actualizan la UI los modificamos para que se llame recursivamente mediante un delegate.
Es todo por ahora, más adelante voy a postear las otras opciones.

Por lo general la capacidad de diseño es inversamente proporcional a la capacidad para el desarrollo, los únicos casos que vi gente que tenía ambas aptitudes en igual grado fue cuando en realidad eran mediocre en las dos :D

Por eso este sitio es un verdadero salvavidas si nos toca hacer un proyecto web solitos, sin diseñador que nos haga los dibujitos y le ponga los colores justos.

Open Desing

La URL es www.opendesigns.org y de ella podemos bajar un toco de diseños (que utilizan CSS y XHTML obviamente) gratis, libres y sin siquiera registrarte!!!
Que lo disfruten.