miércoles, 17 de marzo de 2010

Wireframing, mockups, prototipos

En el proceso de desarrollo de una aplicación informática una parte muy importante es el diseño de la interfaz de usuario. Relacionado con este campo nos podemos encontar con conceptos como wireframing, mockups, prototipos, diagramas de contenido, etc.. Más o menos todos van a parar a lo mismo. Se trata de herramientas de comunicación usadas entre clientes y desarrolladores para establecer la interfaz de usuario.

Muchos ejemplos de mockups los podemos encontrar en Mockupstogo, todos ellos realizados con la aplicación comercial llamada Balsamiq Mockups. Hay muchas aplicaciones de este tipo pero casi todas ellas son de pago, como por ejemplo Axure. También existen herramientas on-line como MockFlow. Como otras alternativas menos específicas tenemos a Microsoft Visio, Power Point o una hoja de papel de toda la vida..


Buscando por la nube he logrado encontrar una alternativa gratuita que la verdad está bastante bien. Se trata de Evolus Pencil. Os muestro un pequeño prototipo de prueba que he hecho (no son tan graciosos como los producidos con Balsamiq, que simulan estar hechos a mano alzada, pero es gratis!)

lunes, 15 de marzo de 2010

Llamar a R desde VB.NET

Hoy vamos a ver como usar la potencia del paquete matemático R desde una aplicación .NET.
Lo primero es explicar qué es R. Se trata de un lenguaje y entorno de programación de análisis estadístico (series temporales, econometría, cálculo numérico, etc..) . Además, se trata de un proyecto libre, lo que lo hace aún más goloso.
Para usar R desde código de una aplicación .NET lo primero que tenemos que hacer es instalar R y un conector, para que se pueda comunicar con la aplicación externa. Lo podemos descargar desde aqui. Así, necesitaremos descargar e instalar:

Pasamos ahora a implementar un pequeño programa que genere un vector R aleatorio y lo represente usando la librería ZedGraph. Antes necesitaremos refenciar las siguientes tres DLLs que podemos obtener a través de estos enlaces:

Finalmente, este es el código que hace lo que antes hemos comentado:




Imports STATCONNECTORCLNTLib
Imports StatConnectorCommonLib
Imports STATCONNECTORSRVLib
Imports ZedGraph

Public Class Form1

Dim sc1 As StatConnector = New STATCONNECTORSRVLib.StatConnectorClass()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
sc1.Init("R")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o1 As Object
Dim n As Integer = 20

sc1.SetSymbol("n1", n)
sc1.Evaluate("x1<-rnorm(n1)")
o1 = sc1.GetSymbol("x1")

Dim serie_x, serie_y As Hashtable
Dim index As Integer
serie_x = New Hashtable
serie_y = New Hashtable
For index = 0 To UBound(o1)
serie_x(index) = index
serie_y(index) = CDbl(o1(index))
Next

crearGrafica(GRAFICA, "TEST R", "X", "Y")
addCurva(GRAFICA, "Serie", Color.Blue, 2, SymbolType.None, serie_x, serie_y)

End Sub



'Dibuja una grafica usando un control ZedGraph
Sub crearGrafica(ByVal nombreControl As ZedGraph.ZedGraphControl, _
ByVal titulo As String, _
ByVal nombre_eje_x As String, _
ByVal nombre_eje_y As String)
Dim area As RectangleF
area = nombreControl.GraphPane.Rect
nombreControl.GraphPane = New GraphPane(area, titulo, nombre_eje_x, nombre_eje_y)
nombreControl.AxisChange()
nombreControl.Refresh()
End Sub


'Añade una curva
Sub addCurva(ByVal nombreControl As ZedGraph.ZedGraphControl, _
ByVal nombre As String, _
ByVal color As Color, _
ByVal anchura As Integer, _
ByVal simbolo As SymbolType, _
ByVal serie_x As Hashtable, _
ByVal serie_y As Hashtable)

Dim i As Integer
Dim puntos = New PointPairList()
Dim puntos_tendencia = New PointPairList()

For i = 0 To serie_x.Count - 1
puntos.add(serie_x(i), serie_y(i))
Next

Dim curva As LineItem = nombreControl.GraphPane.AddCurve(nombre, puntos, color, simbolo)
curva.Line.Width = anchura
curva.Line.Style = Drawing2D.DashStyle.Solid
nombreControl.AxisChange()
nombreControl.Refresh()

End Sub


End Class

sábado, 13 de marzo de 2010

¿Qué busca la gente en Internet?

Buscar en internet hoy por hoy es igual a decir buscar con Google. Habremos notado que recientemente el megabuscador ha mejorado su herramienta de búsqueda predictiva. Ahora a medida que escribes lo que quieres buscar te va indicando que es lo que más se ajusta a lo que busca la gente. Nos encontramos así ante un nuevo modo de posicionamiento en internet (qué bien estaría que al introducir la C apareciera en la lista de sugerencias "cuadernodebits", no?)
Por contra ahora no indica cuantas entradas hay relacionadas con la búsquedas que sugiere. He probado a ver letra por letra que es lo que más busca la gente, suponiendo que las tres primeras sugerencias son las más buscadas. He aqui el resultado:


Conclusión: la gente se equivoca mucho al escribir Tuenti, ¿no?

jueves, 11 de marzo de 2010

Enviar correos con VB.NET

En la anotación de hoy vamos a ver como enviar un correo desde una aplicación VB.NET. Para ello necesitaremos una cuenta en Gmail ya que la aplicación accederá a ella para enviar el correo. El código de un sencillo programa sería el siguiente:




Imports System
Imports System.Collections
Imports System.Net
Imports System.Net.Mail
Imports System.Net.Mime

Public Class Module1
Public Shared Sub Main()

'--------------------------------------------------
'Configuración del mensaje
'--------------------------------------------------
Dim msg As New System.Net.Mail.MailMessage()
msg.From = New MailAddress("origen@gmail.com", "Remitente", System.Text.Encoding.UTF8)
msg.[To].Add("destino@gmail.com")
msg.Subject = "Prueba"
msg.SubjectEncoding = System.Text.Encoding.UTF8
msg.Body = "¡Hola mundo!"
msg.BodyEncoding = System.Text.Encoding.UTF8
msg.IsBodyHtml = False

'--------------------------------------------------
'Configuración del cliente SMTP
'--------------------------------------------------
Dim client As New SmtpClient()
client.Credentials = New System.Net.NetworkCredential("origen@gmail.com", "contraseña")
client.Port = 587
client.Host = "smtp.gmail.com"
client.EnableSsl = True

Try
client.Send(msg)
Catch ex As System.Net.Mail.SmtpException
Console.WriteLine(ex.Message)
Console.ReadLine()
End Try
End Sub
End Class

lunes, 8 de marzo de 2010

¡Esperen un minuto: aún no han oído nada!

Anoche fue la entrega de los Oscars, los premios más codiciados de la industria cinematográfica. Al hilo de esto me he preguntado, ¿cuál fue la primera película sonora de la historia? ¿Y la primera en color?
He estado investigando sobre el tema y he aqui las respuestas que he encontrado:
La primera película sonora de la historia fue una llamada "The Jazz Singer", estrenada el 6 de Octubre de 1927. No era totalmente sonora aunque en algunos fragmentos ya se dejaba escuchar algo, como canciones y algunas frases sueltas. La primera fue "¡Esperen un minuto: aún no han oído nada!".




La primera película en "color" fue proyectada algunos años antes. Fue en Londres en 1909 usándose una técnica llamada Kinemacolor inventada por George Albert Smith. Esta técnica consistía en intercalar entre cada fotograma un filtro rojo o verde. Algo así como: Fotograma 1 B/N con Filtro Verde, Fotograma 2 B/N con Filtro Rojo, Fotograma 3 B/N con Filtro Verde, y así sucesivamente. El efecto era como el que vemos en el siguiente video.




Y hasta aqui mis investigaciones por hoy. En próximas anotaciones seguiremos viendo más curiosidades de la historia del cine.
Fuentes:

domingo, 7 de marzo de 2010

Lectura de archivos PDF con VB.NET

Estos días he estado peleándome con el siguiente problema: leer y procesar información de un archivo PDF. Es decir, extraer de un PDF el texto y luego insertarlo en una base de datos. Para ello estuve buscando por la internet y encontré una magnífica librería llamada PDFBox. Esta incluye una gran cantidad de clases para trabajar con PDFs.

De entre todas las DLLs que la librería incluye necesitaremos referenciar los siguientes en nuestro proyecto .NET:
  • FontBox-0.1.0-dev.dll
  • IKVM.GNU.Classpath.dll
  • IKVM.Runtime.dll
  • PDFBox-0.7.3.dll

El código para pasar el contenido de un PDF a un string sería el siguiente:




Imports org.pdfbox.util
Imports org.pdfbox.pdmodel
Imports System.TypeInitializationException
...

Dim documento As PDDocument
Dim stripper As PDFTextStripper
Dim texto As String

Try
documento = PDDocument.load("C:\informe.pdf")
stripper = New PDFTextStripper()
texto = stripper.getText(documento)
Catch ex As TypeInitializationException
Finally
End Try

martes, 2 de marzo de 2010

Casas con joroba

En el sur de los Estados Unidos, como por ejemplo en Nueva Orleans, las casas típicas estan construidas siguiendo un peculiar estilo arquitectónico. Son las llamadas "camelback houses" o "casas con joroba".
Imagen: commons.wikimedia.org
A primera vista no parecen muy prácticas, pero sin embargo son muy habituales por esa zona. ¿A qué es debida esta "inutil" moda?
Resulta que fue una manera de evitar impuestos. A finales del siglo XIX existía un gravamen según la cantidad de plantas que tenía una casa en su fachada. Asi que nada... hacemos las casas con solo una planta... en la fachada. Si es que picaresca ha habido siempre y en todos sitios!
Fuentes:

lunes, 1 de marzo de 2010

El poder de la escasez

Imaginemos una isla llamada Catán con muchas parcelas listas para ser cultivadas de varios tipos según su calidad: buenas, regulares y malas.
Un día llegó un colono llamado Rodrigo. Pretendía cultivar en una de esas parcelas tanto trigo como puediera para así poder prosperar en su nuevo hogar. Todas las parcelas estaban libres por lo que obviamente se fijó en las de buena calidad.
Los propietarios de estas buenas tierras compitieron entre si para que el nuevo habitante ocupara la suya. Cada uno le pedía una simbólica cantidad de dinero hasta que finalmente Rodrigo optó por la más barata, lógicamente.
A los pocos días llegaron más colonos y poco a poco se fueron ocupando el resto de buenas tierras, todas por un módico precio de alquiler.
Al poco tiempo llegó otro nuevo colono llamado Ernesto. Ya estaban todas las buenas tierras ocupadas e irse a una de calidad regular no le interesaba... Para intentar optar a una de buena calidad le dijo a su propietario: "Te doy una importante suma de dinero si echas a tu inquilino y me la dejas gratis". Rodrigo se enteró de las malas intenciones de Ernesto y le ofreció a su propietario más dinero a cambio de que no le echara.

Ajá! Esto dará pie al propietario en cuestión a subirle el alquiler (su inquilino le acaba de decir que está dispuesto a pagarle más con la condición de que no le eche!). Entonces decide subirle, ¿pero cuanto?. Supongamos que las buenas tierras generan 5 costales de trigo por temporada y las de inferior calidad 3. Por lo tanto le subirá el valor de 2 costales. De esta manera los agricultores de las tierras buenas y regulares obtendrán los mismos beneficios y así ya no tiene que echar al pobre Rodrigo! (ni que decir tiene que el resto de propietarios actuarán de igual modo, sibiendo sus alquileres).

Siguen llegando más y más colonos y las tierras regulares se irán ocupando por unos alquileres muy bajos (como ocurría al prinipio con las buenas tierras). Cuando no queden y llegue un colono más ocurrirá lo mismo. Los propietarios de las buenas y regulares tierras tendrán que subir el alquiler y las de mala calidad pasarán a ser las tierras marginales.

En este pequeño relato vemos el poder que tiene la escasez: al principio, cuando hay muchas parcelas libres el que manda es el colono ya que decide cual ocupar; después, cuando hay muchos colonos el que manda es el propietario, teniendo el poder de subir el alquiler.

Fuentes: