MAC para desarrollo
En este apunte describo mi bitácora de configuración de un Mac (INTEL o ARM) como equipo de desarrollo. Instalo varias aplicaciones gráficas y de línea de comando que para mi son fundamentales para trabajar con el equipo.
Está documentado partiendo de una instalación nueva de Ventura, desde cero. El orden de instalación puede variarse, pero te recomiendo (si tu MacOS está recién instalado) que sigas el mismo orden para ver los mismos resultados.
Xcode command line tools [+ Xcode]
Es obligatorio instalar las Apple command line tools (también conocidas como Xcode command line tools) porque algunas herramientas te lo van a pedir más adelante.
La instalación de Xcode es opcional, solo si vas a desarrollar para macOS, iOS, watchOS y tvOS. Dependiendo de qué decidas, el orden sería este:
- Instalo Xcode:
- Instalar Xcode desde el Apple Store. Abrirlo una vez e instalar lo que necesites (por ejemplo la poder desarrollar para iOS)
- Ejecutar desde el CLI:
xcode-select --install
- Ejecutar desde el CLI:
sudo xcodebuild -license accept
- No instalo Xcode:
- Ejecutar desde el CLI:
xcode-select --install
- Ejecutar desde el CLI:
iTerm2
iTerm2 es un sustituto al Terminal.app del MacOS. Admite muchas más cosas que el Terminal como la transparencia de ventanas, modo de pantalla completa, paneles divididos, pestañas Exposé, notificaciones Growl y atajos de teclado, perfiles personalizables y reproducción instantánea de entradas/salidas de terminales anteriores.
Instalación:
- Descargo el programa desde iTerm2
- Lo copio a Aplicaciones
Un par de tips:
- Si sufres el problema: “Cuando iTerm arranca tarda mucho en mostrar el prompt”, se resuelve con
sudo xcodebuild -license accept
- Activa un atajo en Finder, para poder abrir un
iTerm
cuando el cursor está en una carpeta de Finder.Ajustes Sistema → Teclado → Funciones rápidas de teclado → Servicios
→ Archivos y carpetas → New iTerm2 Tab Here → Ctrl Shift T
Oh My Zsh
oh-my-zsh es un entorno de trabajo en línea de comando mucho más bonito para trabajar con Zsh. Viene con miles de funciones útiles, ayudantes, plugins, temas. Trae varios plugins que hacen la vida más fácil. Lo mejor de Oh My Zsh son sus temas.
Instalación:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Fichero ~/.zshrc
Una vez instalado iTerm + Oh My Zsh te recomiendo que te copies el contenido de mi fichero ~/.zshrc
. Tras instalar iTerm2 y Oh-My-Zsh se habrá creado ya uno e irás viendo que te pido hacer modificaciones en este fichero más adelante.
Te dejo el mío, es una copia final completa, compatible con lo que acabamos de instalar y lo que instalaremos. Ahora bien, es muy importante que una vez copiado lo revises y adaptes a tu caso. El mío está preparado para un Mac sobre chip ARM. Si tu Mac usa chip Intel revisa el fichero, verás notas en las líneas para saber qué comentar/descomentar.
- Salvo el que me acaba de crear Oh-My-Zsh y descargo una copia del mío.
cd ~
cp .zshrc .zshrc.ORIGINAL
curl -s -O https://gist.githubusercontent.com/LuisPalacios/f66942b329af7920bebd4b95fa36cdb5/raw/52fe5b891b524bde6d315aab92a6b82d0dafa19e/.zshrc
Visual Studio Code
Visual Studio Code es un editor de código fuente desarrollado por Microsoft para Windows, Linux, macOS y Web. Incluye soporte de tantas cosas que es imposible explicarlo aquí. Con la inmensa diversidad de características, plugins y lenguajes soportados puedes usarlo como IDE para cualquier proyecto.
Instalación:
- Descargarlo desde aquí.
- Lo copio a Aplicaciones
Un par de tips:
- Para poder arrancarlo cómodamente desde iTerm2, con VSCode lanzado, pulsa CMD-SHIFT-P e instala el comando ‘code’ en el PATH.
- Crea un alias en tu
~/.zshrc
para lanzar el programa de forma rápida desde el CLI. Si te bajaste mi copia no hace falta que lo hagas.
# Alias para llamar a VSCode desde CLI con "e"
alias e="/usr/local/bin/code"
- A partir de ahora, cuando estas en un directorio y quieres editar todo lo que cuelga de él, simplemente escribe
e .
Consejos sobre VSCode
- Con VSCode puedes hacerlo todo desde el teclado. Ya trae un subconjunto de comandos mapeado a Atajos de teclado. Si quieres aprender estos atajos por defecto, imprime el PDF para Windows, macOS o Linux y déjalo cerca.
Homebrew
Siendo desarrollador con un Mac, quieres Homebrew (o brew
por resumir) Aunque Mac OS trae de todo (al estar basado en FreeBSD) por desgracia no está a la última y le faltan cosas.
Con brew
vas a poder instalar (en paralelo a tu Mac OS sin tocarlo ni estropearlo) un montón de programas de software libre super interesantes, software de bajo nivel, herramientas para la línea de commandos, aplicaciones, compiladores, lenguajes, etc. podrás instalar hasta MongoDB (ver más adelante).
Instalación:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
source ~/.zshrc
Líneas relevantes en mi ~/.zshrc
# LuisPa: --------------------------------------------------------------
export PATH=$HOME/0_priv/bin:/usr/local/bin:/usr/local/sbin:$PATH
launchctl setenv PATH "/usr/local/bin:/usr/local/sbin:$PATH"
# Homebrew
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/luis/.zprofile # Homebrew en Mac ARM
eval "$(/opt/homebrew/bin/brew shellenv)" # Homebrew en Mac ARM
#(echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/luis/.zprofile # Homebrew en Mac Intel
#eval "$(/usr/local/bin/brew shellenv)" # Homebrew en Mac Intel
# Ruby y Gems
export PATH="/opt/homebrew/opt/ruby/bin:~/.gems/bin:$PATH" # Versión para Mac ARM
#export PATH="/usr/local/opt/ruby/bin:~/.gems/bin:$PATH" # Versión para Mac Intel
# LuisPa: --------------------------------------------------------------
Git
Git es un sistema de control de versiones distribuido, gratuito y de código abierto, diseñado para gestionar desde proyectos pequeños a muy grandes con rapidez y eficacia. Existen varias opciones de Instalación del cliente para la línea de comandos (fuente original), en mi caso utilizo la de Homebrew.
Instalación:
brew update && brew upgrade
brew install git
source ~/.zshrc
Creo el fichero ~/.gitconfig y ~/.gitignore_global, que te puedes bajar así:
curl -s -O https://gist.githubusercontent.com/LuisPalacios/0ee871ee236485d4a064179b16ada400/raw/348a8a448095a460756f85ef0362521b886b0a2e/.gitconfig
curl -s -O https://gist.githubusercontent.com/LuisPalacios/6923f8cc708ce10f3bd4a6772625fb0c/raw/65d0ed6acba83ece4db78228821589212b9f9f4b/.gitignore_global
# Edítalo para adaptarlo
e .gitconfig
Como cliente GUI uso GitKraken. Tienes más información sobre git en esta chuleta sobre GIT y GIT en detalle.
SSH clave pública-privada
Ahora es buen momento para configurar tu pareja de claves pública/privada para conectar con Hosts remotos y/o usarlo con servidor(es) Git. La clave pública-privada SSH es un sistema de autenticación y encriptación utilizado para la conexión entre un cliente y un servidor. Se utilizan un par de claves: una clave pública y una clave privada. Los dos casos de uso más típicos son:
- Conectar desde mi Terminal con un servidor remoto.
- Conectar mi cliente
git
con un servidor Git remoto (por ejemplogithub.com
)
Creo mi clave pública-privada, crea dos archivos de texto bajo ~/.ssh
.
➜ ~ ssh-keygen -t ed25519 -a 200 -C "luis@mihost" -f ~/.ssh/id_ed25519
:
Enter passphrase (empty for no passphrase): <=== Pon una contraseña que usarás durante las futuras conexiones
Your identification has been saved in /Users/luis/.ssh/id_ed25519 <== Clave PRIVADA. NUNCA LO COMPARTAS
Your public key has been saved in /Users/luis/.ssh/id_ed25519.pub <== Clave PÚBLICA. Este contenido es el que compartes !!
:
El contenido del fichero con la clave pública lo compartes con el servidor remoto (github
o un linux para terminal remoto), mientras que la clave privada se mantiene en local. Simplificándolo muchísimo, mi clave pública que le paso a Github la va a usar para encriptar información que solo yo, que poseo la privada equivalente, puedo descifrar y así comunicarnos.
En el caso de Github se puede usar este método (SSH pública-privada) para acceso directo a tu cuenta y modificar repositorios de forma segura, sin necesidad de hacer login (https con usuario y contraseña). Es importante destacar que debes mantener tu clave privada segura, ya que si alguien más la tiene, puede acceder a tu cuenta y repositorios.
El contenido de tu pública se comparte:
- En equipo linux remotos con los que quiero conectar: añadiéndolo al final del fichero
~/.ssh/authorized_keys
- En Servidores GIT, a través de su GUI, en la propiedades de mi cuenta.
Tienes un par de apuntes adicionales en SSH y X11 y SSH en Linux
Java
Podemos instalar JRE (Java Runtime Environment) para ejecutar aplicaciones Java o el JDK (Java Development Kit), para desarrollar y ejecutar aplicaciones Java.
En mi caso obviamente me instalo JDK, trae herramientas como el compilador (javac), el desensamblador de binarios (javap), el debugger, etc. y toda instalación de JDK incluye JRE. Te recomiendo echar un ojo a esta imagen sobre la estructura de componentes de Java.
Instalación:
- Conecto con Java SE Development Kit y me bajo la versión JDK 20 para macOS. En mi caso elegí la versión ARM64 DMG Installer
Una vez instalado, hacemos nuestra prueba de concepto desde iTerm
$ mkdir -p ~/Desktop/hola
$ cd ~/Desktop/hola
$ cat > HolaMundo.java << EOF
public class HolaMundo {
public static void main(String[] args) {
System.out.println("Hola Mundo!");
}
}
EOF
$ javac HolaMundo.java
$ ls -l
total 16
-rw-r--r--@ 1 luis staff 423 22 abr 15:22 HolaMundo.class
-rw-r--r--@ 1 luis staff 111 22 abr 15:21 HolaMundo.java
$ java HolaMundo
Hola Mundo!
Te dejo aquí algunas referencias interesantes:
- Las notas sobre la instalación del JDK
- Información y requisitos del sistema para instalar y usar Oracle Java en Mac OS X
- Artículo sobre la Actualización manual necesaria para Java 8 en macOS.
Eclipse
Podrías usar Visual Studio Code como IDE pero lo más normal es que te instales Eclipse, es La plataforma para trabajar con Java, y mucho más, en realidad con herramientas de programación de código abierto multiplataforma para desarrollar Aplicaciones.
Típicamente se ha usado para desarrollar IDE’s (entornos de desarrollo integrados), como el del propio Java (Java Development Toolkit - JDT).
Instalación:
- Conecto con Eclipse y me bajo el Eclipse Installer.
- Lo copio a Aplicaciones, podré instalar ahora o en el futuro otras opciones
- Lo ejecuto desde Aplicaciones,
- Instalo «Eclipse IDE for Java Developers».
Un tip:
- Un apunte que hice sobre cómo trabajar con Eclipse + Java sobre repositorio Git.
Python, Pip y PipEnv
Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en la legibilidad de su código. Soporta parcialmente la orientación a objetos, programación imperativa y algo de programación funcional. MacOS trae versiones antiguas de Python 2 y 3 que NUNCA deben borrarse o sobreescribir. Uso Homebrew para hacer una instalación paralela.
Pip es un indispensable, es el sistema de gestión de paquetes utilizado para instalar y administrar programas y paquetes hechos en Python desde el Python Package Index (PyPI), el repositorio de software oficial para aplicaciones de terceros en Python.
PipEnv es otro indispensable. Las aplicaciones en Python hacen uso de paquetes y módulos que no forman parte de la librería estándar. Gestionar todas las librerías que deben acompañar a mi programa es un infierno. Con PipEnv
puedo “contener” todo dentro de un directorio, creando un entorno virtual, sin conflictos. Nota: hay dos paquetes equivalentes a PipEnv
: Virtualenv y Conda que no suelo utilizar.
Instalación:
brew install python <--- (También nos instala pip)
brew install pipenv
source ~/.zshrc
Cuando instalamos Homebrew (en un paso anterior) ya habíamos modificado el PATH en ~/.zshrc
. Homebrew deja los ejecutables en /usr/local/
en Mac’s Intel y en /opt/homebrew
en Mac’s ARM. Creo un par de alias, de modo que al ejecutar python
o pip
en realidad se ejecuten las últimsa versiones de Homebrew.
# Añado al final de ~/.zshrc
# Mac ARM
alias python="/opt/homebrew/bin/python3"
alias pip="/opt/homebrew/bin/pip3"
# Mac Intel
#alias python="/usr/local/bin/python3"
#alias pip="/usr/local/bin/pip3"
Compruebo las versiones
python --version
Python 3.11.3
pip --version
pip 23.0.1 from /opt/homebrew/lib/python3.11/site-packages/pip (python 3.11)
pipenv --version
pipenv, version 2023.3.20
- Prueba de concepto: Crear un mini proyecto.
Voy a crear un mini proyecto en Python, con un único fuente llamado main.py
bajo un entorno virtual preparado con pipenv
. Recuerda que debes instalar las librerías necesarias con pipenv
siempre desde el directorio de tu proyecto. En este ejemplo uso la librería requests
.
cd Desktop
mkdir proyecto
cd proyecto
pipenv install requests
pipenv lock
Copia el código siguiente, ejecuta cat > main.py
, pégalo y sal: ⌘V, ⮐, ⌃D
import requests
response = requests.get('https://httpbin.org/ip')
print('Tu dirección IP es: {0}'.format(response.json()['origin']))
Ejecuta la prueba de concepto
pipenv run python main.py
Ya tienes python
instalado y funcionando. Podemos borrar el directorio de pruebas.
cd ~/Desktop
rm -fr proyecto
Integración con Visual Studio Code
Dejo aquí algunas recomendaciones para integrar Visual Studio Code y Python
- Instalar Python extension
Recomendado: Advanced Visual Studio Code for Python Developers |
Ruby
MacOS ya trae Ruby, pero voy a instalar la última versión con Hombrew en paralelo. Necesito Bundler
y Jekyll
(ver más adelante) para trabajar en mi blog en local (más info aquí). Ruby es un lenguaje de programación interpretado, reflexivo y orientado a objetos, creado por el programador japonés Yukihiro “Matz” Matsumoto, quien comenzó a trabajar en Ruby en 1993, y lo presentó públicamente en 1995.
Instalación:
brew install ruby
Ruby no se asocia directamente al directorio de instalación de Homebrew al terminar de instalarlo y el motivo es que podría entrar en conflicto con la instalación de Ruby que trae el MacOS. En mi caso sí que quiero que se ejecute este nuevo Ruby así que añado su PATH en el fichero .zshrc
y también el sitio donde voy a instalar las futuras “gemas” (~/.gems/bin
).
# LuisPa: Añado el path de Ruby y de las futuras Gemas a mi fichero .zshrc
# Versión para Mac ARM
export PATH="/opt/homebrew/opt/ruby/bin:~/.gems/bin:$PATH"
# Versión para Mac Intel
#export PATH="/usr/local/opt/ruby/bin:~/.gems/bin:$PATH"
Para poder instalar gem’s sin necesidad de ser root
(es decir sin sudo
) y que se instale todo en un directorio de mi usuario, creo el directorio ~/.gems
y modifico ~/.zshrc
:
mkdir ~/.gems
- Añadir al final de
~/.zshrc
export GEM_HOME=~/.gems
export PATH=~/.gems/bin:$PATH
Recuerda salir de iTerm y volver a entrar o ejecutar source ~/.zshrc para que encuentre los nuevos ejecutables |
Jekyll y Bundler
Los necesito para trabajar con mi blog en local. Jekyll es un generador simple para sitios web estáticos con capacidades de blog (creas ficheros markdown y él te genera el HTML). Está escrito en Ruby por Tom Preston-Werner (cofundador de GitHub) y es rapidísimo. Bundler es un gestor de paquetes de software que va a facilitar el trabajo con Jekyll y sus dependencias.
Instalación:
gem install jekyll bundler
Nota1: Se instalan en /Users/luis/.gems/bin/jekyll , así que es muy importante que hayas actualizado tu PATH en el paso anterior. |
Nota2: Al terminar la instalación me da un mensaje: A new release of RubyGems is available: 3.4.10 → 3.4.12 y propone que ejecute gem update --system 3.4.12 . Lo ignoro, voy a seguir los procesos de actualización que haga brew cuando toque |
Una vez que tengo todo lo anterior instalado hago una prueba de concepto:
jekyll new test
New jekyll site installed in /Users/luis/test.
cd test
bundle add webrick
bundle exec jekyll serve
Desde un browser conecto con http://127.0.0.1:4000/ y veo que funciona!!
Node-JS
Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para servidor, basado en JavaScript, asíncrono, con E/S de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google. Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web.
Podría instalar Node.js desde su sitio oficial, pero implica utilizar sudo
. Si lo instalo con Homebrew lo tengo en el usuario, no tengo que tocar el PATH y además es más fácil instalar paquetes con NPM.
Instalación:
brew install node
node -v
v19.9.0
npm -v
9.6.3
Vamos a hacer un ejemplo super sencillo:
MongoDB
MongoDB es un sistema de base de datos NoSQL, orientado a documentos y de código abierto. En lugar de guardar los datos en tablas, tal y como se hace en las bases de datos relacionales, MongoDB guarda estructuras de datos BSON (una especificación similar a JSON) con un esquema dinámico, haciendo que la integración de los datos en ciertas aplicaciones sea más fácil y rápida
Instalo MongoDB 6.0 Community Edition en macOS utilizando Homebrew (fuente). Uso un tap
, solo se hace una vez. Consiste en añadir un repositorio (externo) a la lista de sitios desde donde instala Homebrew.
Preparar la instalación:
brew tap mongodb/brew
brew update
Instalación (incluye el servidor mongod
, el mongos sharded cluster query router
y la shell mongosh
):
brew install mongodb-community@7.0
Intel | ARM | |
---|---|---|
Configuración | /usr/local/etc/mongod.conf | /opt/homebrew/etc/mongod.conf |
Log | /usr/local/var/log/mongodb | /opt/homebrew/var/log/mongodb |
Datos | /usr/local/var/mongodb | /opt/homebrew/var/mongodb |
Ahora a ejecutar MongoDB
- Arrancar o Parar MongoDB como un servicio de macOS usando
brew
brew services start mongodb-community@7.0
brew services stop mongodb-community@7.0
Si Mac OS no deja abrir mongodb o mongosh por un tema de seguridad: Preferencias -> Security and Privacy pane > Gemeral > mongod Open Anyway or Allow Anyway
Comprobar que arrancó y escucha en localhost
en el puerto por defecto 127.0.0.1:27017
netstat -na|grep -i 27017
tcp6 0 0 ::1.27017 *.* LISTEN
tcp4 0 0 127.0.0.1.27017 *.* LISTEN
a3f97c9f1c2bb4f1 stream 0 0 a3f97cad866b9521 0 0 0 /tmp/mongodb-27017.sock
Y pdemos monitorizar el Log
tail -f /opt/homebrew/var/log/mongodb/mongo.log
Un programa de ejemplo
Te dejo una referencia a un pequeño proyecto en GitHub para que puedas probar npm
y mongod
.
Jupyter Lab
Jupyter Lab es una aplicación web que permite codificar, ejecutar y “documentar”. Esta última es una de las partes más interesante del proyecto, puedes tener documentación y código a la vez y que se ejecute.
He documentado el proceso en otro apunte, más antiguo. La parte de Python puedes ignorarla porque la de aquí es más moderna, pero el resto te puede valer: Python y JupyterLab en MacOS.
VirtualBox y Vagrant
Nota: Este punto solo me ha funcionado en un Mac on chip Intel, así que estás avisado, de momento no he encontrado cómo emular un Linux o Windows ARM con VirtualBox y Vagrant instalados en un Mac con Apple Silicon (ARM) |
VirtualBox es un software de virtualización que permite isntalar sistemas operativos adicionales, conocidos como «sistemas invitados, guest o máquinas virtuales», dentro de tu sistema «anfitrión» (en mi caso el MacOS), cada uno con su propio ambiente virtual. Puedes crear máquinas virtuales basadas en FreeBSD, GNU/Linux, OpenBSD, OS/2 Warp, Windows, Solaris, MS-DOS, Genode y muchos otros.
Vagrant permite crear y configurar entornos de desarrollo virtuales, ligeros y reproducibles, creando máquinas virtuales. Usa VirtualBox como virtualizador de forma nativa.
Podemos instalar ambos para montarnos Servidores virtuales para acompañar a nuestros desarrollos de software.
No dejes de leer el apunte Vagrant para desarrollo.
HTTPie
Recomiendo la herramienta HTTPie si vas a trabajar con API’s. Te ayuda a trabajar con tus API’s de forma sencilla e intuitiva. Tienen una versión gráfica y otra CLI.
El proceso para instalarlo en el Mac:
- Desde la página de Descargas accedo a Download for MAC y me instalo la versión GUI
Ejemplos:
- Hola Mundo
https httpie.io/hello
- Método HTTP personalizado, encabezados HTTP y datos JSON
http PUT pie.dev/put X-API-Token:123 name=John
- Envío de formularios
http -f POST pie.dev/post hello=World
- Ver la solicitud que se está enviando utilizando una de las opciones de salida
http -v pie.dev/get
- Construir e imprimir una solicitud sin enviarla utilizando el modo offline
http --offline pie.dev/post hello=offline
- Usar la API de Github para publicar un comentario en un issue con autenticación
http -a USERNAME POST https://api.github.com/repos/httpie/cli/issues/83/comments body=HTTPie is awesome! :heart:
- Subir un archivo utilizando entrada redirigida
http pie.dev/post < files/data.json
- Descargar un archivo y guardarlo mediante salida redirigida
http pie.dev/image/png > image.png
- Descargar un archivo al estilo wget
http --download pie.dev/image/png
- Usar sesiones nombradas para hacer persistentes ciertos aspectos de la comunicación entre solicitudes al mismo host
http --session=logged-in -a username:password pie.dev/get API-Key:123
http --session=logged-in pie.dev/headers
- Establecer un encabezado de host personalizado para evitar la falta de registros DNS
http localhost:8000 Host:example.com
Otros
Dejo aquí una lista de programas que suelo instalar en mi portatil. Puedes instalar varios a la vez, poniendo más de uno en la lína de comandos (separados por espacio).
Instalación:
brew install <programa(s)>
Programa | Descripción |
---|---|
ffmpeg | Una solución completa y multiplataforma para grabar, convertir y transmitir audio y vídeo. |
iperf3 | Para hacer pruebas en redes. El caso de uso es crear flujos de datos TCP y UDP y medir el rendimiento de la red. |
jq | Filtrar, buscar y mostrar de forma “bonita” el resultado de un JSON en lugar de en una sola línea. |
knock | Cliente para hacer “Port Knocking” (llamar a la puerta), una técnica para aplicar seguridad a nuestro servidor. |
Mantenimiento
Normalmente nos olvidamos de mantener lo que instalamos, así que saber cómo hacer actualizaciones y reparaciones es interesante. Suelo actualizar periódicamente, mínimo una vez al mes, aunque no instale nada nuevo. Compruebo que está todo al día. Los programas que no menciono en esta sección se actualizan automáticamente desde AppStore o sus propias opciones GUI.
Actualizaciones
brew update && brew upgrade # Actualización estándar de homebrew
Reparaciones
brew update && brew update
brew doctor # Herramienta de autodiagnóstico de Homebrew.
brew --version # Comprobar la versión
brew list # Ver que está instalado
brew cask list # Ver que cask’s están instalados
brew leaves # Top level instalados (es lo más interesante)
gem cleanup && gem pristine --all # Actualizar hombrew cuado necesitas reparar problemas con el comando gem