Archive for category cosas técnicas

[Win8] Para que estés al tanto de la programación Metro

Pues eso… cosas que he publicado en la página de elGuille.info en Facebook y que no quiero que te pierdas… al menos si estás interesado/a en publicar cosas para Metro de Windows 8.

 

Aquí te los muestro en el mismo orden en el que los he publicado, pero no quiere decir que sea así por orden de importancia.

También te añado el link al sitio de descargas por si te interesa bajarte la "preview" y hacer tus desarrollos con esa versión que ni de una beta se trata… (al final he acabado poniendo el enlace en la página para que esté nuevamente visible, lo de nuevamente es porque hace unos meses ya lo puse).

 

 

[Win8] El sitio de descargas de Windows 8. Te recomiendo que uses "Windows 8 Developer Preview with developer tools English, 64-bit (x64)" que es el completo y puedes instalar en una máquina virtual

Windows Metro Style Apps Developer Downloads

Windows Metro Style Apps Developer Downloads

 

‎[Win8] un tutorial para que vayas acostumbrándote a programar asíncronamente…

Quickstart: using the await operator for asynchronous programming

The Windows Runtime includes [...] the asynchronous programming model [...] an app remains responsive when it does work that might take an extended amount of time. Asynchronous methods immediately return an object that is a promise to return the actual data that was requested. This means that your app will not need to wait for large operations to complete before continuing execution. To take advantage of the asynchronous APIs, you need to know how to use them. This topic discusses how to use the asynchronous APIs with C# or VB in your Metro style app using JavaScript.

 

 

[Win8] Windows Dev Center: Metro style app development. Para estar al loro con la que se avecina…

Metro style app development

 

 

‎[Win8] si quieres publicar en el Windows Store (desde ayer hasta el 8 de enero, puedes participar en el concurso "First Apps Contest")

Get your app in the Store on opening day – Windows Store for developers – MSDN Blogs

Yesterday at our Windows Store Preview event in San Francisco, we announced our plans for distributing Metro style Windows 8 apps via the new Windows Store. As part of that event, we also announced an exciting opportunity for developers: the First Apps Contest. Based on the tremendous amount of fe…

 

 

[Win8] primer post del nuevo blog: Windows Store for developers

MSDN Blogs: Previewing the Windows Store

Hi. I’m Antoine Leblond, Vice President of Windows Web Services. This is the first post in our new Windows Store blog, which will be dedicated to informing developers both on the progress of the Store as a service, and the platform and economic opportunity the Store represents.

 

 

Nos vemos.
Guillermo

Tags: , ,

Descargar archivos de un FTP

Pues eso… un artículillo "tesnico" para que no digas..

Esto lo publico a raíz de una pregunta en mis foros… y más que nada porque pensaba que ya lo tenía publicado, pero se ve que no… ya que tenía un ejemplo para acceder a un servidor FTP pero sólo para listar el contenido de un directorio FTP.

La cuestión es que en realidad ese código que publiqué con un par de añadidos sirve para poder descargar un archivo (o fichero) de un directorio FTP y aquí te los mostraré tanto para Visual Basic.NET como para Visual C#.

La clase en cuestión que nos sirve para hacer esto que te comento es FtpWebRequest que está definida en el espacio de nombres System.Net.

Y sin más preámbulos (ni rollos) aquí tienes el código de VB y C#.

¡Que lo descargues bien!

 

Código de VB

'------------------------------------------------------------------------------
' Descargar archivos de un FTP                                      (06/Dic/11)
'
' ©Guillermo 'guille' Som, 2011
'------------------------------------------------------------------------------
Option Strict On
Option Infer On

Imports System
Imports System.Net
Imports System.IO
Imports System.Text

Module Module1

    Sub Main()
        ' En este ejemplo usamos un FTP público y anónimo
        ' pero puedes indicar el que quieras
        descargarFic("ftp://ftp.rediris.es/welcome.msg", _
                     "anonimous@nadie.com", "", _
                     "E:\pruebas2")

        Console.WriteLine("descargado")
        Console.ReadLine()
    End Sub

    Private Sub descargarFic(ByVal ficFTP As String, _
                             ByVal user As String, ByVal pass As String, _
                             dirLocal As String)

        Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(ficFTP), FtpWebRequest)

        ' Los datos del usuario (credenciales)
        Dim cr As New NetworkCredential(user, pass)
        dirFtp.Credentials = cr

        ' El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp
        dirFtp.Method = WebRequestMethods.Ftp.DownloadFile

        ' Obtener el resultado del comando
        Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream())

        ' Leer el stream (el contenido del archivo)
        Dim res As String = reader.ReadToEnd()

        ' Mostrarlo.
        'Console.WriteLine(res)

        ' Guardarlo localmente con la extensión .txt
        Dim ficLocal As String = Path.Combine(dirLocal, Path.GetFileName(ficFTP) & ".txt")
        Dim sw As New StreamWriter(ficLocal, False, Encoding.Default)
        sw.Write(res)
        sw.Close()

        ' Cerrar el stream abierto.
        reader.Close()
    End Sub

    Sub listarFTP(ByVal dir As String, ByVal user As String, ByVal pass As String)
        Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(dir), FtpWebRequest)

        ' Los datos del usuario (credenciales)
        Dim cr As New NetworkCredential(user, pass)
        dirFtp.Credentials = cr

        ' El comando a ejecutar
        dirFtp.Method = "LIST"

        ' También usando la enumeración de WebRequestMethods.Ftp
        dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails

        ' Obtener el resultado del comando
        Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream())

        ' Leer el stream
        Dim res As String = reader.ReadToEnd()

        ' Mostrarlo.
        Console.WriteLine(res)

        ' Cerrar el stream abierto.
        reader.Close()
    End Sub
End Module

 

 

Código de C#

//-----------------------------------------------------------------------------
// Descargar archivos de un FTP                                     (06/Dic/11)
//
// ©Guillermo 'guille' Som, 2011
//-----------------------------------------------------------------------------

using System;
using System.Text;
using System.Net;
using System.IO;

namespace descargar_archivos_FTP_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            descargarFic("ftp://ftp.rediris.es/welcome.msg",
                "anonimous@nadie.com", "", @"E:\pruebas2");

            Console.WriteLine("descargado");
            Console.ReadLine();
        }

        static void descargarFic(string ficFTP, string user, string pass, string dirLocal)
        {
            FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(ficFTP));

            // Los datos del usuario (credenciales)
            NetworkCredential cr = new NetworkCredential(user, pass);
            dirFtp.Credentials = cr;

            // El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp
            dirFtp.Method = WebRequestMethods.Ftp.DownloadFile;

            // Obtener el resultado del comando
            StreamReader reader =
                new StreamReader(dirFtp.GetResponse().GetResponseStream());

            // Leer el stream
            string res = reader.ReadToEnd();

            // Mostrarlo.
            //Console.WriteLine(res);

            // Guardarlo localmente con la extensión .txt
            string ficLocal = Path.Combine(dirLocal, Path.GetFileName(ficFTP) + ".txt");
            StreamWriter sw = new StreamWriter(ficLocal, false, Encoding.UTF8);
            sw.Write(res);
            sw.Close();

            // Cerrar el stream abierto.
            reader.Close();
        }

        static void listarFTP(string dir, string user, string pass)
        {
            FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(dir));

            // Los datos del usuario (credenciales)
            NetworkCredential cr = new NetworkCredential(user, pass);
            dirFtp.Credentials = cr;

            // El comando a ejecutar
            dirFtp.Method = "LIST";

            // También usando la enumeración de WebRequestMethods.Ftp
            dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            // Obtener el resultado del comando
            StreamReader reader =
                new StreamReader(dirFtp.GetResponse().GetResponseStream());

            // Leer el stream
            string res = reader.ReadToEnd();

            // Mostrarlo.
            Console.WriteLine(res);

            // Cerrar el stream abierto.
            reader.Close();
        }
    }
}

 

 

Nos vemos.

Guillermo

Tags: , , ,

Traducciones y claves de registro en las versiones Express

Pues eso, que hoy he instalado algunas de las versiones Express de los lenguajes de Visual Studio 2010 Express (en realidad los instalé ayer, hoy los he registrado). En particular he instalado/registrado las versiones Express de los lenguajes Visual Basic 2010 y Visual C# 2010, además del Visual Web Developer 2010.

Como te decía, al abrir el VWD me mostró una ventana de registro (antes abrí el VB y no me avisó de nada, salvo de que me quedaban 29 días, en realidad no avisó, si no que lo mostraba en la barra de título, todo hay que aclararlo, si no, después te viene el de turno y te dice que no sale ninguna ventana de aviso diciendo que quedan 29 días). A lo que iba, que siempre me enrollo, en esa ventana (ver la de la figura 1 que es la de VB, pero pal caso es lo mismo) me indica que escriba una clave de registro y también hay un botón que te permite conseguir dicha clave (Obtain a registration key online) por Internet (ya sabes, si quieres registrar los productos de Visual Studio 2010 Express debes estar conectado a la red de redes).

 

registro VB Express 2010
Figura 1. Aviso de registro del producto

 

La cuestión es que pulso en dicho botón, me pide que me identifique con un Live ID y después de pasar de la página de autenticación (y completar/actualizar/rellenar los datos) me muestra una ventana con la susodicha clave.

En el equipo (Samsung N130 de 10” un netBook que los llaman) en el que estoy instalando/registrando las versiones Express me muestra el contenido de las ventanas del explorador (Chrome) traducidas automáticamente y con el nuevo sistema ese de un "pop-up" con la traducción original, aunque esa ventanita emergente no la vi en un principio, simplemente copié la clave de registro que me mostraba y la pegué en la caja correspondiente y al darle a "Register Now" me dice que nones, que esa clave no es correcta. Jum. Como veo un par de espacios en la clave, se los quito y vuelve a darme error.

En esta ocasión, en vez de seguir probando otras cosas, voy nuevamente a la página del navegador en el que muestra la clave y me doy cuenta de que la clave mostrada no es la misma que la clave original (ver la figura 2), así que… tuve que copiar (seleccionando con el mouse/ratón/apuntador) dicha clave y ahora si que funcionó, esta (la original) si era correcta.

 

clave registro VWD Express 2010 _2
Figura 2. La clave original y la traducida no coinciden

 

Por suerte en las otras dos claves de registro no se cambió de sitio ninguna de las letras y las claves traducidas eran iguales a las originales.

Pero… por si a alguno le pasa y antes ha leído esto o conoce a alguien que lo haya leído, pues… aquí está, para que puedas registrar los productos Express que son gratuitos y 100% operativos y funcionales… con sus límites, claro, pero lo que ofrece, eso es totalmente gratis.

 

Nos vemos.
Guillermo

P.S.
Las versiones Express de los lenguajes de Visual Studio 2010 Express las puedes descargar/instalar desde este enlace/link/vínculo:

visual studio 2010 Express logo
http://www.microsoft.com/express/Downloads/

Desde esa misma página puedes descargarte una imagen ISO con todas las versiones Express, ideal si no puedes/quieres instalarlo usando las versiones de instalación Web.

 

P.S. 2
Decir que en el mensaje de notificación de registro, te llega la clave correcta, a pesar de que el mensaje está traducido, ya sea automáticamente o no, supongo que será una plantilla previamente traducida a mi idioma.

Tags: , ,

El número de decimales del tipo decimal de SQL Server

Pues eso… últimamente estoy "trasteando" en un programa (hecho con Visual Basic 2010) que accede a una base de datos de SQL Server Express 2005 y quisiera ir poniendo por aquí las cosillas que me voy encontrando mientras "tecleo" en ese programa, y lo último que he modificado es esto que te muestro, que no es que no lo hubiera detectado antes, pero haciendo pruebas hoy he visto que me había dejado "sin optimizar" un campo de una de las tablas.

El tema es el siguiente:

Cuando añades un campo a una tabla de SQL Server (en mi caso con el SQL Server Management Studio 2008 (Express)) y le indicas que es de tipo decimal, automáticamente te lo pone de esta forma:

decimal(18, 0)

El 18 es la precisión, o número de dígitos que puede tener este número, y el 0 es la "escala" o número de decimales que puede tener este número.

Como verás cero decimales no es algo que sea demasiado aceptable en valores de tipo moneda, que sí, que podía haber elegido el tipo "money" y me hubiese quitado de problemas, pero de haberlo hecho no te estaría contando esto y… puede que un día te diera por usar el tipo "decimal" por aquello de que es el más parecido al tipo "moneda" que tiene el punto net y lo mismo te preguntarías por qué narices me redondea el número cuando lo guarda en la base de datos… sí, podría ocurrirte esto… como le ocurrió a uno que me conozco…

La cuestión es que si quieres usar el tipo "decimal" de SQL Server para que acepte un número de decimales (por ejemplo cuatro decimales) tendrías que declararlo de esta otra forma:

decimal(18, 4)

 

Y debido a que a la hora de usar este valor desde la base de datos el número de dígitos decimales siempre se guarda (aunque sean todos ceros), me he creado una función que recibe un valor de tipo Object y lo convierte en cadena (String), pero quitando los ceros extras que tenga y en el caso de que el valor "total" sea cero, al menos deje un cero (pero siempre que esté a la izquierda del decimal).

 

Esta función para quitar los ceros extras que añade el SQL Server:

''' <summary>
''' Convierte un tipo Object en un valor Decimal,
''' pero se devuelve como cadena.
''' Ese objeto es el valor leído de la base de datos
''' Si el contenido es válido se devuelve el valor
''' si no, se devuelve una cadena vacía.
''' Se quitan los ceros que haya después del signo decimal,
''' si no tiene decimales, no se muestran los ceros.
''' </summary>
Friend Function dataDecimal(ByVal obj As Object) As String
    If obj Is Nothing OrElse obj.Equals(DBNull.Value) Then
        Return ""
    Else
        ' Conversión extra para evitar "sustos"                 (06/Oct/11)
        Dim d As Decimal = 0
        Decimal.TryParse(obj.ToString, d)
        Return d.ToString.TrimEnd("0"c).TrimEnd({"."c, ","c})

        'Return CDec(obj).ToString.TrimEnd("0"c).TrimEnd({"."c, ","c})

    End If
End Function

 

Como ves, no me fio de que el valor recibido sea un valor decimal válido, por eso hago algunas comprobaciones.

La primera es saber si el valor pasado como argumento a la función es un valor nulo, ya sea "nulo de punto net" o nulo de base de datos (DBNull.Value), en ese caso, la función devuelve una cadena vacía.

La segunda es usar TryParse para no producir una excepción (o error) en el caso de que el valor de ese objeto no sea "convertible" a un tipo Decimal.

La función TryParse recibe un valor de tipo cadena que será el valor a convertir (en este caso a un tipo Decimal) y en el segundo parámetro le indicamos un valor (por referencia) del mismo tipo al que queremos convertir, de forma que si la conversión falla, se utilice el valor que previamente tenga dicha variable.

En el caso de que la conversión NO falle, se asignará a la variable de ese segundo argumento el valor que de como resultado la conversión. Por eso debe ser por referencia, para que la variable se pueda modificar dentro de la función.

 

Como queremos quitar todos los ceros que "sobren" por el final, utilizo la función TrimEnd al valor convertido (el que tiene la variable d) indicándole el carácter que quiero quitar, esa función recibe como parámetro un valor de tipo Char indicando qué carácter queremos quitar del final, y como Visual Basic permite indicar los caracteres en la forma "cadena" seguida de la letra c, pues… eso es lo que he hecho, por tanto "0"c significa que es el carácter CERO (o valor 48).

Esto seguramente ya lo sabías, pero… no está de más una aclaración.

 

Si el valor almacenado en la base de datos no tiene decimales (por ejemplo el número 205) con el TrimEnd que hemos hecho se nos quedaría la coma (o el punto) que indica que hay decimales, por tanto volvemos a hacer un TrimEnd al resultado del TrimEnd anterior, pero en este caso queremos quitar tanto las comas como los puntos, es decir, queremos quitar "dos tipos de caracteres", en estos casos, la función TrimEnd permite indicar un array (o arreglo o matriz) de caracteres con cada uno de los caracteres a quitar del final de la cadena.

Los caracteres individuales ya sabes cómo indicarlos, y si lo que quieres indicar es un array, esos caracteres individuales los separas con comas y los incluyes entre llaves: {"."c, ","c}.

 

Y esto es todo.

 

Sólo me queda decirte cómo lo utilizo:

En mi caso (en este programa que estoy haciendo) lo hago de dos formas:

En una leo el valor de la tabla en un DataTable y accedo a cada valor por medio de un objeto que representa a la fila (DataRow) a la que estoy accediendo:

 

For Each r As DataRow In dt.Rows
    Dim lvi As New ListViewItem

...

lvi.SubItems.Add(dataDecimal(r("Importe")))

...

 

En la otra accedo a los valores por medio de un objeto SqlDataReader y básicamente hago lo mismo:

 

Dim re As SqlDataReader = cmd.ExecuteReader()

...

ImporteTextBox.Text = dataDecimal(re("Importe"))

...

 

Espero que te sea de utilidad.

 

Nos vemos.

Guillermo

Tags: , , , , , ,

Jueves 7, probando con PHP

Pues eso, hoy día de San Valentín Fermín (sí, el de 1 de enero, 2 de febrero, 3 de marzo, 4 de abril, 5 de mayo, 6 de junio, 7 de julio…) y el día en que mi amiga Ana es tita nuevamente, me ha dado por probar una cosa muy simple en PHP, (esta sería la primera vez que escribo código de PHP), y en esta página voy a hacer la prueba antes de hacerla en la parte que en realidad me interesa.

Es algo muy simple, obtener los segundos actuales y mostrar un mensaje de si es menor o no que 30.

A ver si me sale… ahí va:

 

53 es mayor que 30.

 

El código usado es el siguiente:
 

<?php
 $los_segundos = date("s");
 if ($los_segundos < 30) {
   echo "$los_segundos es menor que 30.";
   }
 else {
   echo "$los_segundos es mayor que 30.";
   }
?>

 

¿Ha funcionado?

Espero que sí...

Y para comprobarlo, esta es la fecha y hora actual:

04/02/2012 12:31:53

 

Nos vemos.

Guillermo

P.S.

Parece ser que el editor este no permite usar código internamente... ni siquiera usando el bloque <code> ... </code> :-(

Aunque sea un rollo (al cambiar del editor al código se cambia el código)... siempre hay alternativas...

...

Tags:

Domitienda.com ofrece hosting con bases de SQL Server 2008 sin coste adicional

Pues eso… ya sabes que www.Domitienda.com colabora “activamente” con el mantenimiento de mis sitios y de este blog y cuando digo “colabora” me refiero a que colabora económicamente, así que… aquí estoy yo poniéndole un poco de publicidad para que sepas que además de ofrecer alojamiento (o hosting) de todo tipo y a un precio que con la calidad de servicio que dan es difícil de que encuentres algo mejor, pues eso, que no sólo alojamiento de ASP.NET 4.0 (incluso de versiones anteriores) o alojamiento para ASP y PHP y bases de MySQL o Access o de SQL Server 2005 (si ya empiezas a usar el alojamiento básico), ahora también puedes crear bases de datos de SQL Server 2008 y sin coste adicional, por supuesto las bases de datos de SQL Server (sea de la versión que sea) puedes usarlas si contratas el alojamiento Básico que sólo cuesta 59,40 euros al año (4,95 euros al mes) más impuestos,

Así que… ya sabes… entérate de qué tienes que hacer para usar las bases de datos de SQL Server 2008 en los alojamientos de www.Domitienda.com y empieza a sacarle más rendimiento a tu alojamiento.
En ese post del blog de Domitienda te explican cómo usar/configurar las bases de datos desde tu equipo usando el SQL Server Management Studio 2008 Express.

Nos vemos.
Guillermo

Tags: ,

Reutilizar un control en otros controles

Pues eso… aquí te voy a explicar cómo usar un mismo control en más de un "contenedor" (o colección de controles), y como comprobarás, en principio, es algo muy simple de hacer (una vez que se sabe cómo hacerlo, claro, que si no… ¡ja! ya me dirás tú cómo lo harías si nadie lo explicara, pues eso…)

 

Sí, es un tema técnico… ;-) pero eso no quiere decir que no lo empiece cómo "debe ser".

 

A lo que vamos, de lo que se trata es de tener, por ejemplo, un control PictureBox y ese mismo control mostrarlo (o usarlo) en controles diferentes.
En realidad en contenedores de controles o colecciones de controles, que para el caso es lo mismo, además de que en .NET todos los controles pueden tener otros controles dentro (al menos eso es lo que parece o hace suponer al existir en cada objeto de tipo Control una propiedad llamada Controls que es un objeto del tipo ControlCollection (para saber más pulsa en los enlaces y te llevará a la documentación de .NET Framework 4.0).

Para lograr eso lo que tenemos que hacer es añadir el control en cuestión a la colección Controls del contenedor al que lo queremos mover.
Por ejemplo, si tenemos un control del tipo TabControl y cuando pulsamos en la primera y/o la segunda ficha (TabPage), haremos que un control llamado PictureBox1 se añada a esa ficha.
Con el siguiente código (para Visual Basic) lo conseguiremos:

 

Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, _
                                             ByVal e As EventArgs) _
                                            Handles TabControl1.SelectedIndexChanged

    Select Case TabControl1.SelectedIndex
        Case 0
            TabPage1.Controls.Add(PictureBox1)
        Case 1
            TabPage2.Controls.Add(PictureBox1)
    End Select
End Sub

 

Si prefieres usar C#, utiliza el siguiente código:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch (tabControl1.SelectedIndex)
    {
        case 0:
            tabPage1.Controls.Add(pictureBox1);
            break;

        case 1:
            tabPage2.Controls.Add(pictureBox1);
            break;
    }
}

 

Si en lugar de añadirlo directamente a una ficha (tabControl) necesitas que esté en otro contenedor, por ejemplo, dentro de un GroupBox, simplemente sustituye el nombre del control que hay justamente antes de Controls.Add por el control que te convenga. Lo mismo ocurre con el control añadido (el que está entre paréntesis después de .Add), puedes añadir cualquier control.

 

Si al ver el código de ejemplo te preguntas algo así:

P: Guille, ¿no crees que sería necesario quitar el control antes de añadirlo a otra colección? ya que de esa forma tendríamos repetido el mismo control en más de una colección.

La respuesta podría ser como esta:

R: Buena pregunta, lo que indica que "has leído el código", pero no es necesario.

 

¿Por qué no es necesario eliminar un control de una colección antes de añadirla a otra?

Porque el propio .NET se encarga de eso, es decir, si un control se añade a una colección de controles, automáticamente se quita de la que ya estuviera.

Esto no es que lo haya "adivinado" yo, es que está en la documentación del método Add, que por cierto yo no lo había leído hasta después de hacer el proyecto de ejemplo, en el que me dio por probar a ver qué pasaba si no eliminaba previamente el control de la colección, y al ver que no ocurría "nada raro" (es decir, todo funcionaba como debería funcionar) me dio por leer la documentación y esa documentación tiene una nota que dice:

 

Un objeto Control sólo se puede asignar a una colección Control.ControlCollection a la vez. Si el Control ya es secundario de otro control, se quita de ese control antes de agregarlo a otro.

(el texto anterior está extraído de la ayuda en línea de .NET Framework 4.0 en castellano, concretamente de la definición del método Add de la clase Control.ControlCollection)

 

 

Espero que te sea de utilidad.

 

Nos vemos.

Guillermo

Publicado con fecha del lunes 16 de mayo a las 22:00, pero en realidad lo acabé de escribir (y publicar) el martes 17 de mayo a las 00:05

Tags: , , , ,

Recuperando cosas de elguille.info

Pues eso… que ya que no me "animo" a escribir cosas nuevas, he pensado que puedo ponerte enlaces (links) a cosas que ya publiqué en otros años, ya que, por si no lo sabes, en noviembre de este año 2011 hará 15 años que mi sitio está en la red de redes… osease Internet.
Así que… material para mostrarte hay… lo que aún no he decidido es cómo ir poniendo los enlaces, ya que en un principio había pensado hacerlo desde el más antiguo al más reciente, pero no sé… algo se me ocurrirá…

Es que no quiero que te quedes con la cosilla de que te he abandonado, ya que abandonar a "mi gente" nunca lo haré… o al menos intentaré por todos los medios no "tener" que hacerlo, y mira que ha habido momentos muy malos (tanto económica como moralmente) en los que casi he estado a punto de tirar la toalla (o mandarlo todo a freir espárragos), pero… aquí sigo…
Es que, ya sabes (o deberías saber) que mantener un sitio en Internet necesita no sólo dinero (que también) si no mucho tiempo que dedicarle y el que me diga que eso lo soluciona con sólo prestarle atención una vez a la semana, pues… yo le digo que sí, que vale, pa ti la burra… pero a mí eso nunca me ha funcionado y esto de ponerme a escribir o actualizar cosas me toman más de tres o cuatro horas… incluso escribir esto que te pongo hoy supone dedicarle al menos una hora… como te lo digo…

Que soy un pamplinoso, puede (seguro que tienes razón) pero… así soy y no creo que a pocos meses de cumplir los 54 vaya a cambiar… que lo mismo puedo cambiar… pero no sé yo si me gustaría ese cambio… ¡umaíca, déjame como estoy! ;-)

 

Lo dicho, hoy te pongo un par de enlaces y cada semana intentaré añadir un par de ellos más para que así puede que encuentres cosas que pensabas que no estaban en mi sitio y… pues eso,que sí que estaban.

 

Nos vemos.
Guillermo

P.S.
Este misma nota (o "post") la he publicado en mi sitio, pero te la pongo en el blog por si quieres comentar algo, que a muchos os gusta hacer comentarios, y ya que eso es gratis, pues… ¡venga! ¡comenta lo que quieras! ;-)

Tags:

Yo lo intento, pero el Expression Web sigue con sus fallos

Pues eso, que me pongo hoy a actualizar cosas de mi sitio y después de un rato creando secciones, las páginas de enero, y esas cosas… y aunque ya había guardado las cosas escritas, aunque sin tanta insistencia como con las versiones anteriores (ahora uso el Expression Web 4) ya que se "colgaba" menos que las versiones anteriores… pues… va y me da un error en una página maestra (master page) y después de darle a cancelar (para comprobar si realmente me había cargado algo) va y se cuelga… creo que sólo me ha dejado esa página sin guardar pero… no deja de ser un incordio… y si ya me cuesta trabajo ponerme con el Expression Web a crear/actualizar las páginas de mi sitio, si además se sigue colgando el puñetero programa, pues… menos ganas tengo de "perder" el tiempo… en fin… paciencia… y a seguir usando el Crtl+S (para guardar, sí, uso la versión en inglispitinglis).

Además lo curioso es que siempre se me cuelga con alguna página que usa o es una página maestra (master page) y claro, cuando reporto el bug (o reportaba, ya que después de reportar unos cuantos o varias veces el mismo, como que me he hartado de que no lo puedan reproducir) y me dicen que no lo pueden reproducir o que a gente que lo usa bastante (el Expression Web) no se le cuelga, eso me da que pensar de que esa gente (ni siquiera los de Microsoft) utilizan las Master Page (páginas maestras), pero como da la casualidad de que yo si las uso… porque pensé que era una buena solución para mí, ya que yo NO uso bases de datos para almacenar el contenido de mi sitio (sí, puede que tuviera que hacerlo, pero… ¡me niego! bastante tengo con el blog) por tanto no me vale el usar plantillas "estáticas" o configurables (como prefieras llamarlas), si no, que he optado por usar las master page y esas páginas maestras están muy bien, además de que a mí en particular me ayuda a tener ciertas secciones o partes de las páginas actualizadas sin tener que modificar chorrocientasmil páginas (que son las que tengo desde hace casi 15 años en mi sitio web), y el problema es que esas páginas maestras sólo las soporta este editor Web además del Visual Studio, pero éste último es poco amigable para usarlo como editor de sitios Web, aunque en la versión actual (VS 2010) no lo he probado tan a fondo como en la versión 2008, pero si en la versión anterior fallaba al usarlo como editor de páginas Web no quiero pensar qué es lo que ocurrirá con la versión 2010… lo mismo lo pruebo un día de estos…

Bueno… te dejo, que con esto ya he descargado un poco el "mal rollo" que me ha dado con el puñetero Expression Web 4.

 

Nos vemos.
Guillermo

Tags: ,

Obtener info de la ventana en la que está el cursor del ratón

Pues eso… un ejemplo para Visual Basic .NET y C# de cómo usar funciones del API y de .NET… no me enrollo, te dejo la descripción y el enlace:

 

 

Obtener info de la ventana en la que está el cursor del ratón

Usando funciones del API de Windows (WindowFromPoint y GetWindowText) y clases de .NET Framework (Cursor.Position), averiguar el handle de una ventana según la posición del cursor del ratón (mouse) y como ejemplo mostrar el texto de esa ventana y su handle, la ventana puede ser incluso un control.

 

 

Nos vemos.
Guillermo

Tags: , ,