logo linux router

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.


Instalación

Empezamos con la instalación, si estás buscando cómo actualizar o reparar, ve al final del apunte.


Xcode command line tools [+ Xcode]

logo linux router

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
Pantalla de inicio de Xcode.
  • No instalo Xcode:
    • Ejecutar desde el CLI: xcode-select --install


iTerm2

logo linux router

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

logo linux router

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

logo linux router

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:

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.
Instalar 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"
Arranque de VSCode muy rápido desde el CLI
  • 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

logo linux router

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

logo linux router

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

logo linux router

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 ejemplo github.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

logo linux router

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
Descargo e instalo el SDK de Java

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:


Eclipse.

logo linux router

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,
Descargo la versión ARM del Eclipse Installer para Mac
  • Instalo «Eclipse IDE for Java Developers».
Instalo Eclipse IDE for Java Developers

Un tip:


Python, Pip y PipEnv

logo linux router

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
Ejecuto desde el entorno seguro `pipenv` y funciona.

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

Recomendado: Advanced Visual Studio Code for Python Developers


Ruby

logo linux router

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

logo linux router

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

logo linux router

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:

Prueba rápida con Node.js.


MongoDB

logo linux router

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

Ejecutar MongoDB

  • Arrancar o Parar MongoDB como un servicio de macOS usando brew
brew services start mongodb-community@7.0
La primera vez que arrancamos
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
Monitorizamos el fichero de Log del servidor

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.


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

  • Homebrew
brew update && brew upgrade            # Actualización estándar de homebrew


Reparaciones

  • Homebrew
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)
  • Actualizar Homebrew
gem cleanup && gem pristine --all      # Reparar problema con el comando gem