{"id":19537596,"url":"https://github.com/elixircl/machine","last_synced_at":"2026-04-28T12:35:51.294Z","repository":{"id":130381667,"uuid":"528461475","full_name":"ElixirCL/machine","owner":"ElixirCL","description":"💻 Dev Machine para Elixir con Debian 11","archived":false,"fork":false,"pushed_at":"2022-10-05T12:49:08.000Z","size":34,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T04:30:40.563Z","etag":null,"topics":["debian","elixir","hacktoberfest","linux"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ElixirCL.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.adoc","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-24T14:31:46.000Z","updated_at":"2024-05-08T15:15:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"c438881f-e374-4f3c-89b6-ec9ceec3a8cd","html_url":"https://github.com/ElixirCL/machine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ElixirCL/machine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ElixirCL%2Fmachine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ElixirCL%2Fmachine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ElixirCL%2Fmachine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ElixirCL%2Fmachine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ElixirCL","download_url":"https://codeload.github.com/ElixirCL/machine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ElixirCL%2Fmachine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32381686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T11:25:28.583Z","status":"ssl_error","status_checked_at":"2026-04-28T11:25:05.435Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["debian","elixir","hacktoberfest","linux"],"created_at":"2024-11-11T02:28:36.320Z","updated_at":"2026-04-28T12:35:51.262Z","avatar_url":"https://github.com/ElixirCL.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":":doctype: book\n:encoding: utf-8\n:numbered:\n:source-linenums-option:\n:username: elixircl\n:source: https://github.com/ElixirCL/machine\n:producer: elixircl.github.io\n:copyright: CC-BY-NC-SA 4.0\n:lang: es\n:description: Un simple proyecto para documentar la configuración del ambiente para desarrollo con Elixir en una Raspberry Pi 4 con Debian 11.\n:keywords: elixir, programación, lenguaje, referencia\n:imagesdir: images\n:front-cover-image: assets/cover.png\n:epub-chapter-level: 2\n:toc: left\n:toclevels: 3\n:toc-title: Tabla de Contenidos\n:source-highlighter: highlight.js\n:highlightjs-languages: elixir, javascript, bash, sh, lua, c, txt, html, yaml, toml, json, rust\n:ext-relative:\n//:stylesheet: style.css\n\n# Elixir Dev Machine en Debian 11\n\nUn simple proyecto para documentar la configuración del ambiente\npara desarrollo con Elixir en una Raspberry Pi 4. \n\nTambién servirá en su mayoria para cualquier Debian 11.\n\nLa idea es tener un entorno minimalista pero bonito, que tenga todas las herramientas\nnecesarias para desarrollar proyectos con Elixir. Buscando una estética Synthwave/Cyberpunk.\n\nEl objetivo es tener un entorno que se pueda usar con el teclado lo más posible, \nevitando el uso de ratón (solo para uso en el navegador).\n\nEscrito por https://ninjas.cl[Camilo Castro] y https://github.com/elixircl/machine/graphs/contributors[colaboradores]. \nPara https://elixircl.github.io[Elixir Chile].\n\nA menos que se especifique explícitamente, los contenidos de ésta obra están bajo una http://creativecommons.org/licenses/by-nc-sa/4.0/[Licencia Creative Commons Atribución-No-Comercial-Compartir-Igual 4.0 Internacional]\nhttp://creativecommons.org/licenses/by-nc-sa/4.0/[image:https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png[Licencia Creative Commons]]. El código fuente está bajo la licencia MPLv2.\n\ntoc::[]\n\n## Componentes de Hardware\n\n- Rasperry PI 4 Model B 8GB Ram comprada en https://altronics.cl/kit-raspberry-pi4-8gb\n- Tarjeta SD Kingstone 32 GB (KN3-042).\n\n## Componentes de Software\n\nAlgunos software que se usarán, algunos son opcionales y mera opinión personal.\n\n- DietPI https://dietpi.com/ ARMv8 64-bit (https://dietpi.com/downloads/images/DietPi_RPi-ARMv8-Bullseye.7z)\n- https://dwm.suckless.org/\n- https://www.balena.io/etcher/\n- https://asdf-vm.com/\n- https://neovim.io/\n- https://github.com/alacritty/alacritty\n- https://ohmyz.sh/ o https://fishshell.com/\n- https://starship.rs/\n- https://librewolf.net/installation/debian/\n\n## Instalación de DietPI\n\nPara comenzar descargaremos la imagen de https://dietpi.com/downloads/images/DietPi_RPi-ARMv8-Bullseye.7z[DietPI] y utilizaremos\nhttps://www.balena.io/etcher/[Balena Etcher] para grabarla en nuestra tarjeta SD.\n\nLa insertamos en nuestra Raspberry y comenzaremos el proceso de instalación.\nIdealmente siguiendo las guías de instalación y seguridad.\n\n- https://www.raspberrypi.com/documentation/computers/configuration.html#securing-your-raspberry-pi\n- https://raspberrypi-guide.github.io/other/Improve-raspberry-pi-security\n- https://dietpi.com/docs/install/\n\n## Config Inicial\n\n### Actualización\n\n```sh\n# sudo apt-get update\n# sudo apt-get upgrade\n```\n\n### Neovim\nNuestro editor de cabecera será _NeoVim_, para instalarlo debemos https://github.com/neovim/neovim/wiki/Installing-Neovim[seguir su manual].\nÉsto solamente será para tener un editor de texto básico. Luego realizaremos una instalación y configuración más apropiada para la edición\nde código fuente.\n\n```sh\n# apt-get install neovim\n```\n\n### Git\nNuestro control de versiones será con _GIT_. Luego podremos configurarlo apropiadamente. Por ahora nos servirá para descargar algunas herramientas.\n\n```sh\n# apt-get install git\n```\n\nTambién si se trabaja mucho con Github se puede instalar https://github.com/github/hub[`hub`]:\n\n```sh\n# apt install hub\n```\n\n### Configuración de las Fuentes de Terminal\n\nLa terminal se verá mejor si se selecciona la fuente _TerminusBold_ de _16x32_.\nLa terminal utiliza fuentes `.psf` (bitmap) y no permite `.ttf` (vectorial) https://raspberrypi.stackexchange.com/questions/71911/how-do-i-install-a-new-console-font[ver más].\n\n```sh\n# dpkg-reconfigure console-setup\n```\n\nÉsto sólo aplica si vas a usar la pantalla directamente. Si te conectas por SSH a la raspberry entonces puede no ser necesario.\nDe todas formas se puede configurar para mayor facilidad de lectura en pantallas con alta resolución.\n\n### SSH\n\n_SSH_ es necesario para acceder remotamente a nuestra máquina.\n_DietPI_ ofrece dos alternativas. https://matt.ucc.asn.au/dropbear/dropbear.html[Dropbear] y https://www.openssh.com/[OpenSSH].\n\n_Dropbear_ es una alternativa ligera, pero carece de ciertas características como _scp_ y _sftp_. Por lo que debemos https://github.com/MichaIng/DietPi/issues/3296[instalarlas por separado] mediante las herramientas de _OpenSSH_ (solo cliente, no servidor).\n\n```sh\n# apt install openssh-client openssh-sftp-server\n```\n\n_OpenSSH_ es la opción tradicional y más completa.\n\nSe puede instalar mediante:\n\n```sh\n# dietpi-software install 105\n```\n\no (para Debian 11)\n\n```sh\n# apt install openssh-server\n```\n\nPodremos verificar su funcionamiento mediante el comando:\n\n```sh\n# ss -tlpn\n```\n\n### Banners\n\nLo primero que haremos es poner un login screen bien pulento, recordando los viejos tiempos de la BBS.\nUsaremos el siguiente ANSI:\n\nimage:https://user-images.githubusercontent.com/292738/185671384-035eaf43-7a56-4f38-ba8f-a88ab62bd000.png[https://16colo.rs/pack/rev0902/LD-EMENU.ANS]\n\nObtenido desde https://16colo.rs/pack/rev0902/LD-EMENU.ANS\n\nTambién usaremos un conversor de CP437 a UTF8\n\nhttp://codelobe.com/tools/cp437-converter\n\ncon unos pocos ajustes se debería ver así:\n\nimage:https://user-images.githubusercontent.com/292738/185677622-ef4ae111-076c-458b-80f7-a30fac21e193.png[]\n\n```text\n[35m░░▓▌    ▐██▀[37m  [1;33m▄▄▄▄▄[0m [35m▀▀███▓▓▓▀▀▀▀▀█▓▀▀▀▀▀▀▀▀█▓▀▀▀▀▀▀▀▀▀▀▀▀▀▀▓▓██▀  █▓▓▓▓██▄ ▐▓░░\n▓▓██▄▄▄[1;45m░[0;35m▀▐▌[37m  [1;33m▐█[0;33m▀▀[1;43m▀[47m▓▓[43m█[40m▄▄▄[0m [35m▀▀▀[37m [1;33;47m▓▓[43m█[0m [35m██[37m  [1;33;47m▓[43m█[40m▌[43m█[47m▓[40m▄[0;35m▀[37m  [1;33m▄[43m██[40m▐[47m▓[43m█[0m [1;33;43m█[47m▓[43m▓▓█[40m▄▄[0m [35m▀[1m▒[0;35m▄▄█▀   ▐██▓▓██▓▓[37m[0m\n[35m  ▐██[1;45m░[0;35m▄▄[1;45m▓░[0;35m▓▄[37m [33m [1m▀▀[0m [33m▐[1;43m█▓▓[40m▀▀▀[43m███▓[0;33m [1;43m▓▓▒[0m [35m▓█░[33m [1m▐[43m▓▓[0m [1;33m▀[43m█▓[40m▄[47m▓▓[40m▀[0m [1;33m▐[43m▓▓[0m [1;33;43m▓▓▒[0m [1;33m▀▀[47m▓[43m█[40m▌[0;35m▐███▄  ▄███[1;45m░░░[0;35m███[37m[0m\n[35m▄▄█▌▄██[1;45m░░░[0;35m███▄▄▌[37m [33m▐[1;43m▓▒[0;33m▌[37m [35m   ▄[37m  [33m▐[1;43m▒▒[0;33m▌[35m▐█[1m▒[0;35m▌[33m ▐[1;43m▒▒[0m  [33m▄[1;43m░▓▓[40m▄[0m [35m [1;33;43m░▒[40m▌[0m [1;33m▐[43m▒▒[0;33m▄▄[1;43m▒▓[40m▀[0;33m [35m▓█▀▄▓████[1;45m░░▓▓▓░[0;35m██ \n[1;45m░░[0;35m██▀[37m [33m▄▄▄▄▄[37m [35m▀██[37m  [33m█[1;43m░[0;33m█▀▀▀▀[35m▄▓░[37m [33m▓[1;43m░░[0;33m▌[35m▀ [33m▄▄▄▓[1;43m░░[0;33m▄█[1;43m░[0;33m▀[37m [33m▀[1;43m░░[0;33m▄[1;43m░░[0;33m▓[37m [33m▐[1;43m░░[0;33m▓[1;43m░░[0;33m▄▄[37m [35m▀██▀▀[37m [33m▄▄▄▄▄[37m [35m▀[1;45m░[0;35m█[1m▒[0;35m█[37m[0m\n[35m██▓▓[37m [33m▓[1;43m▓▓▀[0;33m▀▀▀▌[35m▐█[37m  [33m███[37m [35m▓▀▀[37m [33m▄▄██▌▀▄███▀▀▀███▄[37m [35m▐▄ [37m [33m▀██▌▀▄▓██▌[37m [33m▀▀██▄[37m [35m░[37m [33m▐▀▀▀[1;43m▀▓▓[0;33m▓[37m [35m███▓[37m[0m\n[35m▀[37m [33m▄[37m [35m [33m█[1;43m▒▒[0;33m [37m  [35m▄▄▐▓░[37m [33m▐[1;43m░░[0;33m▓▄▄███▀▀▐█[1;43m  [0;33m▀[37m[3C[33m▄▄ ▀██▓ [35m▓█[37m[3C[33m▀▀███▀▀[35m ▓▌[37m [33m [1;43m░░[0;33m█[37m [35m▓▄▄[37m  [33m [1;43m▒▒[0;33m█[37m  [33m▄[37m [35m░[37m[0m\n [1;33;43m▄[0;33m▌[35m░[37m [33m▐[1;43m░░[0;33m▌[37m [35m▐[1m▒[0;35m███▌  [33m▀███▀▀▄▄███[1;43m░░[0;33m▄ [35m░[33m [1;43m░[0;33m▌ ▀[37m [33m▐█[1;43m░[0;33m▌[35m░[37m [33m▄▄███[1;43m░░[0;33m▄▄[35m ▀▀  [1;33m▐[43m▓░[0;33m▌[35m▐██▌[33m ▐[1;43m░░[0;33m▌[35m░[37m [33m▐[1;43m░[0m\n [1;33;43m▓▌[0;33m▄▄▄▀██▄▄▄[37m [35m▀▀▀[37m  [33m▄▄▄█[1;43m░░[0;33m▀▀[37m[4C[33m▀[1;43m░▓[0;33m  ▀█▄▄▄[1;43m░░[0;33m▀ ▄█▀▀[37m[5C[33m▀▀███▄▄▄[1;43m░░[0;33m█[37m [35m▀[37m [33m▄▄▄█[1;43m░[0;33m▀▄▄▄[1;43m░▓[0m\n [1;33;43m▒▒[0;33m▀▀▀█[1;43m░░[0;33m▀▀▓▓▓█▓███▀▀▀[37m[9C[33m▐[1;43m░[0;33m   [37m [33m▀▀▀▀   █▌[37m[11C[33m▀▀▀██████▓▓▀▀██▓▀▀▀[1;43m░▒[0m\n [33m▐[1;43m░[0;33m▌ [35m▄[33m  ▀▌ [37m[3C[33m    [37m[3C[33m       ▐▄▄▀  [35m          [33m ▀▄▄▀              [37m[6C[33m▐▀[37m  [35m▄ [33m▐[1;43m░[0;33m▌[37m[0m\n  [33m█[1;43m░[0;33m▌ [35m▓▄[33m  [37m[61C[35m▄█ [37m [33m█[1;43m░[0;33m [37m[0m\n[33m░[37m [33m █▓▌ [35m▀[33m [37m[4C[33m [37m        [9C[33m [37m             [5C[33m  [37m                  [35m▀[37m   [33m█▓ ░[37m[0m\n[33m  [37m [33m▐█▓▌[37m[6C[33m [37m           [6C[33m [37m         [9C[33m  [37m             [7C[33m ▐█▌[37m[0m\n[33m▐▄▄██▀[37m[7C[33m [37m               [33m   [37m          [8C[33m  [37m                 [4C[33m ▓█▄▄▌[37m[0m\n  [33m▀▀[37m[9C[33m [37m      [11C[33m [37m   [35mELIXIR Pi     [4C[33m [37m        [9C[33m [37m[3C[33m▀▀\n```\n\nMayor info sobre los códigos de terminal acá:\n\n- https://wiki.bash-hackers.org/scripting/terminalcodes\n- https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797\n\nPara mayor información sobre la configuración de los banners podemos leer la https://dietpi.com/forum/t/tutorial-editing-ditepi-terminal-banner/2712[documentación de DietPi] al respecto.\n\n#### Boot Banner\n\nPara configurarlo simplemente debemos editar el archivo http://www.escomposlinux.org/lfs-es/blfs-es-1.0/postlfs/logon.html[`/etc/issue`].\nAunque no se verá muy bien debido a las limitaciones de caracteres de la terminal tradicional.\n\n```sh\n# vim /etc/issue\n```\n\nSi queremos ver como queda solo necesitamos aplicar el comando `cat`:\n\n```sh\n# cat /etc/issue\n```\n\n#### SSH Banner\n\nSi nos conectamos por _SSH_ también podemos poner un banner de bienvenida.\n\nPodemos ir a la línea 331 de `/boot/dietpi/func/dietpi-banner`\ny agregar lo siguiente:\n\n```bash\n# Elixir Header\ncat /etc/issue\n```\n\n```text\n....\n#/////////////////////////////////////////////////////////////////////////////////////\n# Main Loop                          \n#/////////////////////////////////////////////////////////////////////////////////////\n                                             \n# Elixir Header\ncat /etc/issue  \n                                                     \nif (( $INPUT == 0 ))\nthen                                                               \n    Print_Header\n    Print_Local_Ip                              \n....\n```\n\nSi ejecutamos \n\n```sh\n# dietpi-banner\n```\n\npodremos configurar otras opciones del banner.\n\nAdicionalmente si editamos el archivo `/boot/dietpi/.dietpi-banner`\npodremos configurar los colores.\n\n```sh\n# vim /boot/dietpi/.dietpi-banner\n```\nModificando el Color 0 que es de las líneas por un hermoso magenta elixir:\n\n```sh\naCOLOUR[0]='\\e[35m'\n```\n\nAhora también podremos editar el mensaje que aparece al inicio\nmodificando el archivo `/etc/motd` y eliminando el mensaje sobre Debian que aparece.\n\n### Avahi\n\nhttps://en.wikipedia.org/wiki/Avahi_(software)[Avahi] nos permite conectarnos a través del servicio Bonjour. \nSi tienes un dispositivo con MacOS podrás ingresar simplemente usando `raspberrypi.local` en ves de la ip\ndel dispositivo.\n\nhttps://www.howtogeek.com/167190/how-and-why-to-assign-the-.local-domain-to-your-raspberry-pi/[Para configurar este dominio especial] \ndebemos ejecutar:\n\n```sh\n# apt-get install avahi-daemon\n```\n\nTambién si se desea cambiar `raspberrypi` por otra cosa, se debe cambiar `/etc/hostname`\nen este caso lo llamamos `elixir`. Puedes reiniciar el dispositivo después de configurar esto.\n\nimage:https://user-images.githubusercontent.com/292738/185757092-29523ce0-c819-4ad5-a7d1-6351f295b35c.png[Elixir Pi SSH]\n\n\n#### Hostname\n\nSi se cambia el hostname, se debe asegurar de que esté dentro del https://www.lookip.net/ip/127.0.1.0[loopback] dentro del archivo\n`/etc/hosts`. Para evitar que salga el error https://www.globo.tech/learning-center/sudo-unable-to-resolve-host-explained/[sudo: unable to resolve host].\n\nVerificar que el contenido sea similar al siguiente:\n\n```text\n127.0.0.1 localhost\n127.0.1.1 elixir\n::1 localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n```\n\n### Compilador de C\n\nC es un lenguaje impresindible para la creación de herramientas y otras utilidades.\nPodemos instalar todas las dependencias necesarias con:\n\n```sh\n# apt -y install gcc g++ make automake\n```\n\n#### GPIO\n\nPara tener acceso a los puertos _GPIO_ se debe instalar algunas bibliotecas adicionales. Los puertos _GPIO_ son útiles por ejemplo, para usar un pequeño parlante para emitir sonidos desde los pines de _GPIO_. Se puede ver el https://github.com/NinjasCL/rpitune[Proyecto Raspberry PI RTTTL] para más detalles.\n\nHay algunos proyectos para interactuar desde C a los puertos _GPIO_:\n\n- https://github.com/joan2937/pigpio/\n- https://github.com/WiringPi/WiringPi\n- http://www.airspayce.com/mikem/bcm2835/\n\nSe debería añadir el usuario al grupo `gpio`.\n\n```sh\n$ sudo usermod -aG gpio elixir\n```\n\nSi se prefiere usar python se puede instalar las dependencias:\n\n```sh\n$ sudo apt install python3-rpi.gpio\n```\n\n### Creando Usuario Elixir\n\nPara tener un sistema más seguro es necesario evitar logins con los usuarios `root` o `dietpi`,\npara esto crearemos un nuevo usuario llamado `elixir` con https://dietpi.com/forum/t/change-default-root-users-for-security/5810[privilegios de super usuario].\n\n```sh\n# useradd -mk /etc/skel -s /bin/bash elixir\n# passwd elixir\n# usermod -aG sudo elixir\n```\n\nEvitamos logins con `dietpi`\n\n```sh\n# usermod -L dietpi\n```\n\nEs recomendable mantener la capacidad de hacer login con `root` \nsi tenemos acceso local, para cualquier eventualidad. Asi que solamente debemos desactivar el acceso de root por ssh.\n\nDe forma predeterminada el servidor de ssh de dietpi es https://dietpi.com/docs/software/ssh/#dropbear[Dropbear].\nSi usas https://www.ibm.com/docs/en/db2/11.1?topic=installation-enable-disable-remote-root-login[eliminamos el acceso a root por ssh[OpenSSH puedes ver ésta guía].\n\n\nAhora realizaremos toda la configuración restante utilizando el usuario `elixir`.\n\n```sh\n$ ssh elixir@elixir.local\n```\n\n### Instalar ZSH\n\nPrimero instalamos _zsh_ y la convertimos en la terminal predeterminada.\n\n```sh\n$ sudo apt install zsh\n$ chsh -s $(which zsh)\n```\n\nLuego instalamos https://ohmyz.sh/#install[Ohmyz.sh]\n\n```sh\n$ sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\"\n```\n\nAhora editamos `.zshrc` para añadir los https://github.com/MichaIng/DietPi/issues/180[comandos de Dietpi].\n\n```sh\nexport PATH=$HOME/bin:/usr/local/bin:/usr/bin:/boot/dietpi:/boot/dietpi/func:/bin:/usr/sbin:/sbin:$PATH\n\n# Añadir al final del archivo\n/boot/dietpi/dietpi-login\n```\n\n### Instalar Exa\n\nhttps://the.exa.website/[exa] es una mejora al comando `ls`, le agrega color y otras funcionalidades modernas.\n\n```sh\n# apt-get install exa\n```\n\nPara poder ejecutarlo podemos utilizar `exa -lag --header` y aplicar un `alias` para reemplazar ls.\n\nModificar `.bashrc` o `.zshrc` según corresponda para cada usuario en su `$HOME`.\n\n```sh\nalias ls='exa -lag --header --icons'\n```\n\nPara fish se deberían https://www.joshfinnie.com/blog/moving-from-oh-my-zsh-to-starship-and-fish-shell/[configurar las abreviaciones].\n\n### Instalar Starship\n\nEs un command prompt muy bueno y es compatible con _bash_, _zsh_ y _fish_.\npara instalarlo solo debemos seguir su https://starship.rs/guide/#%F0%9F%9A%80-installation[guía de instalación].\n\n```sh\n# curl -sS https://starship.rs/install.sh | sh\n```\n\n*bash*\n\nAñadir al final de `~/.bashrc`:\n\n```sh\neval \"$(starship init bash)\"\n```\n\n*zsh*\n\nAñadir al final de `~/.zshrc`:\n\n```sh\neval \"$(starship init zsh)\"\n```\n\n*fish*\n\nAñadir al final de `~/.config/fish/config.fish`:\n\n```fish\nstarship init fish | source\n```\n\n### Instalar asdf\n\nhttps://asdf-vm.com/guide/getting-started.html#_1-install-dependencies[asdf] es un gestor de versiones útil para instalar elixir\ny nodejs, entre otros.\n\n```sh\n$ sudo apt install curl\n$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2\n```\n\nAñadimos las configuraciones al final de `.zshrc`\n\n```sh\n# asdf\n. $HOME/.asdf/asdf.sh\nfpath=(${ASDF_DIR}/completions $fpath)\nautoload -Uz compinit \u0026\u0026 compinit\n```\n\n### Instalar Elixir\n\nLo primero que debemos hacer es https://www.coletiv.com/blog/how-to-correctly-install-erlang-and-elixir/[instalar las dependencias] para https://github.com/asdf-vm/asdf-erlang[Erlang] y https://github.com/asdf-vm/asdf-elixir[Elixir].\n\n```sh\n$ sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk\n```\n\nAgregamos Erlang:\n\n```sh\n$ asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git\n$ asdf list all erlang\n```\n\nBuscamos la versión que queremos y la instalamos.\nEn este caso sería la `25.0.4`\n\n```sh\n$ asdf install erlang 25.0.4\n```\n\nAgregamos Elixir:\n\n```sh\n$ asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git\n$ asdf list all elixir\n```\n\nBuscamos la versión y la instalamos.\nEn este caso sería la `1.13.4-otp-25`\n\nTenemos que tener la otp correspondiente a la versión de erlang que instalamos.\n\n```sh\n$ asdf install elixir 1.13.4-otp-25\n```\n\nAhora definimos la versión global\n\n```sh\n$ asdf global erlang 25.0.4\n$ asdf global elixir 1.13.4-otp-25\n```\n\nAhora si ejecutamos `elixir -v` \nnos debería arrojar algo similar a:\n\n```text\nErlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]\n\nElixir 1.13.4 (compiled with Erlang/OTP 25)\n```\n\n### Instalar Phoenix\n\nPhoenix es el framework de desarrollo web por excelencia de Elixir. \nPara instalarlo podemos https://hexdocs.pm/phoenix/installation.html[seguir su guía].\n\n```sh\n$ sudo apt-get install inotify-tools\n$ mix local.hex\n$ mix local.rebar --force\n$ mix archive.install hex phx_new\n```\n\n#### Instalar PostgreSQL\n\nhttps://linuxhint.com/install-postgresql-debian/[_PostgreSQL_ es la base de datos] recomendada para proyectos con Phoenix.\nEn este caso se ha instalado la versión *13*.\n\n```sh\n$ sudo apt install postgresql postgresql-contrib\n```\n\nLe añadimos la contraseña `postgres` al usuario `postgres`:\n\n```sh\n$ sudo passwd postgres\n$ sudo -u postgres psql -c \"ALTER USER postgres PASSWORD 'postgres';\"\n$ sudo /etc/init.d/postgresql restart\n```\n\nPara saber el estado del servidor de _PostgreSQL_:\n\n```sh\n$ sudo systemctl status postgresql\n```\n\nPara iniciar el servidor o detener de _PostgreSQL_:\n\n```sh\n$ sudo systemctl start postgresql\n$ sudo systemctl stop postgresql\n$ sudo /etc/init.d/postgresql restart\n```\n\nPara más https://wiki.debian.org/PostgreSql[opciones de configuración] se puede ver la https://www.postgresql.org/docs/13/[documentación]:\n\n- Archivos de configuración: `/etc/postgresql/[version]/[cluster]/`\n- Binarios: `/usr/lib/postgresql/[version]`\n- Archivos de datos: `/var/lib/postgresql/[version]/[cluster]`\n\n#### Instalar NodeJS\n\nhttps://nodejs.org/en/[NodeJS] es utilizado para compilar los assets de Phoenix. Por lo que https://blog.logrocket.com/manage-node-js-versions-using-asdf/[necesitamos instalarlo] también\nutilizando `asdf`. Usaremos tanto la version `lts` como `latest`.\n\n```sh\n$ sudo apt -y install gnupg\n$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\n$ asdf list all nodejs\n$ asdf install nodejs lts\n$ asdf install nodejs latest\n$ asdf global nodejs latest\n```\n\nVerificamos que funcione con:\n\n```sh\n$ node -v\nv18.7.0\n```\n\n#### Proyecto de Prueba\n\nPara probar que esta correctamente ejecutándose crearemos un https://hexdocs.pm/phoenix/up_and_running.html[nuevo proyecto de Phoenix].\n\n```sh\n$ mix phx.new prueba\n$ cd prueba\n$ mix ecto.create\n```\n\nVeríamos un mensaje similar a:\n\n```text\nThe database for Prueba.Repo has been created\n```\n\nAhora ejecutamos los assets\n\n```sh\n$ mix assets.deploy\n```\n\nY mostraría un mensaje como:\n\n```text\nCheck your digested files at \"priv/static\"\n```\n\nAhora debemos modificar el archivo `config/dev.exs` para permitir\nacceso a otras ips usando `[ip: {0, 0, 0, 0}, port: 4000]`.\n\n```elixir\nconfig :prueba, PruebaWeb.Endpoint,\n  # Binding to loopback ipv4 address prevents access from other machines.\n  # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.\n  http: [ip: {0, 0, 0, 0}, port: 4000],\n```\n\nFinalmente podemos probar ejecutar el servidor con:\n\n```sh\nmix phx.server\n```\n\nAhora podremos ver el resultado dentro del navegador.\n\nimage:https://user-images.githubusercontent.com/292738/185839024-44d267a7-d984-4b80-9dc9-9070af306c71.png[]\n\n### Instalar Rust\n\n_Rust_ es un lenguaje de programación de bajo nivel muy popular\ny muchas herramientas están escritas con este lenguaje.\nAdemás es un gran amigo de _Elixir_ para crear bibliotecas\nque requieran acceso de bajo nivel.\n\nComo solamente lo necesitaremos para compilar algunas herramientas, \npodemos usar `asdf`. Pero si se requiere algo más personalizado\nse puede usar https://rustup.rs/.\n\n```sh\n$ asdf plugin add rust https://github.com/asdf-community/asdf-rust.git\n$ asdf install rust 1.63.0\n$ asdf global rust 1.63.0\n```\n\nVerificamos que esté instalado:\n\n```sh\n$ cargo --version\ncargo 1.63.0 (fd9c4297c 2022-07-01)\n\n$ rustc --version\nrustc 1.63.0 (4b91a6ea7 2022-08-08)\n```\n\nAhora incluimos los binarios al `$PATH`\n\n```sh\n$ vim ~./zshrc\n```\n\nEn la última línea:\n\n```sh\nexport PATH=/home/elixir/.cargo/bin:$PATH\n```\n\nRecargamos el archivo \n```sh\n$ source ~/.zshrc\n```\n\n### Instalar ZelliJ\n\nhttps://github.com/zellij-org/zellij[ZelliJ] es un multiplexor de terminal, similar a https://github.com/tmux/tmux/wiki[Tmux]. Pero\nescrito en _Rust_. Nos da la posibilidad de separar la terminal\nen múltiples pestañas, para mayor comodidad.\n\n```sh\n$ cargo install --locked zellij\n```\n\nUna vez compilado, configuramos:\n\n```sh\n$ mkdir ~/.config/zellij\n$ zellij setup --dump-config \u003e ~/.config/zellij/config.yaml\n```\n\nPodemos configurar varias opciones, \npero solamente seleccionaremos un https://zellij.dev/documentation/theme-gallery.html#tokyo-night[tema]: \n\n```yaml\n# Choose the theme that is specified in the themes section.\n# For some examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes\n# Default: default\ntheme: tokyo-night\n```\n\nLo guardamos en\n```sh\n$ mkdir ~/.config/zellij/themes\n$ vim ~/.config/zellij/themes/tokyo-night.yaml\n```\n\n```yaml\n# TokyoNight Theme\n# https://github.com/zellij-org/zellij/blob/main/example/themes/tokyo-night.yaml\n# Originally by https://github.com/enkia/tokyo-night-vscode-theme\n\nthemes:\n  tokyo-night:\n    fg: [169,177,214] #A9B1D6\n    bg: [26,27,38] #1A1B26\n    black: [56,62,90] #383E5A\n    red: [249,51,87] #F9334D\n    green: [158,206,106]  #9ECE6A\n    yellow: [224,175,104] #E0AF68\n    blue: [122,162,247]  #7AA2F7\n    magenta: [187,154,247] #BB9AF7\n    cyan: [42,195,222] #2AC3DE\n    white: [192,202,245] #C0CAF5\n    orange: [255,158,100] #FF9E64\n```\n\n### Instalar GitUI\n\nhttps://github.com/extrawurst/gitui[GitUI] es una aplicación\nde terminal que permite manejar más simplemente los repositorios git.\n\nPara instalarla simplemente usamos el comando:\n\n```sh\n$ cargo install gitui\n```\n\nTambién podemos configurar sus colores creando un archivo llamado\n`~/.config/gitui/theme.ron`\n\n### Actualizar Neovim\n\nEl problema de _Neovim_ que instalamos previamente es que\nutiliza una versión antigüa de _Neovim_ (0.4), la cual\nno funciona bien con algunos plugins de elixir que usaremos.\nNecesitamos una versión *0.5* o superior.\n\nCompilaremos la última versión de _Neovim_ desde la rama _master_.\nEs necesario debido a que las versiones stable y nightly están \nprecompiladas y no son compatibles con la Raspberry Pi.\n\nPrimero https://gist.github.com/darcyparker/153124662b05c679c417[instalamos las dependencias].\n\n```sh\n$ sudo apt-get install -y \\\n  autoconf \\\n  automake \\\n  cmake \\\n  g++ \\\n  gettext \\\n  libncurses5-dev \\\n  libtool \\\n  libtool-bin \\\n  libunibilium-dev \\\n  libunibilium4 \\\n  ninja-build \\\n  pkg-config \\\n  python3-pip \\\n  software-properties-common \\\n  unzip\n```\n\nSegundo habilitamos los plugins de python para neovim\n\n```sh\n$ pip3 install setuptools \u0026\u0026 pip3 install --upgrade pynvim\n```\n\nTercero agregamos el plugin de neovim para _asdf_.\n\n```sh\n$ asdf plugin add neovim\n$ asdf install neovim ref:master\n```\n\nUna vez compilado verificamos que este disponible el binario\n\n```sh\n$ asdf which nvim\n/home/elixir/.asdf/installs/neovim/ref-master/bin/nvim\n\n$ nvim --version\nNVIM v0.8.0-dev-109-g7e7a1fa\nBuild type: RelWithDebInfo\n```\n\nFinalmente crearemos un alias para usarlo y actualizarlo \nmás facilmente.\n\nEditamos el archivo `~/.zshrc`.\n\n```sh\n$ nvim ~/.zshrc\n```\n\nAñadimos al final.\n\n```text\nalias vim=nvim\nalias update-nvim-master='asdf uninstall neovim ref:master \u0026\u0026 asdf install neovim ref:master'\nexport EDITOR=nvim\n```\n\nY actualizamos\n\n```sh\n$ source ~/.zshrc\n```\n\n### Instalar Docker\n\nhttps://www.docker.com/[Docker] es la herramienta principal\npara trabajar con contenedores y _Dev Containers_. \n\nPara https://www.linuxtechi.com/install-docker-engine-on-debian/[poder instalarlo] vamos a realizar lo siguiente:\n\n\nInstalamos las dependencias de Docker:\n\n```sh\n$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y\n```\n\nIncluimos las llaves GPG de Docker:\n\n```sh\n$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg\n```\n\nAñadimos los repositorios de Docker:\n\n```sh\necho \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \\\n  $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\n```\n\nInstalamos Docker:\n\n```sh\n$ sudo apt update \u0026\u0026 sudo apt -y install docker-ce docker-ce-cli containerd.io\n```\n\nVerificamos que este instalado y ejecutándose:\n\n```sh\n$ sudo docker version \u0026\u0026 sudo systemctl status docker\n```\n\nSi por alguna razón no está ejecutándose, se puede usar:\n\n```sh\n$ sudo systemctl start docker\n```\n\nAgregamos al usuario `elixir` al grupo `docker`, para no necesitar sudo:\n\n```sh\n$ sudo usermod -aG docker elixir\n```\n\nReiniciamos la sesión (log off y luego log in) para que se\nimplementen los permisos.\n\nVerificamos que todo esté en orden con:\n\n```sh\n$ docker run hello-world\n```\n\nimage:https://user-images.githubusercontent.com/292738/186752519-3c412796-2c44-4381-9660-22c6ed2bae09.png[Docker Hello World]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felixircl%2Fmachine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felixircl%2Fmachine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felixircl%2Fmachine/lists"}