Nuevo blog

C DOS PUNTOS es ahora…

http://cuadernodebits.blogspot.com/

!Espero que os guste!

Simulación de Monte Carlo

La simulación de Monte Carlo es un método estadístico numérico utilizado para estimar variables aleatorias con una densidad de probabilidad conocida mediante el uso de un ordenador.

Supongamos la simulación del lanzamiento de una moneda.  Sabemos que la probabilidad de que salga cara es 1/2.  Utilizando la función RANDOM de un ordenador podemos simular dicho lanzamiento, asignando el segmento [0, 0.5] al suceso CARA y (0.5, 1] al suceso CRUZ.

caracruz

Algo similar podríamos podríamos hacer para simular el lanzamiento de un dado. 

dado

Este método tiene muchas aplicaciones como por ejemplo en el cálculo de áreas. Básicamente se generan muchos puntos aleatorios y se cunatifica cuantos “caen” dentro del área y cuantos no.

Otra aplicación es la estimación de valores (como los dos ejemplos que hemos visto). Generalmente esta aplicación se suele utilizar en el campo de la economía.

Plantillas de entregables

Un apartado importante en la ingeniería del software (aunque en la vida real no se realice todo lo que se debiera) es la documentación.  Existen multitud de documentos asociados a cada una de las fases del ciclo de vida de un proyecto software:  Propuesta, Especificaciones, Diseño, Pruebas, Guía del usuario, etc..

En el siguiente sitio se pueden encontrar multitud de ejemplos y plantillas para todos estos tipos de documentos.

http://readyset.tigris.org/nonav/es/templates/frameset.html

Los clasifica de dos maneras: por actividad y por secuencia sugerida, según la metodología clásica de desarrollo de software.

Cómo obtener un pantallazo de un control determinado en VB.NET

Me ha surgido la necesidad de obtener una captura de pantalla de un control de tipo ListView. La manera sencilla y equivalente sería utilizando la tecla Impr Pant, pegar en un editor de imágenes y recortar el área perteneciente al ListView. 

Se me ocurre la posibilidad de que al darle a un botón realice  una captura solo del  área de la pantalla ocupada por el control deseado y guarde la imagen obtenida en el portapapeles.

En primer lugar es necesario entender la propiedad Location de un control. Esta propiedad indica la distancia en pixels de la esquina superior izquierda de un control  con respecto a su contenedor.

Por otra parte existe una función llamada PointToScreen que devuelve las coordenadas de un punto con respecto a la pantalla.

Mi ListView se encuentra dentro de un TabControl y este a su vez dentro de un Panel. Por lo tanto en primer lugar es necesario obtener la localización del ListView con respecto al borde del formulario de la aplicación.

Por último, el código que nos soluciona el problema:

Dim g As Graphics
Dim bmp As Bitmap
Dim startPoint As Point 'Esquina superior izquierda
Dim endPoint As Point   'Esquina inferior derecha
Dim mypoint As Point
Dim region As Rectangle 'Region a la que se le aplicará el pantallazo

'Se obtienen las coordenadas de pantalla del control deseado
mypoint = PointToScreen(Panel.Location + TabControl.Location + LV.Location)
startPoint = PointToScreen(mypoint)
mypoint = PointToScreen(Panel.Location + TabControl.Location + LV.Location + LV.Size)
endPoint = PointToScreen(mypoint)

'Se define la región de la pantalla ocupada por el control deseado
region.X = startPoint.X
region.Y = startPoint.Y
region.Width = endPoint.X - startPoint.X
region.Height = endPoint.Y - startPoint.Y

'Se efectua el pantallazo
bmp = New Bitmap(region.Width, region.Height, PixelFormat.Format32bppPArgb)
g = Graphics.FromImage(bmp)
g.CopyFromScreen(region.Left, region.Top, 0, 0, region.Size)

'Se guarda la imagen en el portapapeles
Clipboard.SetDataObject(bmp)

Generador de diagramas UML on-line

Dos tipos de diagramas UML, de Clase y de Uso, pueden ser generados a través de la siguiente web.

http://www.yuml.me/

Se trata de un servicio web que a partir de una sencilla sintaxis devuelve la imagen del diagrama deseado. Por ejemplo, el siguiente código nos genera el diagrama que a continuación se muestra.

[Cliente]1->N[Orden de compra]

1b332a4f

Y por último, usando el servicio web:


http://yuml.me/diagram/scruffy/class/[Cliente]1->N[Orden%20de%20compra].

Generador de diagramas de secuencia on-line

Como todo buen programador, durante la fase de análisis a veces es necesario realizar diagramas de secuencia. Para facilitar estas tareas existen buenos programas como StarUML o ArgoUML pero en ocasiones no contamos con estas herramientas instaladas en nuestro PC.

Una manera rápida y fácil de generar diagramas de secuencia es mediante la siguiente aplicación web:

http://www.websequencediagrams.com/

En primer lugar es necesario codificar el diagrama que queramos generar mediante su sencilla sintaxis. Por ejemplo, el siguiente código nos generaría el diagrama que pongo a continuación:

CLIENTE->SERVIDOR: compruebaConexion()
activate CLIENTE
note right of CLIENTE: Si hay conexión devuelve la hora del sistema
SERVIDOR-->CLIENTE: 10:05:00 (OK)
CLIENTE->SERVIDOR: calculaDesfase()
note right of CLIENTE
Se mira la hora del cliente y se calcula
Desfase = hSERVIDOR - hCLIENTE
end note

diagPlano
 

La aplicación web permite dibujar el diagrama usando varios estilos:

  • Estilo “Rational Rose”

diagRose

  • Estilo “Moderno”

diagModerno

  • Estilo “Manuscrito” (mi favorito)

diagMano

Gráficas con Zedgraph en VB.NET

Hace tiempo me surgió la necesidad de representar gráficas en mis aplicaciones .NET. Buscando por la web encontré una libre y estupenda librería acorde a mis necesidades. Se trata de Zedgraph, descargable desde la siguiente página:

http://zedgraph.org/

Para utilizarla en nuestras aplicaciones  es necesario referenciar la DLL ZedGraph.dll.

La librería ofrece muchas posibilidades y tipos de gráficas (barras, líneas, tarta, etc..). Estas son altamente configurables (color, grosor, textos, etc..) En la página anteriormente citada existen muchos ejemplos útiles.

Por último, incluyo un pequeño ejemplo de uso:

Dim area As RectangleF
Dim x As Double
Dim y As Double
Dim puntos = New PointPairList()

'Limpiar gráfica
area = GRAFICA.GraphPane.Rect
GRAFICA.GraphPane = New GraphPane(area, "Mi gráfica", "x", "y")

'Informar los puntos
For x = 1 to 24
	y = miFuncion(x)
	puntos.Add(x, y)
Next

'Crear y añadir la curva
Dim curva As LineItem = GRAFICA.GraphPane.AddCurve("Gráfica", puntos, Color.Blue, SymbolType.None)
curva.Line.Width = 3.0

'Refrescar la gráfica
GRAFICA.GraphPane.Fill = New Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0F)
GRAFICA.AxisChange()
GRAFICA.Refresh()

Viaje al pasado

¿Quién dijo que no se podía viajar al pasado? Existe una organización llamada Internet Archive que guarda una versión caché de millones de páginas de Internet desde 1996 (160 billones de páginas) Así, podemos buscar una página web y ver como era hace años o directamente ver una que haya muerto ya.

http://www.archive.org/

Gracias a este sitio he podido regresar a 1998 y revivir como era la página de Google:

Google1998

o la de Altavista en 1996:

Altavista1996

y lo mejor de todo es que he podido volver a ver mi primera y vieja página web de geocities! (ya difunta desde hace algunos años).

miniMatlab: Un Matlab en miniatura

Necesito hacer unos cálculos matriciales con Matlab pero no cuento con la herramienta instalada. Son unos cálculos sencillos y eventuales por lo que tampoco compensa mucho instalar toda la aplicación. Buscando en internet encuentro un Matlab en miniatura precisamente para estas necesidades. Está implementado en JAVA y puede descargarse de la siguiente página:

http://libe.ocracy.org/minimatlab.html

minimatlab

Lectura de un fichero XML con VB.NET

Se requiere la lectura de una serie de datos dispuestos en un documento XML desde una aplicación VB.NET.

La estructura del documento XML es parecido a la siguiente:

<Nodo1>
	<Nodo1_1 at21="a">
	<Nodo1_2 at22="b">
	<Nodo1_3>
		<Nodo1_3_1>
			<Nodo1_3_1_1>
				<NodoValor v="100">
			</Nodo1_3_1_1>
			<Nodo1_3_1_1>
				<NodoValor v="100">
			</Nodo1_3_1_1>
		</Nodo1_3_1>
	</Nodo1_3>

</Nodo1>

El objetivo es leer los nodos denominados “NodoValor” (lo que nos interesa son los valores de los atributos v). Con el siguiente código lo conseguiriamos:

Imports System.Xml
...
Dim Xml As XmlDocument
Dim NodeList As XmlNodeList
Dim NodeList2 As XmlNodeList
Dim Node As XmlNode
Dim i As Integer

Try
        Xml = New XmlDocument()
        Xml.Load("http://www.midominio.com/documento.xml")

        NodeList = Xml.ChildNodes
        NodeList = NodeList.Item(0).ChildNodes  'Hijos de Nodo1: {Nodo1_1, Nodo1_2, Nodo1_3}
        NodeList = NodeList.Item(2).ChildNodes  'Hijos de Nodo1_3: {Nodo1_3_1}
        NodeList = NodeList.Item(0).ChildNodes  'Hijos de Nodo1_3_1: {Nodo1_3_1_1,Nodo1_3_1_1}

        For i = 0 To 1
        	NodeList2 = NodeList.Item(i).ChildNodes  'Hijos de Nodo1_3_1_1: {NodoValor}
             Node = NodeList2.Item(0) 'El nodo que queremos
             MsgBox(Node.Attributes.Item(0).Value)
        Next
Catch ex As Exception
            Console.WriteLine(ex.GetType.ToString & vbNewLine & ex.Message.ToString)
Finally
            Console.Read()
End Try

Página siguiente »