viernes, 15 de junio de 2012

BookWorm

Ya me queda poco para tener finalizado mi proyecto de la asignatura Integración. En breve espero tener suficiente tiempo libre para ir publicando las partes más significativas del código aquí (aunque también subiré el proyecto entero a Bitbucket).

Mientras tanto, puedes verlo en el siguiente enlace: http://bookworm.phpfogapp.com/

¡Espero que te guste!

sábado, 12 de mayo de 2012

Manuales gratis para diseñadores web

¡Buenas! ¡Cuánto tiempo! La verdad es que ando sin un minuto libre últimamente, entre las prácticas (FCT) y el proyecto de fin de curso, no tengo tiempo ni de respirar últimamente... Y mucho menos de tener el blog al día, lo que me fastidia bastante, pero bueno, poco a poco espero ir terminando con las entradas sobre Visual Basic .NET para empezar a mostraros algo sobre mi proyecto. Al final lo estoy haciendo con PHP, utilizando diferentes plugins jQuery y demás, ya cuando empiece con las entradas del proyecto iré contando con más detalle. Además, tendré también que publicar algo sobre programación web con Java, que quedó pendiente... ¡Sigue aumentando mi lista de tareas!

Hoy os dejo un enlace muy interesante:
http://www.instantshift.com/2012/04/10/40-useful-free-online-books-for-web-designers/
Puedes encontrar en él varios manuales gratuitos para diseñadores web, hay de todo (HTML 5, tipografía, CSS, JavaScript...) y tienen muy buena pinta, así que no dudes en investigar un poco, que seguro que encuentras alguno útil.

¡Feliz fin de semana! Yo estaré pensando en la playa y trabajando en el proyecto... ¡Qué injusta es la vida! ;)

sábado, 21 de abril de 2012

Rich Snippets. Introducción y ejemplo

Los "rich snippets" (fragmentos enriquecidos) son líneas de texto que aparecen debajo de cada resultado de búsqueda. La forma más clara de verlo, es con un ejemplo. Buscamos, por ejemplo, una receta (arroz con leche) y algunos de los resultados que aparecen son estos:


Uno de los resultados, el que está rodeado, vemos que tiene una línea en la que aparece la valoración de la receta, el número de opiniones y la duración de la misma. Esto es un fragmento enriquecido.

Para obtener un fragmento enriquecido debemos seguir estos pasos:
  1. Elegir un formato de marcado:
    • Microdatos
    • (recomendado por Google). A mí me ha parecido el más sencillo, ya que sólo tienes que añadir algunos atributos a las etiquetas html (normalmente, <span> o <div>).
    • Microformatos.
    • RDFa.
  2. Marcar el contenido. Google ofrece fragmentos enriquecidos para estos tipos. Pero en schema.org, puedes encontrar muchos más y también son comprendidos por Google, entre otros buscadores.
  3. Probar el marcado. Google ofrece una herramienta para probar tus fragmentos enriquecidos. De esta manera te puedes asegurar de que Google puede leer los datos marcados.
Si después de haber marcado tu sitio web y haber esperado algunas semanas, los fragmentos enriquecidos siguen sin aparecer en el buscador, puedes visitar este enlace.

PRUEBA - Persona (contacto)
Voy a hacer una prueba para el tipo de dato "persona" que ofrece Google, que puede tener las siguientes propiedades:
  • name (nombre).
    • LISA MARIE SIMPSON
  • nickname (apodo).
    • LISA
  • photo (foto).
  • title (cargo de la persona).
    • ESTUDIANTE
  • role (función de la persona).
  • url (enlace a una página web).
  • affiliation (nombre de una organización a la que está afiliada la persona).
    • ESCUELA PRIMARIA DE SPRINGFIELD
  • friend (identifica una relación social entre la persona descrita y otra).
    • MILHOUSE
  • contact (identifica una relación social entre la persona descrita y otra).
  • acquaintance (identifica una relación social entre la persona descrita y otra).
  • address (dirección de la persona).
    • street-address
      • EVERGREEN TERRACE, 742
    • locality
      • SPRINGFIELD
    • region
    • postal-code
    • country-name
      • USA
CÓDIGO
<div itemscope itemtype="http://data-vocabulary.org/Person">
  <img src="http://mickydenys.galeon.com/images/dibu4.gif" itemprop="photo" />
  Soy <span itemprop="name">Lisa Marie Simpson</span>, 
  pero todos me llaman <span itemprop="nickname">Lisa</span>.
  Esta es la web de mi familia: 
  <a href="http://www.thesimpsons.com/" itemprop="url">LOS SIMPSON</a>.
  Vivo en la calle 
  <span itemprop="address" itemscope itemtype="http://data-vocabulary.org/Address">
    <span itemprop="street-address">Evergreen Terrace, 742</span> en
    <span itemprop="locality">Springfield</span>, 
    <span itemprop="country-name">USA</span> 
  </span>
    y soy <span itemprop="title">estudiante</span>
  en la <span itemprop="affiliation">Escuela Primaria de Springfield</span>
  Mi amigo es:
   <a href="http://www.milhouse.com" rel="friend">Milhouse</a>
</div>

En la primera línea encontramos los atributos "itemscope" e "itemtype", incluidos en el <div>. "itemscope" indica que el contenido del <div> describe un elemento y con "itemtype" definimos de qué tipo de elemento se trata, en este caso, una persona. En ese <div> se describen las propiedades de la persona, para ello, a los elementos que contengan alguna de esas propiedades se les añade la etiqueta "itemprop", indicando la propiedad correspondiente, por ejemplo: <span itemprop="title">.

Si nos fijamos en la descripción de la dirección, propiedad "address", vemos que se trata de otro elemento. Es decir, un elemento puede, a su vez, estar formado por otros elementos.

RESULTADO DE LA PRUEBA DEL MARCADO


Podemos ver que en la tercera línea salen algunos de los datos que habíamos indicado y así es como se mostraría el resultado en un buscador. También cabe destacar que no se muestran todos los datos que hemos etiquetado, como por ejemplo la foto. Supongo que el buscador determina, en función del tipo que hayamos elegido y de las propiedades que le hayamos indicado, los datos que muestra.

viernes, 23 de marzo de 2012

Curiosidades - Canvas (HTML)

Hola,

hoy os dejo una entrada diferente. Un enlace a una página en la que puedes interactuar con un código y ver los efectos inmediatamente en una serie de imágenes que puedes elegir. Para ello se ha utilizado el elemento HTML Canvas, que permite la generación de gráficos dinámicamente.

1.- Accede a la web:

2.- Elige el patrón o imagen que prefieras:

3.- Aparece a la izquierda la imagen elegida y a la derecha el código, que puedes modificar a tu gusto:

4.- Una vez realizadas las modificaciones deseadas, puedes exportar la imagen resultante:

Web del autor: http://elucidatedbinary.com/

domingo, 11 de marzo de 2012

Ejercicios MCD y MCM

EJERCICIO 1 - Máximo Común Divisor
Realizar una aplicación que calcule el máximo común divisor de dos números introducidos por teclado.

Module Module1

    Sub Main()
        Dim numero1, numero2, a As Integer
        Dim n1, n2 As Integer

        Console.Write("Número 1: ")
        numero1 = Console.ReadLine
        Console.Write("Número 2: ")
        numero2 = Console.ReadLine

        n1 = numero1
        n2 = numero2

        If (numero1 < numero2) Then
            a = numero2
            numero2 = numero1
            numero1 = a
        End If

        ' Algoritmo de Euclides
        While (numero1 Mod numero2 <> 0)
            a = numero1
            numero1 = numero2
            numero2 = a Mod numero2
        End While

        Console.WriteLine("El MCD de " & n1 & " y " & n2 & " es: " & numero2)

        Console.ReadKey()

    End Sub

End Module

EJERCICIO 2 - Mínimo Común Múltiplo
Realizar una aplicación que calcule el mínimo común múltiplo de dos números introducidos por teclado.

Module Module1

    Sub Main()
        Dim numero1, numero2, mcm As Integer

        Console.Write("Número 1: ")
        numero1 = Console.ReadLine
        Console.Write("Número 2: ")
        numero2 = Console.ReadLine

        mcm = (numero1 / MCD(numero1, numero2)) * numero2

        Console.WriteLine("El mcm de " & numero1 & " y " & numero2 & " es: " & mcm)

        Console.ReadKey()

    End Sub

    Function MCD(ByVal num1 As Integer, ByVal num2 As Integer) As Integer
        Dim a As Integer
        If (num1 < num2) Then
            a = num2
            num2 = num1
            num1 = a
        End If

        ' Algoritmo de Euclides
        While (num1 Mod num2 <> 0)
            a = num1
            num1 = num2
            num2 = a Mod num2
        End While

        Return num2
    End Function

End Module

Ejercicios de búsqueda en tablas

EJERCICIO 1
Realizar una aplicación que contenga la función "Buscar", a la que se le pasará un array de números enteros y el elemento a buscar. Debe devolver un Boolean indicando si lo ha encontrado (true) o no (false).

Module Module1

    Sub Main()
        Dim numeros() As Integer = {32, 5, 3, 2, 66, 2, 7, 45, 90}
        Dim num As Integer = 91
        Dim encontrado As Boolean = Buscar(numeros, num)

        Console.WriteLine(encontrado)

        Console.ReadKey()

    End Sub

    Function Buscar(ByVal numeros() As Integer, ByVal num As Integer) As Boolean
        Dim encontrado As Boolean = False

        For Each n As Integer In numeros
            If (n = num) Then
                encontrado = True
            End If
            'Si lo encuentra, sale del "for"
            If encontrado Then Exit For
        Next

        Return encontrado
    End Function

End Module

EJERCICIO 2
Modificar la función anterior para que implemente el algoritmo de búsqueda dicotómica. En este caso se le pasará un array ordenado de menor a mayor.

Module Module1

    Sub Main()
        Dim numeros() As Integer = {2, 2, 3, 5, 7, 32, 45, 66, 90}
        Dim num As Integer = 4
        Dim encontrado As Boolean = Buscar(numeros, num)

        Console.WriteLine(encontrado)

        Console.ReadKey()

    End Sub

    Function Buscar(ByVal numeros() As Integer, ByVal num As Integer) As Boolean
        Dim izquierda As Integer = 0
        Dim derecha As Integer = numeros.Length - 1
        Dim centro As Integer

        While (izquierda <= derecha)
            centro = (izquierda + derecha) / 2
            If (numeros(centro) = num) Then
                Return True
            End If
            If (numeros(centro) > num) Then
                derecha = centro - 1
            ElseIf (numeros(centro) < num) Then
                izquierda = centro + 1
            End If
        End While

        Return False

    End Function

End Module

EJERCICIO 3
Modificar de nuevo la función para que en lugar de un Boolean indicando si ha encontrado o no el elemento buscado, devuelva un entero indicando la posición donde se encuentra dicho elemento. Si el array no contiene ese elemento, devolverá -1.

Module Module1

    Sub Main()
        Dim numeros() As Integer = {2, 2, 3, 5, 7, 32, 45, 66, 90}
        Dim num As Integer = 90
        Dim posicion As Integer = Buscar(numeros, num)

        If (posicion = -1) Then
            Console.WriteLine("No encontrado")
        Else
            Console.WriteLine("Encontrado en la posicion: " & posicion)
        End If

        Console.ReadKey()

    End Sub

    Function Buscar(ByVal numeros() As Integer, ByVal num As Integer) As Integer
        Dim izquierda As Integer = 0
        Dim derecha As Integer = numeros.Length - 1
        Dim centro As Integer

        While (izquierda <= derecha)
            centro = (izquierda + derecha) / 2
            If (numeros(centro) = num) Then
                Return centro
            End If
            If (numeros(centro) > num) Then
                derecha = centro - 1
            ElseIf (numeros(centro) < num) Then
                izquierda = centro + 1
            End If
        End While

        Return -1

    End Function

End Module