sábado, 2 de octubre de 2021

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.


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


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.

 

Instalar 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


sábado, 25 de septiembre de 2021

Curso de regresión logística para machine learning

 

Regresión logística para machine learning


Regresión Logística para clasificadores de Machine Learning I: la curva de regresión logística.


Regresión logística y clasificación para Machine Learning II. Clasificación


Regresión logística y clasificación para Machine Learning III. Keras


Regresión logística y clasificación para Machine Learning IV. Preparación de datos


Regresión logística y clasificación para Machine Learning V. Red Neuronal keras-tensorflow


Arquitectura de datos

Introducción 

Las decisiones comerciales modernas se derivan de la información obtenida de los datos, pero muchos de esos datos están sin procesar y sin refinar. Y esto hace que sea difícil proporcionar una interpretación significativa. Lo que es aún más evidente cuando se utilizan macrodatos (big data). Sin embargo, si tenemos una comprensión clara de los conceptos de arquitectura de datos y los aplicamos a los datos. Podemos organizar esos datos para poder proporcionar un contexto para una interpretación significativa e identificar correlaciones, generar resúmenes e informes útiles, y luego usarlos para respaldar diversas decisiones comerciales. 

Datos definidos 

Actualmente se manejan grandes volúmenes de datos, pero eso en sí mismo no es suficiente para que esos datos realmente tengan algún valor. Las decisiones comerciales  se derivan de la información obtenida con estos datos. Pero para ello es necesario, dar sentido a los datos que tenemos.  

Estos datos pueden provenir del uso de aplicaciones de dispositivos móviles. O bien  de representar los hábitos de compra de clientes o de sus preferencias. Cuando hablamos de grandes conjuntos de datos complejos, grandes volúmenes de datos que ingresan a un ritmo rápido, realmente estamos hablando de Big Data. Sin embargo, la información no es lo mismo que los datos. La información son datos organizados y, a partir de la información, se nos puede proporcionar una interpretación significativa de esos datos. Podemos hacer cosas como identificar correlaciones entre diferentes puntos de datos.

Datos Definidos

Las fuentes de datos y, en última instancia, las posibles correlaciones, podrían provenir de fuentes internas o externas. Podemos importar archivos proporcionados por un tercero, o una fuente externa. O podemos simplemente echar un vistazo al uso de datos, por ejemplo, para una línea personalizada de aplicación comercial dentro de la organización, que sería interna. Otro aspecto de los datos es cómo y dónde se almacenan. A menudo, cuando tratamos con grandes cantidades de datos, realmente estamos hablando de almacenarlos en una base de datos. Y así, un diseño de base de datos eficiente se vuelve primordial, ya sea que estemos hablando de una base de datos SQL o incluso una base de datos NoSQL. Otro aspecto del almacenamiento de datos y las bases de datos es si tenemos índices en la base de datos que nos permitan acelerar la búsqueda o si estamos usando clústeres. Por tanto, tenemos varios nodos informáticos que prestan servicio a los datos o incluso almacenan en caché la información de la base de datos en la memoria. Los datos son definitivamente un activo valioso, lo que realmente importa es asegurarse de que entendemos esos datos, para poder obtener valor de ellos. 



sábado, 18 de septiembre de 2021

Crear un instalador con Visual Studio 2019

Vamos a crear un archivo .msi para instalar en cualquier equipo nuestra aplicación creada con Visual Studio 2019. En este caso particular queremos instalarlo sobre un servidor de 64 bits por lo que llegado el caso elegiremos esa opción.

Lo primero que tenemos que hacer, es instalar el paquete de generación de instables, pues no viene por defecto en Visual Studio 2019. Para ello, sobre el menú Extensiones, elegimos Administrar extensiones.

 

Administrar extensiones Visual Studio 2019

Esto nos abre una pantalla que nos permite instalar diferentes extensiones, buscamos Microsoft Visual Studio Installer Projects y la instalamos.

 

Microsoft Visual Studio Installer Projects

Hecho esto, abrimos un proyecto nuevo de Visual Studio

 

Nuevo Proyecto Visual Studio 2019


En el buscador de tipos de proyecto, ponemos Setup y buscamos Setup Project

 

Setup Project Visual Studio 2019

Generamos un proyecto nuevo de este tipo y lo llamamos como queramos, en este caso lo he llamado Setup1. Ahora cerramos este proyecto y abrimos el proyecto que queremos empaquetar. Nos vamos al explorador de soluciones y sobre la solución con el botón derecho del ratón elegimos Agregar y Proyecto existente…

Agregar proyecto existente


Nos abre un cuadro de diálogo donde elegimos el proyecto recién creado Setup1

Crear un instalador con Visual Studio 2019

Nos posicionamos sobre nuestro proyecto Setup1 agregado y nos ponemos encima de Application Folder. Con el botón derecho del ratón elegimos Add  y Resultados del Proyecto…

Add  Resultados del Proyecto

En la pantalla que nos muestra, elegimos Publicar elementos y pulsamos aceptar.

Publicar elementos

Ahora vemos que en Application Folder se han añadido los archivos necesarios para ejecutar nuestra aplicación.

 

Crear un instalador con Visual Studio 2019

Si queremos que nuestro instalador deje un acceso directo a nuestra aplicación en el escritorio, nos colocamos sobre Resultado Principal y con el botón derecho del ratón elegimos Create Shorcut to Resultado Principal from [Nombre_de_nuestro_proyecto] (Active).

 

acceso directo a nuestra aplicación en el escritorio

Renombramos el Shorcut como queramos (en este caso Aplicación) y lo arrastramos al directorio User’s Desktop.

 

acceso directo a nuestra aplicación en el escritorio

Hecho esto, si también queremos que nuestra aplicación aparezca en la lista de aplicaciones de Windows y dentro de una carpeta de aplicaciones. Nos posicionamos en el directorio User’s Programs Menu de la aplicación Setup1 y con el botón derecho del ratón elegimos Add y Folder.

 

acceso directo a nuestra aplicación en la lista de aplicaciones de Windows

Al nuevo directorio lo llamamos Aplicaciones (o como queramos).

acceso directo a nuestra aplicación en la lista de aplicaciones de Windows



Del mismo modo que antes creamos otro Shortcut (en este caso lo he llamado Traspaso Ficheros) y lo arrastramos a la carpeta recién creada.

 

acceso directo a nuestra aplicación en la lista de aplicaciones de Windows


A continuación volvemos al explorador de soluciones, nos colocamos encima de nuestro proyecto Setup1 y en su hoja de propiedades vemos TargetPlattform, desplegamos su combo y elegimos x64

 

TargetPlattform

A continuación posicionados sobre Setup1,  con el botón derecho del ratón elegimos Propiedades

 

Crear un instalador con Visual Studio 2019

Y pulsamos sobre el botón Prerequisites de la pantalla que se nos abre.

Prerequisitos para publicar una aplicación con Visual Studio 2019

Se abre otra pantalla sobre la cual comprobamos si los prerrequisitos son los correctos, en nuestro caso instalará el framework de Microsoft.NET versión 4.7.2 para arquitecturas de  32 y 64 bits 

Prerequisitos para publicar una aplicación con Visual Studio 2019

Regresando a la pantalla anterior pulsamos sobre el botón de Administrador de configuración.

 

Administrador de configuración Visual Studio 2019

Nos abre otra pantalla donde marcamos nuestro proyecto como release y elegimos la plataforma. Si ponemos AnyCPU se generará para 32 y 64 bits.

 

Publicar un proyecto proyecto como release VS2019

Ahora regresamos al Explorador de soluciones y sobre nuestra solución con el botón derecho del ratón elegimos Recompilar solución.

 

Recompilar solución Visual Studio 2019

Finalmente nos colocamos encima del proyecto Setup y con el botón derecho del ratón elegimos instalar.

Crear un instalador con Visual Studio 2019


Esta acción abre un asistente muy sencillo sobre el que iremos pulsando Siguiente.

Asistente del instalador de Visual Studio 2019

Podemos elegir la ruta sobre la que se instalará la aplicación al ejecutar nuestro asistente. También conviene elegir que se publique para todos los usuarios si queremos distribuir nuestra aplicación sin problemas.

Asistente del instalador de Visual Studio 2019

Seguimos pulsando siguiente hasta que se genere nuestro instalador. Ya tenemos nuestros paquetes de instalación en el directorio Release de la aplicación Setup1.  Ya podemos instalarlos en otro equipo y pulsar doble click sobre Setup1.msi para instalar nuestra aplicación.

Instalador de Visual Studio 2019