Como crear un instalador o setup para Windows y Linux

    Como crear un instalador o setup para Windows y Linux

    Como crear un instalador o setup para una fácil distribución de un programa  desarrollado. Estoy seguro que eres un programador que desarrolla programas o eres un programador que ha empezado desarrollar recientemente un programa, pero quieres distribuir tu aplicación y no sabes cómo crear un instalador o setup, al crear un programa que hemos desarrollado necesita un conjunto de diferentes necesidades, tales como: configuración, seguridad o empaquetar otros archivos como la DLL, un conjunto completo de requisitos. En los siguientes párrafos voy explicar y mencionar programas o herramientas de creación de instalador detalladamente o cómo crear un instalador o setup o como se llame, un sistema de instalación controlado por script.

    Como crear un instalador o setup (Inno Setup)

    Es un programa libre, creado por  Jordan Russell, con este programa se puede crear un instalador o setup contralado por script basado en leguaje de programación Pascal, es decir  se puede configurar y programar un conjunto complejo de requisitos, de las cuales he aquí las características:

    • Soporte para todas las versiones de Windows.
    • Soporte para las arquitecturas en 64 bits en Windows de 64 bits
    • Admite de un único archivo .EXE para distribuir en la web
    • Configuración personalizable, Instalación silenciosa y desinstalación
    • Soporte integrado para la compresión de archivos DEFLATE, bzip2 y LZMA
    • Creación de accesos directos , en el menú Inicio y en el escritorio
    • Creación de registros en el registro de Windows  y entradas de archivos INI
    • Motor de secuencias de comando integrado basado en Pascal Script
    • Soporte para instalaciones para múltiples Idiomas.
    • Soporte para instalaciones con contraseña y cifrada.
    • Soporte para extensiones o plugins de los terceros para mejorar las características de Inno setup.
    • Código fuente abierto en el GitHub

    A continuación  vamos ver el ejemplo de cómo crear un instalador o setup con Inno, para realizar un instalador debemos descargar e instalar el Inno setup de la página oficial, http://www.jrsoftware.org/isinfo.php, pero primero quiero mencionar que existen dos versiones, la versión Inno Setup Ultra  que permite el diseño de las ventanas de instalación y con editor de código muy amigable, y la versión simple que tiene un editor código y el asistente de configuración. En su página web podemos encontrar una amplia documentación https://jrsoftware.org/ishelp/, ahora si vamos con el ejemplo.

    Ir menú file,  e inmediatamente mostrará la ventana de dialogo, haga clic en botón siguiente, donde muestra otra ventana que se debe llenar en los cuadros de texto, el nombre del programa que has desarrollado, La versión de tu programa, el nombre de quien publica puede ser tu nombre o nombre de compañía, dirección de la pagina web  de tu aplicación.

    Como crear un instalador o setup con Nullsoft Scriptable NSIS paso 1

    Después de llenar los datos en los cajas de texto, haga clic en botón siguiente, y aparecerá otro cuadro de dialogo,  donde dice nombre del directorio o carpeta de la aplicación  escriba el nombre.

    Como crear un instalador o setup con INNO SETUP paso 2

    Una vez llenado el nombre de la carpeta haga clic en botón siguiente para pasar a la siguiente ventana, donde dice archivo principal ejecutable, haga clic en el botón explorar y selecciona el archivo ejecutable principal, es decir tu programa que permite realizar funcionalidades, generalmente es un archivo compilado con extensión .EXE, si no es el caso seleccione el archivo que se ejecutara para el usuario final. Después de seleccionar el archivo ejecutable, haga clic en botón agregar carpeta o directorio de tu programa, esta funcionalidad permite escanear y agregar todo los recursos que tiene el programa desarrollado.

    Como crear un instalador o setup con INNO SETUP paso 3

    Luego se debe pasar al siguiente paso, haga clic en botón siguiente y otra vez muestra otro cuadro de dialogo, esta opción nos permite configurar los iconos de acceso directo, como en el escritorio, en el menú inicio y entre otros, deseleccione la primera opción, escriba el nombre de la aplicación en la caja de texto, con cuya configuración es suficiente, pero si quiere  configurar con otras opciones no hay ningún problema.

    Como crear un instalador o setup con INNO SETUP paso 4

    Luego de haber realizado cuya configuración, haga clic de nuevo en el botón siguiente, en el que se debe adjuntar la licencia del programa desarrollado, solo permite archivos con extensión RTF y TXT.

    Como crear un instalador o setup con INNO SETUP paso 5

    En el paso siguiente es elegir el modo de instalación  de usuario, yo normalmente selecciono la instalación en modo administrador.

    Como crear un instalador o setup con INNO SETUP paso 6

    Después de configurar el modo de instalación, pasar al siguiente cuadro de dialogo, seleccione el idioma conforme a los requerimientos del usuario.

    Como crear un instalador o setup con INNO SETUP paso 7

    Una vez seleccionado los idiomas, pasar al siguiente cuadro de dialogo, este cuadro de dialogo tiene la opción de guardar el archivo setup.exe en una ruta o directorio, y se debe nombrar del archivo instalador  o setup, el icono y finalmente el pasword lo cual no escribo la contraseña.

    Una vez realizada cuyos pasos haga clic en botón siguiente y siguiente y finalizara el asistente de configuración, y de inmediato mostrara el código de configuración  en editor de texto nos es más que el código con sintaxis de lenguaje de programación Pascal.

    En siguiente ejemplo se muestra, el código comentado que es lo que hace cada línea de código. Hay una enorme documentación  en su propia página  de Inno para que puedas programar y configurar según a tus requerimientos.

    
    ;Definición 
    
    #define MyAppName "Llavero"    ;Nombre de programa
    #define MyAppVersion "0.1"     ;Version del programa
    #define MyAppPublisher "Gitmedio"  ;Nombre de quien publica
    #define MyAppURL "http://www.gitmedio.com/"  ;Sitio web del programa
    #define MyAppExeName "Llavero.exe"      ;Nombre y extension del archivo ejecutable
    
    [Setup]
    ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
    ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
    AppId={{B1EC325C-5BAB-4101-8424-69EBBF2922C7}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    ;AppVerName={#MyAppName} {#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={autopf}\{#MyAppName}
    DisableProgramGroupPage=yes
    LicenseFile=E:\Redaccion 1\Redaccion\bin\Debug\Licencia.txt
    
    ;Ruta donde se compilara el archivo setup
    OutputDir=C:\Users\Chambi\Desktop
    OutputBaseFilename=Llavero
    SetupIconFile=E:\Redaccion 1\Redaccion\bin\Debug\Llavero.ico
    Compression=lzma
    SolidCompression=yes
    WizardStyle=modern
    ;Cuando finalice la instalacion actualizara el windows
    ;para asociar los archivos
    ChangesAssociations=true
    ;Opcion para la arquitectura de 64bit, caso contrario no es necesario incluirlos
    ArchitecturesAllowed=x64
    ArchitecturesInstallIn64BitMode=x64
    
    ;Opción de idiomas para el asistente de instalación
    [Languages]
    Name: "english"; MessagesFile: "compiler:Default.isl"
    Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
    
    [Tasks]
    Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
    
    ;Archivo ejecutable que se empaquetara y componentes que conforma el programa
    [Files]
    Source: "C:\Redaccion 1\Redaccion\bin\Debug\Llavero.exe"; DestDir: "{app}"; Flags: ignoreversion
    Source: "C:\Redaccion 1\Redaccion\bin\Debug\*"; DestDir: "{app}"; Flags: ignoreversion
    
    ;Opción para acceder al registro de windows, se puede realizar la creación de registro
    ;en este ejemplos se muestra como asociar  archivos con un icono identificador que pertenece al programa, y la 
    ;ejecución del programa
    [Registry]
    ;Tasks:fileassoc;
    ;Root: HKCR; SubKey: .tun; ValueType: string; ValueName: ; ValueData: Cliente;Flags: uninsdeletekey 
    ;Root: HKCR; SubKey: .tun; ValueType: string; ValueName: Content Type; ValueData: text/plain;Flags: uninsdeletekey
    ;Root: HKCR; SubKey: Cliente; ValueType: string; ValueName: ; ValueData: Archivo Soyu;Flags: uninsdeletekey 
    ;Root: HKCR; SubKey: Cliente\DefaultIcon; ValueType: string; ValueData: """{app}\Icon.ico"",0"; Flags: uninsdeletekey 
    ;Root: HKCR; SubKey: Cliente\DefaultIcon\icon; ValueType: string; ValueName: ; ValueData: {app}\Icono.ico,0;Flags: uninsdeletekey
    ;Root: HKCR; SubKey: Cliente\shell; ValueType: string; ValueName: ; ValueData:;Flags: uninsdeletekey
    ;Root: HKCR; SubKey: Cliente\shell\open; ValueType: string; ValueName: ; ValueData: Abrir con Soyu; Flags: uninsdeletekey
    ;Root: HKCR; SubKey: Cliente\shell\open\command; ValueType: string; ValueData: """{app}\Soyu.exe"" ""%1""";Flags: uninsdeletekey
    
    
     ;Iconos que se mostrara cuando se haga la instalación es decir los acceso directos
    [Icons]
    Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
    Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
    
    //Opción que permitirá al usuario la ejecución  del programa una vez finalizado la instalacion
    [Run]
    Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
    
    ;Sector de código, es decir en este sector 
    ;se puede realizar la programación, puede ser que hagamos validación de algún
    ;componente o librerías que necesite nuestra aplicación, generalmente algunos aplicaciones
    ;validan si existen librerías para su ejecución del programa. 
    [Code]
    
    var Verificar: Boolean;
     (**Todo el código que sea necesario **)
    

    Nullsoft Scriptable NSIS

    Es un programa de creación de instalador basada en script para Microsoft Windows lo cual permite crear instaladores muy complejos, y es lanzado bajo combinación de licencias de software libre, mantenido por la comunidad NSIS y  Nullsoft, los creadores del famoso reproductor de audio y video Winap. Es muy buena alternativa  de cómo crear un instalador o setup desde muy simples hasta muy complejos, ya que incluye varios complementos según a los requerimientos o necesidad, y es usado ampliamente en los productos comerciales como Drop Box, Google etc.

    A continuación las características NSIS:

    • Compatible con todas las versiones de Windows.
    • Soporte para varios idiomas
    • Scripts instaler o llamado el lenguaje de script makensis, que se puede realizar muchas tareas de instalación web y desinstalación con  acceso a la API de Windows.
    • Soporte para varios complementos o plugins, puede ampliarse en C, C ++ o Delphi.
    • Soporte integrado para la compresión zlib, bzip2y LZMA
    • Admite de un único archivo .EXE y una sobrecarga de 34 KB para el instalador, el script no se puede obtener del ejecutable.

    En los siguientes párrafos se muestra cómo crear un instalador o setup con Nullsoft Scriptable (NSIS).

    A continuación vamos ver cómo crear un instalador o setup. Existe una herramienta  que permite como crear un instalador o setup de una manera muy sencillo con NSIS, el nombre del programa es HM NSIS Edit que está programado en .NET y de código fuente abierta. O también se puede escribir  desde cero Scripts instaler o llamado el lenguaje de script makensis de lo cual hay muy buena documentación  para crear un instalador  de Windows desde muy simple hasta muy complejo.

    He aquí el ejemplo paso a paso de cómo crear un instalador o setup en NSIS con HM NSIS Edit.

    Vaya al menú nuevo script desde el asistente… Y se abrirá un cuadro de dialogo con cuadros de texto a llenar.

    Después de llenar los datos, pasar al siguiente cuadro de dialogo, donde dice icono del instalador puede dejar por defecto o puede modificar, escribir o renombrar el nombre del instalador y seleccionar los idiomas que sean necesarios, el tipo de de interfaz gráfica y el tipo de compresión.

    Luego de seleccionar y llenar los datos, pasar a la siguiente ventana en la que permite donde se va a instalar el programa normalmente es en C:\Program Files, y puedes adjuntar la licencia de contrato en formato RTF.

    Después de adjuntar la licencia, pasar a la siguiente opción, donde nos exige incluir todo los archivos o paquetes de nuestro programa, para realizar esta operación haga click en el botón agregar todo el directorio que es la segunda cuadro de opciones, seleccione el directorio donde está el programa y en la opción directorio destino seleccione $INSTDIR, en la opción donde dice el si archivo existe seleccioneà siempre sobrescribir, una vez realizado esta opción, también seleccionar  la opción permitir al usuario seleccionar componentes, esto si es que tiene nuestro programa componentes de terceros.

    Luego de adjuntar todo los archivos que se van a instalar, pasar a la siguiente opción  que muestra otro cuadro de dialogo, donde pide renombrar el directorio del menú inicio, seleccionar todas la opciones que sean necesarias y editar los nombres de acceso directo.

    Una vez finalizado de renombrar los archivos de accesos directos, haga clic en los botones siguientes hasta finalizar y mostrará en el editor el código fuente generado.

    En el siguiente ejemplo de código se muestra el Script que  es el UI (MUI). El MUI ya que tiene una interfaz grafica que permite programar las opciones de personalización que la interfaz

    
    ; Variables constantes definidos
    ;Nombre del programa a instalar
    !define PRODUCT_NAME "Llavero"
    !define PRODUCT_VERSION "1.0"
    !define PRODUCT_PUBLISHER "Gitmedio"
    !define PRODUCT_WEB_SITE "http://www.gitmedio.com"
    !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Llavero.exe"
    !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
    !define PRODUCT_UNINST_ROOT_KEY "HKLM"
    !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
    
    ;Sistema de compresión a la que ser realizará al compilar el archivo SETUP
    SetCompressor lzma
    
    
    !include "MUI.nsh"
    
    ;Definiciones, icono, instalador y desinstalador, se puede cambiar
    ;iconos al gusto
    !define MUI_ABORTWARNING
    !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
    !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
    ;imagen de bienvenida tambien se pude cambiar al gusto
    !define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
    ;Imagen de la cabecera
    !define MUI_HEADERIMAGE
    !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
    !define MUI_HEADERIMAGE_RIGHT
    ; Cuadro de dialogo de bienvenido
    !insertmacro MUI_PAGE_WELCOME
    ; Opción para mostrar la licencia con la que se publicando el programa
    ;!insertmacro MUI_PAGE_LICENSE "..\..\..\ruta\ala\licencia\TuLicenciaDeSoftware.txt"
    ;Opción para otros componentes de nuestro software
    ;!insertmacro MUI_PAGE_COMPONENTS
    !insertmacro MUI_PAGE_DIRECTORY
    ;Opción de grupo de iconos
    var ICONS_GROUP
    !define MUI_STARTMENUPAGE_NODISABLE
    !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Llavero"
    !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
    !define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
    !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
    !insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
    !insertmacro MUI_PAGE_INSTFILES
    !define MUI_FINISHPAGE_RUN "$INSTDIR\Llavero.exe"
    ;Cuadro de dialogo finalizacion
    !insertmacro MUI_PAGE_FINISH
    ; Cuadro de dialogo de instalación
    !insertmacro MUI_UNPAGE_INSTFILES
    
    ; Opcion de lenguajes
    !insertmacro MUI_LANGUAGE "Spanish"
    !insertmacro MUI_LANGUAGE "English"
    
    !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
    
    Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
    ;Nombre y ruta donde se compilará el archivo SETUP
    OutFile "Install-Llavero.exe"
    ;Directorio donde se instalara los archivos de programa C:\Program Files
    InstallDir "$PROGRAMFILES\Llavero"
    InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
    ;Muestra detalle de instalación
    ShowInstDetails show
    ;Muestra detalle de desinstalación
    ShowUnInstDetails show
    ;Sección de archivos a comprimir en un archivo SETUP
    Section "Principal" SEC01
      SetOutPath "$INSTDIR"
      SetOverwrite on
      File "E:\Redaccion 1\Redaccion\bin\Debug\Llavero.exe"
      SetOverwrite try
      File "E:\Redaccion 1\Redaccion\bin\Debug\Icon.ico"
      File "E:\Redaccion 1\Redaccion\bin\Debug\Licencia.txt"
      File "E:\Redaccion 1\Redaccion\bin\Debug\Listado.xml"
      File "E:\Redaccion 1\Redaccion\bin\Debug\Llavero.exe.config"
      File "E:\Redaccion 1\Redaccion\bin\Debug\Llavero.ico"
      File "E:\Redaccion 1\Redaccion\bin\Debug\Manual.pdf"
      SetOutPath "$INSTDIR"
      File "E:\Redaccion 1\Redaccion\bin\Debug\System.Data.SQLite.DLL"
    
    ; Creando Iconos en menu inicioy escritorio
      !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
      CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
      CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Llavero.lnk" "$INSTDIR\Llavero.exe"
      CreateShortCut "$DESKTOP\Llavero.lnk" "$INSTDIR\Llavero.exe"
      !insertmacro MUI_STARTMENU_WRITE_END
    SectionEnd
    ;Otros iconos adicionales como la de desinstalacion
    Section -AdditionalIcons
      !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
      WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
      CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
      CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
      !insertmacro MUI_STARTMENU_WRITE_END
    SectionEnd
    
    ;Sección para escribir en el registro de windows
    Section -Post
      WriteUninstaller "$INSTDIR\uninst.exe"
      WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Llavero.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Llavero.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
    SectionEnd
    
    ; Sección de descripciones
    !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} ""
    !insertmacro MUI_FUNCTION_DESCRIPTION_END
    
    ;Funcion
    Function un.onUninstSuccess
      HideWindow
      MessageBox MB_ICONINFORMATION|MB_OK "La desinstalación de $(^Name) finalizó satisfactoriamente."
    FunctionEnd
    ;Funcion
    Function un.onInit
      MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "¿Está completamente seguro que desea desinstalar $(^Name) junto con todos sus componentes?" IDYES +2
      Abort
    FunctionEnd
    ;Sector de desinstalcion de archivos instalados
    Section Uninstall
      !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
      ;El comando delete elimina archivo
      Delete "$INSTDIR\${PRODUCT_NAME}.url"
      Delete "$INSTDIR\${PRODUCT_NAME}\*.*"
      Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
      Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk"
      Delete "$DESKTOP\Llavero.lnk"
      Delete "$SMPROGRAMS\$ICONS_GROUP\Llavero.lnk"
      ;Comando RMDIR elimina un directorio o carpeta
      RMDir "$SMPROGRAMS\$ICONS_GROUP"
      RMDir "$INSTDIR\OpImage"
      RMDir "$INSTDIR"
       ;DeleteRegKey elimina registro de windows
      DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
      DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
      SetAutoClose true
    SectionEnd
    

    VMware InstallBuilder

    Como crear un instalador o setup con VMware InstallBuilder

    Si estas buscando una herramienta más avanzada de pago y gratuito, que incluya soporte para generar setup o instalador multiplataforma es VMware InstallBuilder. Está diseñado para simplificar la complementación del software de escritorio y servidor.

    A continuación se detallan las características.

    • Soporte compresión LZMA y LZMA Ultra
    • Soporte para crear instaladores que pueden ejecutarse en Windows, OS X y Linux y la mayoría de los otros sabores de Unix, incluidos FreeBSD, OpenBSD, AIX, OS / 400, HP-UX e IRIX.
    •  Entorno GUI fácil de aprender y fácil de usar. Diseñe, cree y pruebe instaladores con solo hacer clic en un botón.
    • Se pueden personalizar de varias maneras, tanto de forma gráfica como funcional.
    • Admiten una variedad de idiomas de instalación

    No cabe duda  es una herramienta  magnifico  para crear instaladores para diferentes plataformas, si es que tenemos también un programa multiplataforma. Si conoce alguna otra herramienta de cómo crear un instalador o setup, no olvides de dejar tu comentario.

    Sobre el autor
    Rodrigo Chambi Q.

    Desarrollador de aplicaciones web y de escritorio, amante de la tecnología y autodidacta, me gusta conocer otras tecnologías, escribir artículos para compartir en la web y para estar al tanto en los nuevos paradigmas, respeto las políticas de software privativo y libre, ya que estas políticas son las normas que permite el desarrollo tecnológico social de la humanidad. filvovmax@gmail.com -- info@gitmedio.com

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.