Categoría: cosas técnicas

Posts relacionados con la programación o manejo o configuración de los oredenadores (computadores)

  • Consultado en mi sitio: Acceder al contenido de una página Web

    La batallita del agüelo

    Debido a que me he propuesto actualizar más a menudo este blog (mi blog) que mi sitio (elguille.info), lo que no quisiera es que la gente que visita mi sitio (por aquello de la costumbre que da todos los años que lleva funcionando o simplemente porque se lo han encontrado en Google o Bing (o como quiera que se llame el buscador de Microsoft, que ya llevan 3 nombres en menos de 5 años, así pasa lo que pasa, que la gente se lía: voy a buscar con MSN search, que no, que ahora se llama Live search, pos no estás desfasado tú, que se llama bing, pero si en la barra del Internet Explorer muestra windows live, pos que quieres que te diga, le habrán vuelto a cambiar el nombre, ya van 4 nombres en menos de 5 años y eso que sólo habré tardado en escribir este párrafo unos 2 minutos… si es que…).
    A lo que iba, que si alguien entra en mi sitio, quisiera que tuviera a mano los últimos posts (entradas, artículos, cosas que he escrito, decide cómo llamar a los posts) y como en todas las páginas del blog se muestra una lista con los posts más recientes (por medio de un widget en el que yo le indico cuántos quiero que se muestren, a día de hoy se muestran 7, pero puedo poner hasta un máximo de 15), así que… mirando el código de la página generada, he pensado en extraer (aquí lo más fácil hubiera sido decir "coger", pero… no quiero que algunos de los que viven al otro lado del charco me hagan un chiste fácil… y es que los españoles no agarramos nada, lo cogemos todo, hasta la gripe la cogemos… en fin…).

    Buscar un texto en una página web

    Bien, sabiendo lo que quiero hacer: buscar un texto en el contenido de una página web.
    Lo que necesito es: un código que haga eso.
    Y eso está publicado en mi sitio publicado en Abril de 2008. concretamente en:

    En particular lo que me interesa es este trozo: el mostrado en el listado 1.

    Por supuesto, esto hay que modificarlo un poco, ya que lo voy a usar en una página Web.

    Aunque habitualmente uso el Expression Web para editar las páginas de mi sitio (a día de hoy, estoy usando la versión 3), y con idea de no complicarme la vida (porque voy a usar código), lo que hago es abrir mi sitio web (la copia local de mi equipo) en Visual Studio 2008, de esa forma podré escribir el código de forma más sencilla que con el Expression Web, ya que el EW sabrá mucho de páginas y sitios Web, pero de Visual Basic .NET no sabe ni que existe la instrucción End.

    Editar mi sitio con Visual Studio 2008

    Abro mi sitio en el Visual Studio 2008 y modifico la página principal que es en la que quiero incluir esa lista de las cosas más recientes de este blog.
    Me posiciono en la parte de la página que tengo para el código y pego el procedimiento del listado 1.
    Por suerte, el Visual Studio 2008 detecta los fallos incluso de las páginas web como esta en la que tengo en el mismo fichero tanto la parte del código como la presentación (código HTML) y en este caso, los errores que me da es porque las clases WebRequest, WebResponse y StreamReader no están definidas, pero ya sabes que pulsando en el mismo error te da la posibilidad de arreglarlo, y en este caso es añadiendo las importaciones a los espacios de nombres System.Net y System.IO, que en código ASP.NET se hace como te muestro en el listado 2:

    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Net" %>

    Listado 2

    Convertir el Sub en Function y detectar errores

    Como no voy a usar la función Console y lo que me interesa es obtener una cadena de texto, convierto ese procedimiento Sub en una función y hago que devuelva la cadena leída (lo que está en la variable res).

    Pero como se pueden producir errores, incluyo todo el código dentro de un bloque Try/Catch de forma que si se produce un error se devuelva una cadena con el error que se ha producido, si todo va bien, se devuelve la cadena con el texto leído de la página web generada por el acceso a (en este caso) el directorio raíz del blog (el IIS ya se encarga de mandar la página HTML que corresponda).

    En el listado 3 tienes esta función modificada.

    Llamar a la función desde otro método

    Esa función necesita que se le indique qué página queremos leer y después tendremos que leer el contenido y buscar la parte que nos interese, en mi caso, después de haber "analizado" lo que genera el blog, detecto que necesito encontrar la cadena "widget widget_recent_entries" y una vez hallada, debo tomar todo lo que haya a partir del encabezado (<H2) que le da el título a ese bloque de links. Y como es un bloque de links, deben estar incluidos entre <ul> y </ul>, por tanto necesito el trozo de cadena (que haya después de la cadena esa del widget) desde el siguiente <h2 hasta encontrarse con </ul>.

    Y eso es lo que hace el código del listado 4.

    En ese listado verás que se modifica el contenido de pBlogGuille, es más, lo que se hace es asignar a la propiedad InnerHtml el texto obtenido. pBlogGuille es un div que hay en la página y que, como es de esperar, contendrá los links de los artículos recientes.

    La variable divBlogGuille es otro div que contiene al anterior y que lo hacemos invisible de forma predeterminada (en el código HTML) y para que resulte evidente, también al principio de este último procedimiento. De esa forma, si se produce un error o no se obtiene lo que se espera, no se mostrará nada, ya que se oculta todo el div, que por supuesto debe ejecutarse en el lado del servidor. Para que lo tengas claro, en el listado 5 tienes ese código de la página .aspx en la que está todo este código.

    Llamar al método desde el evento Page_Load de la página

    Finalmente tenemos que saber desde dónde llamar al método mostrado en la sección anterior, y como lo que queremos es que esos links se muestren al cargar la página, hacemos una llamada en el evento Page_Load de la página (yo ya tengo ese método de evento declarado, si no, tendría que definirlo).

    Aquí simplemente hacemos la llamada al método, es decir, incluimos esto en cualquier parte de ese método de inicio:

    leerUltimosBlogGuille()

    Y esto es todo, espero que te sea de utilidad y si tienes dudas sobre algo de lo aquí comentado, por favor haz lo siguiente:

    -Primero busca en Internet sobre lo que tienes la duda, lo más fácil es buscar en Google o en Bing escribiendo la frase completa de lo que quieres saber.

    -Segundo (si buscando no encuentras lo que quieres) pregunta en los foros (ya sean los míos o los de otros, por ejemplo los de MSDN/Microsoft)

    -Si después de preguntar no tienes la solución, tienta a la suerte y pregunta en este mismo hilo, pero procura que sea algo relacionado con lo explicado y como no me creeré que tengas dudas después de dar los dos pasos anteriores, tendrás que decirme qué has preguntado y cómo has buscado 😉 y adema´s debes estar registrado ene este blog… jejeje, que no, que no tienes que explicarme nada, y menos justificar que has hecho los deberes, pero procura buscar antes de preguntarme, porque seguramente yo sabré si has buscado o no, y si detecto que vas buscando lo fácil  cómodo (que otro haga tu trabajo) pues… no te digo lo que haré o diré… ¡imagínatelo!

    Nos vemos.

    Guillermo

    P.S.

    Para que todo esto sea posible (para las pruebas que he hecho) he tenido que buscar otra cosa en mi sitio: Configurar un sitio Web en local con Windows Vista


    Código

    Listado 1

    ' Acceder a una página Web usando WebRequest y WebResponse
    Sub leerPaginaWeb(ByVal laUrl As String)
     
        ' Cear la solicitud de la URL.
        Dim request As WebRequest = WebRequest.Create(laUrl)
     
        ' Obtener la respuesta.
        Dim response As WebResponse = request.GetResponse()
     
        ' Abrir el stream de la respuesta recibida.
        Dim reader As New StreamReader(response.GetResponseStream())
     
        ' Leer el contenido.
        Dim res As String = reader.ReadToEnd()
     
        ' Mostrarlo.
        Console.WriteLine(res)
     
        ' Cerrar los streams abiertos.
        reader.Close()
        response.Close()
    End Sub
    

    Listado 3

    ' Acceder a una página Web usando WebRequest y WebResponse
    Private Function strPaginaWeb(ByVal laUrl As String) As String
        Dim res As String = ""
        
        Try
            ' Cear la solicitud de la URL.
            Dim request As WebRequest = WebRequest.Create(laUrl)
    
            ' Obtener la respuesta.
            Dim response As WebResponse = request.GetResponse()
    
            ' Abrir el stream de la respuesta recibida.
            Dim reader As New StreamReader(response.GetResponseStream())
    
            ' Leer el contenido.
            res = reader.ReadToEnd()
    
            ' Mostrarlo.
            'Console.WriteLine(res)
    
            ' Cerrar los streams abiertos.
            reader.Close()
            response.Close()
            
        Catch ex As Exception
            res = "ERROR:<br/>" & ex.Message
        End Try
        
        Return res
    End Function
    

    Listado 4

    Private Sub leerUltimosBlogGuille()
        divBlogGuille.Visible = False
    
        ' La URL a examinar
        Dim laUrl As String = "http://www.elguillemola.com/"
        ' Leemos el contenido
        Dim res As String = strPaginaWeb(laUrl)
        ' Salir si es una cadena vacía o dio error
        If String.IsNullOrEmpty(res) Then Exit Sub
        If res.StartsWith("ERROR:") = True Then Exit Sub
        
        ' Buscar el texto 
        Dim sTarget As String = "widget widget_recent_entries"
        ' Si la posición es -1 es que no existe ese texto
        Dim i As Integer = res.LastIndexOf(sTarget)
        If i = -1 Then Exit Sub
        
        ' El formato de lo que quiero será:
        '  <h2 con el título><ul> y los <li> con las entradas
        ' por tanto, tomar desde el <h2 hasta el siguiente </ul>
        ' y recemos porque no se aniden posts en un <li>
        Dim j, k As Integer
        ' La posición del <h2
        j = res.ToLower().IndexOf("<h2 ", i + 1)
        If j = -1 Then Exit Sub
        ' La posición del </ul>
        k = res.ToLower().IndexOf("</ul>", j + 1)
        If k = -1 Then Exit Sub
        
        ' Usar el trozo entre j y k para mostrar una lista con los posts más recientes del blog
        ' el + 5 es para los caracteres del final: </ul>
        Dim listaPosts As String = res.Substring(j, k - j + 5)
        
        ' Para probar si no se accede
        'listaPosts = ""
        
        If String.IsNullOrEmpty(listaPosts) Then Exit Sub
        
        pBlogGuille.InnerHtml = listaPosts
        divBlogGuille.Visible = True
    End Sub
    

    Listado 5

    <div id="divBlogGuille" runat="server" visible="false" class="NotaClaroMargin">
    <div class="tdTituloPeq"><b>En el blog www.elguillemola.com</b></div> 
    <div id="pBlogGuille" runat="server"></div>
    </div>
    </div>
  • ¿Sabes qué es un avatar?

    Si la respuesta es sí, ya puedes dejar de leer, salvo que quieras "tragarte" la batallita que incluyo 😉

    Un avatar en este mundillo de Internet y los ordenadores es un icono (dibujo o foto) que sirve para representar a alguien, normalmente a partir de una cuenta de correo u otra forma de verificar quién es esa persona.

    Decir que un avatar en el hinduismo es la encarnación terrestre de un dios.

    Y por decirte más, comentarte que la primera vez que me fijé en la palabra avatar fue en un capítulo de entre fantasmas en la que Melinda Gordon (Jennifer Love Hewitt), el avatar de ella tenía que conseguir que otro avatar, que estaba poseído por un fantasma… bueno, eso… la cosa es que a partir de entonces, cada vez que oía la palabra avatar me fijaba en ella (en la palabra), y ahora que me he metido en esto de crear un blog, pues… han vuelto a salir los avatares estos. Por ejemplo, en los comentarios de los posts de un blog (por ejemplo este blog) si el que escribe el comentario ha indicado un nombre que está asociado con un avatar (en otro post te explicaré cómo crear tu propio avatar) aparecerá la imagen que haya seleccionado. A día de hoy 9 de Octubre de 2009, en mi avatar se muestra una foto mía, esa misma foto la he asociado con varias cuentas de correo, pero también se puede asociar una imagen con cada cuenta, con idea de que sean totalmente independientes, (esto te lo explicaré en otra ocasión).

    Haré un cometario a esta publicación para que veas mi avatar.

    ¡Que lo avatarices bien! 🙂

    Nos vemos.
    Guillermo

  • Instalar SQL Server Express 2008 Management Studio… con lo fácil que es hacer las cosas simples…

    … se complican la vida más de la cuenta… si es que… en fin…

    Pues eso… que tenía que modificar unas cosillas en la base de datos de usuarios de mis foros y esas cosas siempre las he hecho con el Management Studio (el entorno integrado de SQL Server), de ese administrador existe una versión para la edición Express de SQL Server (SSMSE), así que… busco en internet, lo localizo y me lo descargo (tanto en inglés como en español) desde esta página.

    Al ejecutar el .exe que me bajo, el Windows 7 me dice que hay problemas conocidos con ese programa y que lo solucione antes, pulso en el botón ese que te muestra en el aviso y me dice (después de un buen rato) que hay una solución al problema, el link me lleva a la página de descarga de Microsoft® SQL Server® 2008 Express Edition Service Pack 1, por tanto, voy a esa página y me lo bajo por si las moscas, antes había intentado instalar el SP1 directamente, pero nones, además me dio problemas también a la hora de instalar, desapareciendo el instalador (sin avisar) y funcionando al ejecutarlo por segunda vez.

    Si te preguntas por qué no me bastó con las instalación del SP1, decirte que instalé el SQL Server 2008 Express con el SP1 porque no estaba seguro de tenerlo instalado, ya que el Visual Studio 2008 lo que instala es el SQL Server 2005 Express.

    Una vez instalado todo esto, que por cierto, vaya peñazo de instalador… sí, un rollo, pero bueno… no es ese el problema, el problema es que… ¡no veo por ningún lado cómo instalar el Management Studio Express! llámame torpe, porque seguramente lo seré, pero… ¡no veo cómo instalar el dichoso IDE del SQL Express!

    El SQL Server Installation Center (que es el programilla que usa el instalador) es mu bonico, con muchas cosas y mu majas todas ellas, pero no veo dónde está la opción para instalar el Management Studio… no… ¿será porque está en inglés?
    En fin… voy a probar a instalar el SQL Server Express 2008 with Advanced Services a ver si así la cosa va mejor (es que el SQL Server 2008 Express with advanced services incluye el management studio).

    Como tengo la versión en español, he usado esa aunque creo que no tiene el SP1, lo digo porque la que yo tengo no es la que está en la URL que te he puesto arriba, ya que el nombre del ejecutable que yo tengo es: es_sql_server_2008_express_with_advanced_services_x86.exe.

    Me dice que hay issues de compatibility, vamos que instale el SP1 en cuanto pueda… le digo que lo instale (Run program), total…

    Nada, el mismo programilla de opciones de configuración… tendré que desistalar el SQL Server 2008 Setup Support Files a ver si… (ahora vuelvo)

    Na, me dice que de esos ficheros dependen más cosas (ver la figura 1), así que… o lo quito todo o lo dejo como está y me instalo el Management Studio de la versión 2005 que seguro que funciona… y como no tengo bases de datos de la versión 2008, pues… no creo que tenga problemas…

    Figura 1. Dependencias entre las cosas instaladas

    Algo así es como debería haber sido para la versión 2008… (ver figura 2)

    Figura 2. Instalar el Management Studio 2005

    Lo mismo después de que reinicie, (porque reiniciaré el equipo), lo probaré de nuevo a ver…

    En cualquier caso, el Management Studio 2005 SP2 se ha instalado correctamente, funciona a las mil maravillas y he podido hacer lo que quería hacer… y de paso he agregado algunas de las bases de datos para pruebas que tengo y que aún no había puesto a funcionar… por cierto, tengo que crear también la de Northwind y pubs que uso en los ejemplos de las charlas…

    Nos vemos.
    Guillermo
    http://www.elguille.info/

    (este post lo publiqué originalmente en elguillemola.blogspot.com)