sábado, 5 de noviembre de 2022

Agregar un grupo de contactos en Outlook

Para crear un grupo de contactos en Outlook, tenemos que pulsar sobre el icono marcado en rojo en la parte inferior del panel izquierdo de Outlook

Agregar un grupo de contactos en Outlook
 

En la pantalla que se abre sobre la pestaña de Inicio pulsamos sobre el icono Nuevo grupo de contactos.

 

Agregar un grupo de contactos en Outlook

Nos abre otra pantalla sobre la que pulsamos sobre la flecha negra que aparece sobre el icono Agregar integrantes en su parte inferior derecha.

Agregar un grupo de contactos en Outlook


Esto despliega un menú sobre el que elegimos la opción que deseemos, en este caso desde los contactos de Outlook. También podemos poner el nombre del nuevo grupo creado en la caja Nombre.

 

Agregar un grupo de contactos en Outlook

Elegimos las direcciones de correo que deseamos agregar a nuestro grupo

Agregar un grupo de contactos en Outlook


Una vez creado nuestro grupo de contactos podemos acceder a él desde Inicio -> Nuevos elementos -> Más elementos-> Grupo de contactos

 

Agregar un grupo de contactos en Outlook



sábado, 22 de octubre de 2022

Como poner un equipo en dominio o cambiarle el nombre, poner usuario como administrador

Para poner un equipo de Windows 10 dentro de un dominio, tenemos que pulsar con el botón derecho del ratón sobre el icono de Windows de la parte inferior izquierda de la pantalla. Esto nos abre un menú contextual en el cual elegimos la opción Sistema

Poner un equipo en dominio

Esto nos abre una pantalla sobre la cual tenemos que pulsar a la derecha hacia el centro donde dice configuración avanzada del sistema

 

sistema, configuración avanzada del sistema

Con lo que se nos abre otra pantalla con las propiedades del sistema, sobre  ella elegimos la pestaña Nombres del equipo y pulsamos sobre el botón cambiar.

Propiedades del sistema
 

Lo que nos abre la pantalla final, sobre la cual aparece el nombre de nuestro equipo (que podemos cambiar si lo deseamos) y también podemos escribir el nombre del dominio al que deseamos que pertenezca. Normalmente será un dominio privado de una empresa o una red local. O bien un grupo de trabajo si pulsamos la opción inferior.

Cambios en el dominio o el nombre del equipo


Poner un usuario como administrador

Para poner un usuario como administrador, basta con pulsar con el botón derecho del ratón sobre Este equipo y elegir la opción administrar

Poner un usuario como administrador

Nos abre una pantalla de administración de equipos sobre la cual en Administración del equipo local, Usuarios y grupos locales elegimos Grupos -> Administradores y pulsamos agregar al usuario del equipo local.

Poner un usuario como administrador







sábado, 8 de octubre de 2022

Entrenar y utilizar una red neuronal

He seguido un montón de artículos, post, tutoriales sobre redes neuronales y en todos se explica muy bien como entrenar una Red neuronal (siempre con datos prefabricados, nunca con los propios datos del usuario) pero a la hora de utilizar la red neuronal entrenada, la mayoría de post o tutoriales dan la lección por aprendida e inexplicablemente terminan. Con lo que nos quedamos con una maravillosa red neuronal entrenada, pero no sabemos cómo utilizarla con nuestros propios datos porque nadie nos lo ha explicado.

Voy a intentar explicar aquí como entrenar (con nuestros propios datos) y utilizar una red neuronal también con nuestros propios datos. Aunque me voy a centrar más en la utilización, pues el entrenamiento está sobradamente explicado en miles de sitios en internet.

Comenzaremos generando nuestros propios datos  En este caso he utilizado un dataset de 37.000 líneas de resultados de partidos de la liga española para predecir las quinielas.

El entrenamiento de la red neuronal lo explicaré solo con esta imagen.

 

Entrenar una red neuronal

El post completo con el código y sus pertinentes explicaciones ya lo publique aquí 

Una vez entrenada nuestra red neuronal procedemos a utilizarla. Para ello debemos crear otro dataset con la misma estructura del que utilizamos para entrenar nuestra red, pero con los datos a predecir, es decir en este caso las columnas de resultados aparecen a cero.

Utilización de la red neuronal entrenada

Una vez entrenada la red neuronal cargamos el nuevo dataset que tendrá la misma estructura que el anterior pero con las etiquetas (datos de entrenamiento) a cero, Pues son los datos que la red debe predecir. En la imagen inferior se han recuadrado en rojo, los datos y en azul las etiquetas (los datos a predecir)

 

Datos vs etiquetas

Lo primero que tenemos que hacer es cargar el nuevo dataset del que queremos predecir los resultados.

#Con clasificación en datos

quinielas = pd.read_csv('Dataset_Resultados_147.csv' )

quinielas = quinielas.sample(frac = 1).reset_index(drop = True)

Tratamos el dataset de la misma forma que hicimos en entrenamiento (post enlazado anteriormente)

from sklearn.preprocessing import LabelEncoder

lb_make = LabelEncoder()

 

x_Nuevos_data = quinielas.drop(columns=['temporada','Q1','QX','Q2','QGC0','QGC1','QGC2','QGCM','QGF0','QGF1','QGF2','QGFM','golesLocal','golesVisitante','fecha'])

 

ss = preprocessing.StandardScaler()

x_Nuevos_data = ss.fit_transform(x_Nuevos_data)

x_Nuevos_data[:19]  #Numero de filas, si pongo más sale el máximo (19 en este caso)

#Son 25 campos, le quitamos 15 de etiquetas quedan 10 campos

Igual que hicimos con los datos de entrenamiento cargamos los datos normalizados en un dataframe de Pandas

x_Nuevos_data  = pd.DataFrame(x_Nuevos_data)

y_Nuevos_data =  quinielas ['Q1'] #Va a predecir el valor Q1 1 es 1, 0 es no uno, es decir X o 2 

x_Nuevos_data  = np.array(x_Nuevos_data).astype('float32')

y_Nuevos_data = np.array(y_Nuevos_data).astype('float32')

Resultados de las predicciones

Y finalmente, aquí es donde cambiamos la operativa respecto al entrenamiento de la red neuronal y predecimos los valores

loss, accuracy = model.evaluate(x_Nuevos_data,y_Nuevos_data,verbose = 0)

#vemos el valor de loss y accuracy

print('loss = {:2f}'.format(loss))

print('Accuracy = {:2f}'.format(accuracy))

X_new = x_Nuevos_data[:19] #Numero de filas, si pongo más sale el máximo (19 en este caso)

y_proba = model.predict(X_new)

y_proba.round(4) #Redondeo a 4 decimales

Esta última línea nos genera un array de dos dimensiones, la primera columna muestra la probabilidad de 0 (es decir que sea una X o un 2 en la quiniela)  y la segunda la probabilidad de 1 ( 1 en la quiniela). 

Predicciones red neuronal

También podemos visualizar los resultados finales en vez del array de probabilidades con estas líneas

y_pred =np.argmax(model.predict(X_new), axis=-1)  #Un array con una predicción por línea (19 en este caso)

y_pred

En este caso, se muestra un array unidimensional sólo se muestra los resultados unos o ceros. (Ver parte inferior de la imagen superior)

Ya tenemos la predicción de nuestra red neuronal para los datos introducidos.

En la siguiente imagen describimos el proceso de predicción de la red entrenada.

 

Predicción valores en red neuronal entrenada

Finalmente podemos comparar los resultados de la predicción de nuestra red neuronal con los datos reales (los tengo en un .csv) y ver los fallos y los aciertos.

comparacción predicciones datos reales y predichos
Vemos que la red neuronal no tiene una bola de cristal y no es capaz de predecir muy bien (todo se andará 😉)

Si cambiamos los datos del dataset a predecir (añadimos distancia a puntos entre clasificados) los datos de salida varían, pero siguen sin ser muy buenos.

comparacción predicciones datos reales y predichos


 


sábado, 1 de octubre de 2022

Cambiar la IP de un equipo

Para cambiar la IP de un equipo cualquiera tenemos que abrir el panel de control de Windows, sobre el símbolo de sistema escribimos Panel de control en la lupa

Panel de control

Abrimos el panel de control y pulsamos sobre el epígrafe Redes e Internet

Redes e Internet

Nos abre una pantalla sobre la pulsamos Centros de redes y recursos compartidos

 

Centro de redes y recursos compartidos

Que nos abre otra pantalla donde pulsamos sobre Cambiar configuración del adaptador.

 

Ethernet

Elegimos Ethernet si estamos conectados por cable de red y Wi-Fi si la conexión es inalámbrica.

 

Estado de Ethernet

Nos abre otra ventana en la que elegimos el botón propiedades

protocolo de Internet versión 4 (TCP/IPv4)

Elegimos protocolo de Internet versión 4 (TCP/IPv4) y de nuevo al botón propiedades

 

Cambiar la IP de un equipo

Finalmente se nos abre la ventana donde podemos forzarle la dirección  que deseamos. ¡Ojo! Antes de cambiar nada, siempre conviene hacer una captura de la pantalla por si no funcionara y hubiera que volver a las anteriores direcciones.


sábado, 24 de septiembre de 2022

Subir y bajar archivos desde un servidor FTP con una aplicación de VB.Net

Para subir o bajar archivos desde un equipo local a una dirección FTP remota con Visual Basic.Net antes se utilizaba la librería de Visual Studio FtpWebRequest. Pero actualmente la documentación indica que dicha librería será descontinuada y que para nuevos desarrollos se utilicen librerías de terceros. Una librería muy utilizada es FluenFTP que es la que vamos a utilizar.

Lo primero que vamos a hacer es descargar dicha librería, para ello desde nuestro proyecto en Visual Studio vamos al menú  de Proyecto y elegimos la opción Administrar paquetes NuGet.

Administrar paquetes NuGet.

Esto nos abre una pantalla desde al que podemos instalar en nuestra aplicación multitud de paquetes de terceros. En nuestro caso ponemos FTP en el buscador y nos muestra una lista de las librerías disponibles. Elegimos FluentFTP pulsamos el botón Instalar. Esto instala automáticamente la librería en nuestro proyecto. Ahora ya podemos utilizar esta librería desde nuestra aplicación.

FluentFTP

Para tener acceso a sus propiedades, funciones y métodos basta con poner la correspondiente llamada Imports, al comienzo de nuestra aplicación de Visual Basic.Net

 

Imports FluentFTP

 

El siguiente paso será definir un Objeto de la clase FTPClient, para ello escribimos

 

Dim client = New FtpClient(strFTP, strUsuario, strPassword)

 

Donde strFTP será una variable de tipo string que traerá la dirección del FTP, ojo, hay que tener en cuenta que será una dirección del tipo ftp://servidor.remoto.es/DIRECTORIO  Si no trae el ftp:// del principio se lo podemos añadir por programa con algo así:

 

strFTP = "ftp://" & strDireccionDestino

 

strUsuario y strPassword traerán el usuario y contraseña correspondientes para conectarnos al servidor FTP deseado. También debemos conectarnos al servidor. Con esta librería es tan fácil como escribir:

 

client.Connect()

 

Ahora lo que queremos es pasar un archivo desde un directorio de nuestro equipo a un FTP remoto. Escribimos la siguiente línea.

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strNombreDestino)

 

Donde en strDireccionOrigen vendrá una cadena con la dirección de nuestro equipo del tipo  “C:\Directorio\Subdirectorio” en strNombreOrigen vendrá el nombre de nuestro archivo de origen, y si deseamos nombrarlo con un nuevo nombre podemos almacenar el nuevo nombre en strNombreDestino o podemos enviar directamente strNombreOrigen en el segundo parámetro si deseamos que el archivo se llame igual que el del origen.

 

Si deseamos copiarlo en un subdirectorio del FTP podemos hacer

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorio_FTP & "/" & strNombreDestino)

 

Donde strSubdirectorio_FTP traerá el nombre del subdirectorio del tipo “/SUBDIRECTORIO” no siendo necesario escribir el nombre completo del FTP.

 

Esta función tiene varias sobrecargas, de modo que podemos hacer

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorios_FTP & "/" & strNombreDestino, FtpRemoteExists.Overwrite, True, FtpVerify.Retry)

 

Esta llamada Sobreescribe el archivo en destino si ya existe uno del mismo nombre. Esto lo hace el parámetro FtpRemoteExists.Overwrite, el siguiente parámetro True indica que si no existe el directorio en el destino lo crea, y el último parámetro FtpVerify.Retry verifica si se ha copiado el archivo correctamente en el FTP.

 

Finalmente cerramos la conexión

 

client.Disconnect()

 

Ahora vamos a traer un archivo desde FTP a nuestro equipo. Para ello creamos el objeto y abrimos la conexión igual que hicimos anteriormente

 

Dim client = New FtpClient(strFTP, strUsuario, strPassword)

client.Connect()

 

Ahora para traer el archivo desde el FTP remoto tenemos que hacer un For Each sobre los objetos del FTP remoto para traer todos los que encontremos

 

For Each item As FtpListItem In client.GetListing(strSubdirectorios_FTP)

                    client.DownloadFile(strDireccionDestino & item.FullName, item.FullName, FtpLocalExists.Overwrite)

                   

                    client.DeleteFile(item.FullName)

Next item

                   

En este caso, si el archivo se encuentra en un subdirectorio del FTP, nos lo creará en el destino indicado de nuestro equipo y escribirá los archivos en el directorio creado, estos vendrán en strSubdirectorios_FTP. Si el FTP no tiene subdirectorios podemos hacer strSubdirectorios_FTP = “”. Para no dejar los archivos copiados en el FTP de origen podemos borrarlos con

 

client.DeleteFile(item.FullName)

 

Terminamos igual que en el caso anterior con

 

client.Disconnect()

 

Finalmente dejo como podrían ser las dos Funciones para enviar y obtener ficheros desde nuestro equipo a un FTP.  Esta sería para llevar un archivo desde nuestro equipo al FTP remoto.

 

Private Function Trata_Archivo_FTP(ByVal Folder_file As Object,  ByVal strDireccionOrigen As String, ByVal strDireccionDestino As String, ByVal strUsuario As String, ByVal StrPassword As String) As Boolean

        Dim strNombreOrigen As String = ""

        Dim strNombreDestino As String = ""

        Dim strSubdirectorios_FTP As String = "/SUBDIR_FTP"

 

                Try

                

            'crea un cliente FTP

            Dim client = New FtpClient(strFTP, strUsuario, StrPassword)

            client.Connect()

 

            For Each File As FileInfo In Folder_file

                strNombreOrigen = File.Name

                strNombreDestino = File.Name

                    'sube un archivo a un FTP

                    client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorios_FTP & "/" & strNombreDestino, FtpRemoteExists.Overwrite, True, FtpVerify.Retry)

                    'Como el origen del fichero no es FTP, borramos archivo en nuestro equipo

                    My.Computer.FileSystem.DeleteFile(strDireccionOrigen & "\" & strNombreOrigen)

        Next

            'desconecta FTP

            client.Disconnect()

            Trata_Archivo_FTP = False

        Catch ex As Exception

        End Try

    End Function

 

La función anterior recorre nuestro directorio local pasado en strDireccionOrigen para ver los archivos que tiene, para ello tiene como parámetro de entrada el objeto Folder_file. La llamada a esta función será de este estilo:

 

Dim folder As New DirectoryInfo(strDireccionOrigen)

bErrores = Trata_Archivo_FTP(folder.GetFiles(), strDireccionOrigen, strDireccionDestino, strUsuarioFTP, strPasswordFTP)

 

Una definición de la función para traer un archivo al equipo local desde un FTP podría ser de este estilo:

Private Function Trata_FTP_Archivo(ByVal strDireccionDestino As String, ByVal strUsuario As String, ByVal strPassword As String) As Boolean

        Dim strNombreOrigen As String = ""

        Dim strNombreDestino As String = ""

        Dim strSubdirectorios_FTP As String ="/SUBDIR_FTP"

 

        Try

 

            'crea un FTP cliente

            Dim client = New FtpClient(strFTP, strUsuario, strPassword)

            client.Connect()

            'Se trae todo lo que hay en el FTP remoto

            For Each item As FtpListItem In client.GetListing(strSubdirectorios_FTP)

               

                    client.DownloadFile(strDireccionDestino & item.FullName, item.FullName, FtpLocalExists.Overwrite)

               client.DeleteFile(item.FullName)

 

            Next ítem

            'desconecta

            client.Disconnect()

            Trata_FTP_Archivo = False

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

    End Function

Si queremos hacer un traspaso de FTP a FTP yo no he sido capaz de hacerlo directamente con FTPFluent, pero si llamando a estas dos  funciones descritas arriba alternativamente utilizando el directorio del equipo local C:\FTP como repositorio para almacenar los archivos traídos desde un FTP antes de enviarlos al FTP de destino.

Dim strAuxDireccion As String

bErrores = Trata_FTP_Archivo(strDireccionOrigen, "C:\FTP", strUsuarioFTP_Ori, strPasswordFTP_Ori)

Dim folder2 As New DirectoryInfo(strAuxDireccion)

 

bErrores = Trata_Archivo_FTP(folder2.GetFiles(),strAuxDireccion, strDireccionDestino, strUsuarioFTP_Des, strPasswordFTP_Des)

Hay que tener en cuenta, que si el FTP de origen tiene los archivos en un subdirectorio, creará el subdirectorio sobre C:\FTP con lo que tendremos que tratarlo para que no de error al leerlo de nuevo. Dentro de Trata_Archivo_FTP debemos sacar el subdirectorio creado con algo como esto:

Dim strFTP As String

Dim intPosBarra As Integer

            'Si la direccion FTP es un directorio separa el servidor y los subdirectorios

intPosBarra = InStr(strDireccionDestino, "/")

If intPosBarra <> 0 Then

      strSubdirectorios_FTP = Mid(strDireccionDestino, intPosBarra)

      strFTP = "ftp://" & Mid(strDireccionDestino, 1, intPosBarra)

Else

      strSubdirectorios_FTP = ""

      strFTP = "ftp://" & strDireccionDestino

End If

 

Y en Trata_FTP_Archivo, algo como esto

 

Dim intPosBarra As Integer

Dim strAuxDir() As String

            'Si la direccion FTP es un directorio separa el servidor y los subdirectorios

            intPosBarra = InStr(strDireccionOrigen, "/")

            If intPosBarra <> 0 Then

                strSubdirectorios_FTP = Mid(strDireccionOrigen, intPosBarra)

                strFTP = "ftp://" & Mid(strDireccionOrigen, 1, intPosBarra)

            Else

                strSubdirectorios_FTP = ""

                strFTP = "ftp://" & strDireccionOrigen

            End If