lunes, 5 de septiembre de 2011

Legibilidad en lenguajes de programación


por Alfred Thompson
visto en MSDN Blogs


Recientemente vi una comparación de un montón de lenguajes de programación en línea. Lenguajes de script: PHP, Perl, Python, Ruby Mi primera y segunda reacción fue ¡rayos! Ahora tengo mis prejuicios - prejuicios que pueden no ser compartidos por otros, por supuesto. Pero me gusta el código legible y para mí cada vez que veo un carácter especial (cualquier cosa que no es un alfanumérico) me frena. Esto me hizo pensar acerca de ¿hacia dónde vamos en el diseño de lenguajes de programación?, ¿Nos estamos moviendo hacia adelante (lo que sea que eso signifique) o hacia atrás o hacia los lados justo?

Hace tiempo, cuando empecé a programar en los años 40's, los tres grandes lenguajes de programación eran FORTRAN y COBOL con un pujante lenguaje llamado BASIC. FORTRAN fue usado por los matemáticos y los científicos. COBOL se utiliza para aplicaciones de negocios. BASIC era un lenguaje de enseñanza / aprendizaje que se extendía a los negocios. COBOL fue a la vez amado y odiado por diferentes personas por su palabrería. Pero por lo menos comprensible. Tomemos de ejemplo el siguiente ciclo:

PERFORM VARYING WS-BOTTLE-NUM FROM 98 BY -1
               UNTIL WS-BOTTLE-NUM < 2
END-PERFORM

Muy cerca de una sentencia de Inglés. Compare eso con esta muestra de un lenguaje al estilo de C (C #).

for (WSBOTTLENUM = 98; WSBOTTLENUM < 2; WSBOTTLENUM--)
{
}

¿Cuál es más evidente? Haz de cuenta que no eres un programador experimentado.

BASIC (Visual Basic, en este caso) está en un punto intermedio.

For WSBOTTLENUM = 98 To 1 Step -1
 
Next

El Step - la cuenta atrás - es más fácil de entender, para mí al menos. Ahora echemos un vistazo a algo muy simple.

k = i / 10;

Esto lleva a los principiantes una locura. ¿Qué está pasando aquí? Claro que los programadores saben, pero para algunos  principiantes es difícil entender la dirección en que la operación va. Compare esto con el mismo código en COBOL

divide i by 10 giving k

¿Muchas palabras? Claro, pero por lo menos hasta un principiante puede leerlo. Ahora, no estoy diciendo que todos debemos volver a COBOL, aunque honestamente con IDE's modernos y características como Intellisence sería mucho más fácil de lo que era cuando yo estaba escribiendo a tarjetas perforadas.

Más bien estoy sugiriendo que para un principiante los idiomas pueden y probablemente deberían ser más claros en su lectura en lugar de más oscuros - que el Inglés es más fácil de aprender en vez de "¿qué significa # en este lenguaje de programación?"

Solo por diversión, si desean ver como lucen diferentes lenguajes de programación, visiten el sitio 99 botellas de cerveza.

Este sitio Web contiene una colección de la canción de 99 botellas de cerveza programados en diferentes lenguajes de programación. En realidad, la canción se representa en 1434 diferentes lenguajes de programación y sus variaciones.

viernes, 2 de septiembre de 2011

Creando elementos de interfaz gráfica - Parte 1


En mas de una ocasión me ha sido necesario el utilizar los métodos de dibujo que trae por defaul Visual Basic, ya sea para realizar una gráfica, un reporte o simplemente para enriquecer la interfaz de nuestra aplicación, por lo que creo que este tutorial de 3 partes les será de gran utilidad para adentrarse en este tema, cabe mencionar que el tutorial original en Ingles lo pueden consultar en Exforsys.

Creando elementos gráficos utilizando System.Drawing


En este tutorial vamos a aprender acerca de los objetos gráficos (Graphics Object), sistema de coordenadas de los formularios de Windows, dibujar textos en un formulario, dibujar figuras y trabajar con imágenes.

Entendiendo los objetos gráficos (Graphics Object)


La dirección de gráficos en Visual Studio .NET esta basado en GDI+ (Graphics Device Interface). La interfaz de dispositivo de gráficos nos permite exhibir gráficos en una pantalla o una impresora sin tener que manejar los detalles de un dispositivo de exhibición específico. Todo lo que se necesita hacer es hacer llamadas a los métodos de las clases de GDI+ y a estos métodos se encargan de hacer la correspondiente llama a los drivers de los dispositivos según lo necesitado, ya sea manejar la pantalla o la impresora.

Crear un objeto grafico (Graphics Object)


Esto se puede hacer de diferentes maneras:

I. Recibiendo una referencia del objeto grafico parte de System.Windows.Forms.PaintEventArgs en el evento System.Windows.Forms.Control.Paint de un formulario o control. Esta es la manera usual de obtener una referencia a un objeto grafico cuando se crea codigo de pintado en un control.

II. Llamando al metodo System.Windows.Forms.Control.CreateGraphics de un formulario o control para obtener una referenciia al objeto System.Drawing.Graphics que representa la interfaz de dibujo de un control o formulario que ya existe.

III. Creando un objeto System.Drawing.Graphics de cualquier objeto que herede de System.Drawing.Image. Este acercamiento es útil cuando usted quiere alterar una imagen ya existente.

Veamos un ejemplo rápido:

Private Sub Form1_Paint(ByVal sender As Object, ByVal pe As PaintEventArgs) Handles _ MyBase.Paint
        ' Declara el objeto gráfico
        ' Proveido en PaintEventArgs.
        Dim g As Graphics = pe.Graphics
        ' Insertar el código de dibujo aquí
    End Sub

Se puede administrar el Objeto Graphic fácilmente como se ve en el siguiente fragmento de código:

Public Class Form1

    Private Sub PaintObj(ByVal e As PaintEventArgs)
        Dim graphics As Graphics = e.Graphics
        Dim pen As New Pen(Color.Blue) ' Opaque blue
        graphics.DrawRectangle(pen, 10, 10, 200, 100)

    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        PaintObj(e)
    End Sub
End Class

Este código genera la salida que se muestra a continuación:


Entendiendo el sistema de coordenadas de Windows Forms



GDI+ utiliza 3 tipos de coordenadas: World, page y device. Las coordenadas World son las coordenadas que se utilizan para modelar un gráfico particular y son las coordenadas que se pasan a los métodos de. NET Framework. Las coordenadas Page se refieren al sistema de coordenadas utilizado por una superficie de dibujo, como un formulario o control. Las coordenadas Device son las coordenadas utilizadas por un dispositivo físico que se dibuja en una pantalla o una hoja de papel.

Cuando se llama al método myGraphics.DrawLine(myPen, 0, 0, 160, 80), los puntos que se pasan al System.Drawing.Graphics.DrawLine metodo —(0, 0) y (160, 80)— están en coordenadas World. Antes de que GDI+ pueda trazar la línea en la pantalla, las coordenadas pasan a través de una secuencia de transformaciones. Una transformación, llamada transformación World, convierte las coordenadas de World a coordenadas Page y otra transformación, llamada transformación Page, la  convierte a coordenadas de dispositivo.

Transformaciones y sistemas de coordenadas


Suponga que desea trabajar con un sistema de coordenadas que tiene su origen en el cuerpo del área de cliente en lugar de la esquina superior izquierda. Digamos, por ejemplo, que desea que el origen hasta los 100 píxeles desde el borde izquierdo del área de cliente y 50 píxeles desde la parte superior del área de cliente. En la ilustración siguiente se muestra el sistema de coordenadas.



Al realizar la llamada de myGraphics.DrawLine(myPen, 0, 0, 160, 80), se obtiene la línea que se muestra en la ilustración siguiente.


Las coordenadas de los extremos de la línea en los tres espacios de coordenadas son las siguientes:

World
(0, 0) to (160, 80)

Page
(100, 50) to (260, 130)

Device
(100, 50) to (260, 130)

El fragmento de código para dibujar la línea que se muestra en la imagen de arriba es la siguiente:

myGraphics.TranslateTransform(100, 50)
myGraphics.DrawLine(myPen, 0, 0, 160, 80)

Convertir Coordenadas UTM a Geodésicas

Si bien existen por Internet varios lugares donde se pueden conseguir convertidores de coordenadas, siempre puede ser útil el tener tu propia rutina de conversión, sobre todo cuando te propones mostrar ubicaciones por medio de Google Maps en tus aplicaciones, y viendo que no hay mucha información al respecto, les comparto una función para este objetivo.

Para poder utilizar esta funcion es necesario importar la clase Math:

Imports System.Math
se declaran las siguientes constantes: y ahora si, les dejo la función:


Const SeMa = 6378206.4                'Semi major axis (a) (m)
Const pi As Double = 3.14159265358979 'Pi
Const FE = 500000                     'False easting (m)
Const CSF = 0.9996                    'Central Scale factor (K0)
Const ZD = 6                          'Zone width (degrees)
Const LCMZ = -177                     'Longitude of the central meridian of zone 1(degrees)
Const iflat = 294.9786982138          'Inverse flattening (1/f)
y ahora si, les dejo la función:



Public Function Geodesicas(ByVal UTMX As Double, ByVal UTMY As Double, ByVal Zona As Integer) As Double()

        '******************************************
        'Variables de Generales para el Calculo
        '******************************************

        'Achatamiento (f)
        Dim flat As Double = 1 / iflat
        'Excentricidad (e2)
        Dim Ex As Double = (2 * flat) - (flat * flat)
        'Semi-minor axis (b) (m)
        Dim SeMb As Double = SeMa * (1 - flat)

        Dim n As Double = (SeMa - SeMb) / (SeMa + SeMb)
        Dim n2 As Double = n ^ 2
        Dim n3 As Double = n ^ 3
        Dim n4 As Double = n ^ 4
        Dim G As Double = SeMa * (1 - n) * (1 - n2) * (1 + (9 * n2) / 4 + (255 * n4) / 64) * pi / 180

        Dim m As Double = UTMY / CSF
        Dim Sigma As Double = (m * pi) / (G * 180)
        Dim Sigma2 As Double = Sigma * 2
        Dim Sigma4 As Double = Sigma * 4
        Dim Sigma6 As Double = Sigma * 6
        Dim Sigma8 As Double = Sigma * 8

        'Easting
        Dim E As Double = UTMX - FE

        'Foot Point latitude
        Dim Term1 As Double = Sigma
        Dim Term2 As Double = ((3 * n / 2) - (27 * n3 / 32)) * Sin(Sigma2)
        Dim Term3 As Double = ((21 * n2 / 16) - (55 * n4 / 32)) * Sin(Sigma4)
        Dim Term4 As Double = (151 * n3) * Sin(Sigma6) / 96
        Dim Term5 As Double = 1097 * n4 * Sin(Sigma8) / 512

        Dim Lat As Double = Term1 + Term2 + Term3 + Term4 + Term5
        Dim SinLat As Double = Sin(Lat)
        Dim SecLat As Double = 1 / Cos(Lat)

        'Radios de curvatura
        Dim Rho As Double = SeMa * (1 - Ex) / (1 - Ex * SinLat * SinLat) ^ 1.5
        Dim Nu As Double = SeMa / (1 - Ex * SinLat * SinLat) ^ 0.5

        'x = E'/(k0n')
        Dim x As Double = (E / CSF) / Nu

        't'=tanj'
        Dim t As Double = Tan(Lat)
        Dim t2 As Double = t ^ 2
        Dim t4 As Double = t ^ 4
        Dim t6 As Double = t ^ 6

        'y'=n'/r'
        Dim y As Double = Nu / Rho
        Dim y2 As Double = y ^ 2
        Dim y3 As Double = y ^ 3
        Dim y4 As Double = y ^ 4

        'Pie punto de latitud
        Dim Tm1 As Double = -((t / (CSF * Rho)) * x * E / 2)
        Dim Tm2 As Double = (t / (CSF * Rho)) * ((x ^ 3) * E / 24) * (-4 * y2 + 9 * y * (1 - t2) + 12 * t2)
        Dim Tm3 As Double = -(t / (CSF * Rho)) * ((x ^ 5) * E / 720) * (8 * y4 * (11 - 24 * t2) - 12 * y3 * (21 - 71 * t2) + 15 * y2 * (15 - 98 * t2 + 15 * t4) + 180 * y * (5 * t2 - 3 * t4) + 360 * t4)
        Dim Tm4 As Double = (t / (CSF * Rho)) * ((x ^ 7) * E / 40320) * (1385 + 3633 * t2 + 4095 * t4 + 1575 * t6)
        Dim SumTm As Double = Lat + Tm1 + Tm2 + Tm3 + Tm4

        'Latitud geodesica
        Dim Latitud As Double = (SumTm / pi) * 180

        'Meridiano Central
        Dim CMDeg As Double = (Zona * ZD) + LCMZ - ZD
        Dim CMRad As Double = (CMDeg / 180) * pi

        Dim lon1 As Double = SecLat * x
        Dim lon2 As Double = -SecLat * ((x ^ 3) / 6) * (y + 2 * t2)
        Dim lon3 As Double = SecLat * ((x ^ 5) / 120) * (-4 * y3 * (1 - 6 * t2) + y2 * (9 - 68 * t2) + 72 * y * t2 + 24 * t4)
        Dim lon4 As Double = -SecLat * ((x ^ 7) / 5040) * (61 + 662 * t2 + 1320 * t4 + 720 * t6)

        Dim SumLon As Double = CMRad + lon1 + lon2 + lon3 + lon4

        Dim Longitud As Double = (SumLon / pi) * 180

        Dim CLL(2) As Double
        CLL(1) = Latitud
        CLL(2) = Longitud

        Return CLL

End Function

Esta función nos devuelve las coordenadas Latitud y Longitud en un arreglo numérico, y así, ya podremos utilizarla en nuestras aplicaciones


Cabe mencionar que esta función no es totalmente de mi autoria, sino que esta basada en el trabajo de Gabriel Ortiz en cuanto a la conversion de coordenadas UTM Nad27 a Geodésicas WGS84.




jueves, 1 de septiembre de 2011

Dias del Mes en SQL

Funcion asincrona para calcular los dias del mes de una fecha dada, muy util en ciertos casos

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

– =============================================
– Author:
– Create date: <10/10/2009>
– Description:
– =============================================
ALTER FUNCTION [dbo].[ufn_DiasDelMes] ( @pDate DATETIME )
RETURNS INT
AS
BEGIN

RETURN CASE WHEN MONTH(@pDate) IN (1, 3, 5, 7, 8, 10, 12) THEN 31
WHEN MONTH(@pDate) IN (4, 6, 9, 11) THEN 30
ELSE CASE WHEN (YEAR(@pDate) % 4 = 0 AND
YEAR(@pDate) % 100 != 0) OR
(YEAR(@pDate) % 400 = 0)
THEN 29
ELSE 28
END
END

END


Ya declarada, su uso es sumamente simple:

Select ufn_DiasDelMes(Fecha) as Meses From Tabla

Validando controles en VB.NET



Recientemente tuve la necesidad de validar los datos de un formulario en VB.NET, si bien ya existen componentes propietarios que lo hacen automaticamente, en ocasiones tenemos la necesidad o la unica alternativa de utilizar los que Visual Studio trae incorporados, en este caso y para hacerlo de una forma mas sencilla lo haremos con un ciclo For Each.

Lo primero que debemos de hacer es especificar que componentes del formulario vamos a validar, para hacerlo, lo seleccionamos y establecemos su propiedad Tag = 1, de la siguiente manera:

TextBox1.Tag = 1


Lo segundo es establecer una etiqueta para saber a que componente nos referimos al validarlo, para esto podemos usar la propiedad AccessibleName, de la siguiente manera:

TextBox1.AccessibleName = “Pozo” ‘En este caso el componente guardara el nombre de un pozo


Y por ultimo, les dejo la funcion de validación:

Private Function ValidaDatos() As Boolean

Dim Ctl As Control
Dim x As Integer

For x = Me.Controls.Count – 1 To 0 Step -1

Ctl = Me.Controls.Item(x)

If TypeOf (Ctl) Is TextBox Then
Dim Control As TextBox = Ctl
If Control.Tag = 1 Then

If Control.Text.Trim = “” Then
MsgBox(“Debe de establecer el valor de: ” & Control.AccessibleName)
Control.BackColor = Color.Yellow
Control.Focus()
ValidaDatos = False
Exit Function
Else
Control.BackColor = Color.White
End If

End If
End If

If TypeOf (Ctl) Is ComboBox Then
Dim Control As ComboBox = Ctl
If Control.Tag = 1 Then

If Control.Text.Trim = “” Then
MsgBox(“Debe de establecer el valor de: ” & Control.AccessibleName)
Control.BackColor = Color.Yellow
Control.Focus()
ValidaDatos = False
Exit Function
Else
Control.BackColor = Color.White
End If

End If
End If

Next

ValidaDatos = True

End Function


Como pueden ver en la funcion recorremos los componentes del formulario de manera inversa, esto lo hice porque de alguna manera el orden de los componentes queda en orden inverso al realizado al momento de su creación, tambien vemos que primero validamos el tipo de componente (TextBox y ComboBox) y despues si es necesaria su validación, en este caso la unica validación es que el componente no este vacio, si lo esta le ponemos el fondo amarillo, caso contrario le ponemos el fondo blanco (Determinado).

Si bien el ejemplo es sencillo, con algunas modificaciones podemos validar varios escenarios, solo es cuestion de hechar a volar la imaginación.

Nota: El ejemplo esta hecho en Visual Studio 2008 con framework 3.5

Generando graficos por codigo en XtraChart

Pues viendo que no hay mucha información al respecto les dejo la manera de como generar gráficos mediante código en VB.NET 2008 con el componente XtraChart

Para esto debemos tener un formulario y un componente XtraChart al que llamaremos “cGrafico”

Primeramente importamos la referencia a XtraChart en el encabezado del formulario

Imports DevExpress.XtraCharts


Y aqui va el codigo:

‘Eliminamos las series del componente
cGrafico.Series.Clear()

‘Ponemos el titulo al grafico
cGrafico.Titles.Item(0).Text = Pozo_G

‘Declaramos una variable del tipo Series
Dim series2 As Series = New Series()

‘Agregamos la serie al componente
cGrafico.Series.Add(series2)

‘Cambiamos el tipo de grafico de la Serie al tipo Linea
series2.ChangeView(ViewType.Line)

‘Asignamos el nombre de la Serie
series2.Name = “Caudal”

‘Asignamos el nombre campo del argumento
series2.ArgumentDataMember = “Indice”
‘Asignamos el tipo de valor del Argumento
series2.ArgumentScaleType = ScaleType.Numerical

‘Asignamos del nombre del campo de los datos a graficar
series2.ValueDataMembers.AddRange(“caudal_gas”)
‘Asignamos el tipo de valor de los datos a graficar
series2.ValueScaleType = ScaleType.Numerical

‘Ocultamos las etiquetas de la serie
series2.Label.Visible = False

‘Cambiamos el color de la linea a Azul
CType(series2.View, LineSeriesView).Color = Color.Blue
‘Ocultamos los marcadores de la linea para que no se vea abultada
CType(series2.View, LineSeriesView).LineMarkerOptions.Visible = False
‘Ponemos el grueso de la linea a 1
CType(series2.View, LineSeriesView).LineStyle.Thickness = 1

‘Ponemos el titulo al eje de la Y, lo ponemos en azul y visible
CType(series2.View, LineSeriesView).AxisY.Title.Text = “Caudal (MMpcd)”
CType(series2.View, LineSeriesView).AxisY.Title.TextColor = Color.Blue
CType(series2.View, LineSeriesView).AxisY.Title.Visible = True

‘Asignamos los datos por medio de un DataTable a la Serie
series2.DataSource = m_Datos.Rs2DataTable(“Select * From v_Produccion_Oficial_Acumulado Where Pozo = ‘” & Pozo_G & “‘ Order By Fecha ASC”)


Y listo tenemos nuestra gráfica como vemos a continuación, como podemos ver, es sencillo y rápido.


miércoles, 26 de agosto de 2009

Jessica Biel, la celebridad mas peligrosa de la red


Pues McAfee ha puesto la alerta de las celebridades mas peligrosas de la red, y no es que sean hackers o algo asi, lo que pasa es que son las mas buscadas por los usuarios de internet y por supuesto algunas personas lo han notado, por lo que crean paginas con fotografias de las celebridades, las cuelgan en la red, las registran en los buscadores y mas de un incauto al entrar ya instalo Malware o cualquier otro bicho en su PC.

Ni modo raza, habra que tener cuidado al buscar información de su celebridad favorita, asi que ni modo, Jessica Biel, Beyonce y Jennifer Aniston, ya no las vere tanto, jejeje.