diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..7179949 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,5 @@ +{ + "MD024": false, + "MD013": false, + "MD033": false +} \ No newline at end of file diff --git a/Bitcoin Explicacion.es.md b/Bitcoin Explicacion.es.md new file mode 100644 index 0000000..0c4eda4 --- /dev/null +++ b/Bitcoin Explicacion.es.md @@ -0,0 +1,50 @@ +# Bitcoin + +## Como funcionan los fees + +Cada ~10m (varia mucho, muchas veces hasta se tarda mas de 30m) se genera un bloque que como máximo puede pesar hasta 1Mb de informacion. + +La transaccion mas común y simple es de 2 entradas y 2 salidas, y esa pesa mas de 100 bytes, eso quiere decir que en un bloque caben menos de 10.000 transacciones. + +Lo mineros son los encargados de decidir cuales transacciones entran o no en un bloque, y por lo general, ellos le dan prioridad a las que tengan mejor fee (la que tenga la mayor densidad de BTC, osea la mayor **BTC/vbyte**) + +En esta pagina puedes ver estimaciones de los fees actuales. Ahorita están absurdamente bajos, osea una transaccion normal te puede estar costando menos de 300 satoshis(0.02# Bitcoin5$) menos de 2,5 centavos de dolar. Con una wallet en la que tu tengas el control, tú decides cuantos fees vas a pagar. Si no pagas comision, corres el riesgo de que ni uno de los mineros meta tu transaccion en la blockchain y nunca se confirme. En la práctica los fees dependen principalmente de 2 cosas: + +- Congestión de la red, cuantas transacciones tienes haciendote competencia en el valor del fee (BTC/vbyte) +- Cuanto estás dispuesto a esperar + +Fijate en la página, cada fila es un rango de fee/byte medido en **satoshis/byte**, el tamaño de la barra indica cuantas transacciones hay/habido en ese rango, y a la derecha, al final, hay una estimacion de minutos de espera (En la práctica varía) + +El peso de una transaccion no solo depende de la cantidad de entradas y salidas, tambien depende del tipo de direcciones de las salidas (y quizas tambien de las entradas, not sure). Y existen 3 tipos de direcciones: + +- 1... (clásica) +- 3... (Segwit envuelto en un script, para hacerlo compatible con la clásica) +- bc1... (Segwit nativo) + +El primero es el mas ineficiente (el que pesa mas en una transaccion), y el último es el mas eficiente. +Ya todos los servicios se han adaptado al mas eficiente, asi que asegurate de que la wallet que uses tenga direcciones que empiecen por **bc1...** + +## Wallets centralizadas vs descentralizadas + +Las wallet descentralizadas modernas al momento de creacion generan un número aleatorio, que es básicamente el alma de tu wallet, de hecho, ese número **es** tu wallet, y quien lo tenga puede gastar tus BTC. Ese número te lo muestran en el formato **seed/semilla**, que es una lista de 12-24 palabras, es simplemente una forma mas presentable de mostrar el numero, ya que es mas facil de memorizar, y de transcribir. +Y muchas wallet van un paso mas allá e implementan el estandar **BIP39**, para encriptar esa **seed** con un **password** que tú escojas, y en estos casos para recuperar tu wallet vas a necesitar tanto la seed, como el password. Esta opcion es la que uso yo, porque entonces yo guardo tranquilamente mi **seed** en todos lados, sin preocuparme si alguien la llega a obtener, y solo me preocupo de guardar bien la clave, que es mas corta y aún mas fácil de memorizar y de guardar. (Es importante escoger una buena clave, mas q todo q sea larga, o te le pueden hacer bruteforce) + +La necesidad de guardar bien esa clave es la desventaja que tienen las wallet descentralizadas vs las centralizadas/custodeadas, es muy facil cagarla, desde dejar muy a la vista la clave secreta a guardarla tan bien que se te pierde. O tambien si tienes muchos ahorros, tambien tienes que pensar en tener backups que tu familia pueda recuperar si te llega a pasar algo. + +## lightning + +Está construido encima de Bitcoin. Y está basado en una especie de contrato entre 2 partes, y cada parte puede decidir meter X cantidad de BTC para usarlos dentro de ese canal, y mientras ese canal está abierto ambas partes pueden tranzar sin comision alguna, porque no son transacciones que se guardan en la blockchain, son transacciones totalmente privadas. +Y aquí es donde entra lightning como tal, porque bajo ciertas condiciones, se pueden conectar los canales entre sí para así poder transferirle a entidades con las que no tengas canales abierto directamente. + +Ventajas: + +- Transacciones son casi instantáneas. +- Fees son aún mas bajos. Gratis si con quien abriste el canal de lightning es el mismo a quien le vas a pagar. + +Desventajas: + +- No es suficiente con guardar la **seed** y **password**, tu aplicacion tambien necesita guardar cada cambio que se haga en tus canales abiertos. (La única aplicacion que probé creo que tenia para configurar Google Drive para guardar todos esos cambios). +- Tu aplicacion tiene que estar pendiente de la red cada cierto tiempo (dependiendo de cuando tiempo se le configuró al canal, por lo general varios días) +- Capacidad limitada de cantidad de Bitcoins que puedes enviar, depende de la capacidad de los canales de la ruta que atraviesa la transacción. + +Lightning sigue en desarrollo activo, y algunas de las desventajas son mejorables sacrificando decentralizacion, como hace Phoenix Wallet, que me parece un muy buen tradeoff para noobs. diff --git a/DB_MYSQL_TRANSACTIONS.es.md b/DB_MYSQL_TRANSACTIONS.es.md new file mode 100644 index 0000000..6f45a0c --- /dev/null +++ b/DB_MYSQL_TRANSACTIONS.es.md @@ -0,0 +1,86 @@ +[//]: # "Ctrl+K,V o Ctrl+Shift+V - Para ver vista previa en VSCode" + +# Comandos principales + +- `START TRANSACTION` se utiliza para abrir una transacción (desactiva temporalmente el modo `autocommit`). +- `COMMIT` se utiliza para que los cambios que están pendientes de la transacción actual, se vuelvan permanentes en la BD y cierra la transacción. +- `ROLLBACK` para deshechar cualquier cambio pendiente que se haya hecho en la transacción actual y cierra la transacción. + +MYSQL por defecto funciona con el modo `autocommit` activado, eso quiere decir que cualquier consulta es una transacción implicitamente, osea, si hacen un `UPDATE ...` en el fondo InnoDB ejecuta algo parecido a esto: + +```sql +START TRANSACTION; + UPDATE ... +COMMIT; +``` + +Si ese `UPDATE ...` falla estando el modo `autocommit` activado, entonces automáticamente se ejecuta un `ROLLBACK` + +# Usos + +## Ejecutar todo o nada + +Supongamos que queremos ejecutar una serie de consultas que modifican la BD, pero queremos que se ejecuten todas, y que si cualquiera falla que se deshagan los cambios. + +Podemos hacer algo así: + +```sql +BEGIN + + START TRANSACTION; + .. Consulta 1 .. + .. Consulta 2 .. # Esta consulta siempre falla + .. Consulta 3 .. + COMMIT; + +END +``` + +Al ejecutar ese procedimiento almacenado, se abre una transacción, se ejecuta la **Consulta 1**, y al intentar la **Consulta 2** falla. + +Hay un problema aquí, la transacción no se deshace, sino que queda abierta, osea, tiene cambios hechos de la **Consulta 1**, pero no se han hecho permanentes en la BD (`COMMIT`), ni tampoco se han devuelto los cambios (`ROLLBACK`). Y puede ocurrir cualquiera de los dos escenarios. Por ejemplo si se cierra la conexión, la BD ejecuta un `ROLLBACK` y si se ejecuta cualquiera de estas consultas se genera un `COMMIT` implicitamente. + +Si en este estado de la BD se hace un `SELECT` para verificar si en la BD se hicieron los cambios de la **Consulta 1**, se va a obtener distintas respuestas dependiendo de si el `SELECT` se ejecuta desde la misma conexión/sesión o no. + +Cuando se abre una transacción y se hace un cambio, ese cambio solamente es visible para esa misma sesión que abrió la transacción. + +### Solución + +Explicitamente hacer `ROLLBACK` cuando ocurra un error. + +Para eso definimos un *HANDLER* para los errores, es como el equivalente a un `try ... catch` pero afecta a todo el procedimeinto almacenado + +```sql +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + .. Consulta 1 .. + .. Consulta 2 .. # Esta consulta siempre falla + .. Consulta 3 .. + COMMIT; + +END +``` + +Ahora cuando la **Consulta 2** falle, se dispara el handler, y se ejecutan los comandos `ROLLBACK` y `RESIGNAL`. *RESIGNAL* sirve para que se vuelva a lanzar el error, ya que de lo contrario el procedimiento almacenado termina *"exitosamente"* a pesar de que hubo un error. + +## Bloquear tablas + +Luego de abrir una transaccion con `START TRANSACTION` las consultas como el `INSERT`, `UPDATE` o `DELETE` bloquean las tablas, registros o índices que afecten, hasta que dicha transacción se cierre ya sea con un `COMMIT` o un `ROLLBACK`. + +Esto sirve para que cualquier otra consulta que quiera leer o modificar los elementos bloqueados, deban esperar hasta que la transacción que los bloquea se cierre y los libere. + +Los `SELECT` normales no generan ningun bloqueo, para eso existen el `SELECT ... FOR SHARE` y el `SELECT ... FOR UPDATE`. + +En términos simples el **FOR SHARE** bloquea los elementos seleccionados para que otra consulta no pueda escribir sobre ellos hasta que se cierre la transacción, y el **FOR UPDATE** adicionalmente impide que tampoco puedan leerlos (igual que los `INSERT`, `UPDATE` o `DELETE`). Mas información + +### Recomendaciones + +Hay que analizar detalladamente todo lo que se mete dentro de una transacción, y reducirlo a lo mas mínimo posible, para evitar [Deadlocks](https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html) o retrasos debido a bloqueos innecesarios. + +Usar índices en todos los `WHERE` de las consultas que bloquean, para que dichos bloqueos sean lo mas óptimos posibles, y se bloquee solo lo que hace falta bloquear. diff --git a/Ssh server as a Tor onion service.es.md b/Ssh server as a Tor onion service.es.md new file mode 100644 index 0000000..d1fb14f --- /dev/null +++ b/Ssh server as a Tor onion service.es.md @@ -0,0 +1,65 @@ +# Configurar a un servicio onion + +*copiado sin verguenza alguna de * + +--- + +## Instalar Tor + +Instalar Tor en el cliente y en el servidor: + + sudo apt-get install tor -y + +## Configurar Tor + +1. En el servidor vamos a editar el archivo de configuración de tor `/etc/tor/torrc`: + + sudo nano /etc/tor/torrc + +2. Al final del archivo vamos a agregar esto: + + HiddenServiceDir /var/lib/tor/ssh/ + HiddenServicePort 22 + + Ctrl+x para guardar y cerrar el archivo. + +3. Reiniciar Tor: + + sudo systemctl restart tor + +## Obtener la direccion .onion + +Estará en el archivo `hostname` en la carpeta configurada anteriormente `/var/lib/tor/ssh/` + + sudo cat /var/lib/tor/ssh/hostname + +Deberia arrojarte algo así: `riludi2kstjwmlzn.onion` + +## Conectarse al servidor ssh con la direccion .onion + + torify ssh ... # reemplazar el dominio/ip por la direccion .onion` + +Por ejemplo: + + torify ssh jack@riludi2kstjwmlzn.onion + +### Opcional + +Para no tener que recordar la direccion **.onion** puedes configurar los parámetros de conexión en el archivo `~/.ssh/config` + + nano ~/.ssh/config + +Ingresar configuracion: + + Host serverTor + User jack + HostName riludi2kstjwmlzn.onion + Port 22 + +Ahora puedes conectarte así: + + torify ssh serverTor + +## Mas informacion + + diff --git a/Ssh server as a Tor onion service.md b/Ssh server as a Tor onion service.md new file mode 100644 index 0000000..2e3d2ac --- /dev/null +++ b/Ssh server as a Tor onion service.md @@ -0,0 +1,65 @@ +# Configure an onion service + +*Shamelessly copied from * + +--- + +## Install Tor + +Install Tor on both client and server: + + sudo apt-get install tor -y + +## Configure Tor + +1. In the server let's edit tor's config file `/etc/tor/torrc`: + + sudo nano /etc/tor/torrc + +2. At the bottom of that file, add this: + + HiddenServiceDir /var/lib/tor/ssh/ + HiddenServicePort 22 + + Ctrl+x to save and close file. + +3. Restart Tor: + + sudo systemctl restart tor + +## Get .onion address + +It will be in the file `hostname` in the previously configured folder `/var/lib/tor/ssh` + + sudo cat /var/lib/tor/ssh/hostname + +You should get something like `riludi2kstjwmlzn.onion` + +## Connect to the Tor hidden ssh server + + torify ssh ... # replace the domain/ip with the .onion address + +For example: + + torify ssh jack@riludi2kstjwmlzn.onion + +### Optional + +You don't need to remember the **.onion** address, you can write an entry to your user's ssh config file `~/.ssh/config`: + + nano ~/.ssh/config + +Set configuration: + + Host serverTor + User jack + HostName riludi2kstjwmlzn.onion + Port 22 + +Now you can simply connect with: + + torify ssh serverTor + +## More info + + diff --git a/bash-zsh_TerminalShorcuts.md b/bash-zsh_TerminalShorcuts.md new file mode 100644 index 0000000..f017b42 --- /dev/null +++ b/bash-zsh_TerminalShorcuts.md @@ -0,0 +1,113 @@ +# Terminal Shortcuts + +## Default shortcuts + +For Ubuntu's default keybinding settings (i.e Emacs keybindings) + +### Insert previous arguments + +- Alt+.: insert last argument from last command. +- Alt+number+.: insert #nth last argument from last command. +- Alt+- , number , Alt+., **zsh:** Alt+-+number+.: insert #nth first argument from last command. + +In Linux you can repeat commands to go back in history + +#### Example + +Last command is: + + mv foo bar + +- Alt+0+.: insert first argument of last command = `mv` +- Alt+2+.: insert last 2nd argument of last command = `foo` +- up , Ctrl+w: last command without the last word = `mv foo` + +### Cut/Paste commands + +(relative to cursor's position) + +- Ctrl+w: cuts last word +- Alt+d: cuts next word +- Ctrl+k: cuts everything after +- Ctrl+u, **zsh:** Alt+w: cuts everything before +- **zsh:** Ctrl+u: cuts the entire command *(In bash you can combine Ctrl+u , Ctrl+k)* +- Ctrl+y: paste characters previously cut with any **Cut command**. *In bash you can chain **cut commands**, and Ctrl+y will paste them all.* + +### Move cursor + +- Ctrl+left: move to last word +- Ctrl+right: move to next word +- home or Ctrl+a: move to start of command +- end or Ctrl+e: move to end of command + +### Other + +- Ctrl+_: undo last edit *(very useful when exceeding Ctrl+w)* + +### To see all shortcuts available + +- **bash:** `bind -lp` +- **zsh:** `bindkey -L` + +## Custom shortcuts + +### Iterate through arguments + +only works in zsh, and probably only Linux + +#### Description + +Insert any argument of a previous command by iterating one by one until selection + +#### Setup Instructions + +run this: + + autoload -Uz copy-earlier-word + zle -N copy-earlier-word + bindkey "^[:" copy-earlier-word + +*(to make this permanent, add it to your `~/.zshrc` and restart shell)* + +Now use Alt+. to go as back as you want, then use Alt+: to iterate through the arguments + +#### Example + +Last command is + + echo 1 2 3 4 5 + +- Alt+.: `5` +- Alt+.+:: `4` +- Alt+.+:+:: `3` +- Alt+.+:+:+:: `2` +- Alt+.+:+:+:+:: `1` +- Alt+.+:+:+:+:+:: `echo` + +source: + +## Other examples + +### Common usecases + +Let's consider the last command to be: + + mv foo bar + +up , Ctrl+w: last command without the last word = `mv foo` + +Alt+0+.: first argument of last command = `mv` + +## Limitations + + "words" only includes `a-zA-Z` characters, so any symbol character will stop word-shortcuts. + +So if last argument was a url and you want to erase it with Ctrl+w it will be a pain. + +E.g: `curl -I --header "Connection: Keep-Alive" https://stackoverflow.com/questions/38176514/re-run-previous-command-with-different-arguments` + +To erase that **url** using Ctrl+w, you'd have to repeat it 12 times. + +--- + +It would be great to have similar shortcuts that only stops at the **space character** diff --git a/install youtube-dl in android.md b/install youtube-dl in android.md new file mode 100644 index 0000000..17aa849 --- /dev/null +++ b/install youtube-dl in android.md @@ -0,0 +1,159 @@ +[//]: # "Ctrl+K,V o Ctrl+Shift+V - Para ver vista previa en VSCode" + +# Tutorial to install [youtube-dl](https://github.com/ytdl-org/youtube-dl/) in android + +Based on + +## Usage + +Click **Share**, select **Termux**, choose video or audio, and that's it!, it will be saved to `Downloads/{Provider}/` e.g `Downloads/Youtube/` + +## Install Termux + + + +## Open Termux and run one of these + + +1. [Youtube-dl + sharing + dialog **(Recommended)**](#youtube-dl--sharing--dialog-recommended) +2. [Youtube-dl + sharing](#youtube-dl--sharing) +3. [Youtube-dl](#youtube-dl) +4. [Termux extras](#termux-extras) +5. [All-In-One](#all-in-one) + +### Youtube-dl + sharing + dialog **(Recommended)** + +```bash + # Ask for storage permission + termux-setup-storage && + # Install youtube-dl + apt update && apt upgrade -y && apt install -y python ffmpeg dialog && pip install youtube-dl && + # Configure to download videos in `Download/{URL's provider (e.g. Youtube)}/{filename}` + mkdir -p ~/.config/youtube-dl && + echo "# Default Output Directory and Pattern + -o /data/data/com.termux/files/home/storage/downloads/%(extractor_key)s/%(title).150s-%(id)s.%(ext)s" > ~/.config/youtube-dl/config && + # Configure to open shared URLs with `youtube-dl {url}` + mkdir -p ~/bin && + echo '#!/bin/bash + URL=$1 + HEIGHT=15 + WIDTH=40 + CHOICE_HEIGHT=4 + + CHOICE=$(dialog \ + --menu "What would you like to download?" \ + $HEIGHT $WIDTH $CHOICE_HEIGHT \ + Video "" \ + Audio "" \ + 2>&1 >/dev/tty) + + case $CHOICE in + Video) + echo "Downloading video from $URL" + youtube-dl $URL + ;; + Audio) + echo "Downloading audio from $URL" + youtube-dl -x $URL + ;; + esac' > ~/bin/termux-url-opener && + chmod +x ~/bin/termux-url-opener +``` + +- Paste the script above 🖢 in the Termux console and press Enter +- A prompt to enable storage will appear, press y then Enter +- That's all!, just wait for it to finish upgrading/installing + +#### Usage + +Share an URL to termux, a dialog will ask you to choose if download **video** or just **audio** + +### Youtube-dl + sharing + +#### Usage + +Share URL to termux, this will automatically download the video. + +But if you always want to download just audio, replace `youtube-dl $url` with `youtube-dl -x $url` in the script below 🖣 + +```bash + # Ask for storage permission + termux-setup-storage && + # Install youtube-dl + apt update && apt upgrade -y && apt install -y python ffmpeg && pip install youtube-dl && + # Configure to download videos in `Download/{URL's provider (e.g. Youtube)}/{filename}` + mkdir -p ~/.config/youtube-dl && + echo "# Default Output Directory and Pattern + -o /data/data/com.termux/files/home/storage/downloads/%(extractor_key)s/%(title).150s-%(id)s.%(ext)s" > ~/.config/youtube-dl/config && + # Configure to open shared URLs with `youtube-dl {url}` + mkdir -p ~/bin && + echo "#!/bin/bash + url=$1 + youtube-dl $url" > ~/bin/termux-url-opener && + chmod +x ~/bin/termux-url-opener +``` + +### Youtube-dl + +This will only install youtube-dl in termux, sharing a URL to Termux will not work, you'll need to run the command manually from the terminal, e.g `youtube-dl https://youtu.be/blahblahblah` + +```bash + # Ask for storage permission + termux-setup-storage && + # Install youtube-dl + apt update && apt upgrade -y && apt install -y python ffmpeg && pip install youtube-dl +``` + +### Termux extras + +```bash + # Add special keys to keyboard + # source: https://wiki.termux.com/wiki/Touch_Keyboard#Extra_Keys_Row(s) + mkdir -p ~/.termux + echo "extra-keys = [ \ + ['ESC', '/', '|', 'HOME', 'UP', 'END', 'PGUP', '-'], \ + ['TAB','CTRL', 'ALT', 'LEFT', 'DOWN', 'RIGHT', 'PGDN', '~'] \ + ]" > ~/.termux/termux.properties + # Install nano + apt install -y nano +``` + +### All-In-One + +Youtube-dl + sharing + dialog + Termux extras + +```bash + termux-setup-storage && + apt update && apt upgrade -y && apt install -y nano python ffmpeg dialog && pip install youtube-dl && + mkdir -p ~/.config/youtube-dl && + echo "# Default Output Directory and Pattern + -o /data/data/com.termux/files/home/storage/downloads/%(extractor_key)s/%(title).150s-%(id)s.%(ext)s" > ~/.config/youtube-dl/config && + mkdir -p ~/bin && + echo '#!/bin/bash + URL=$1 + HEIGHT=15 + WIDTH=40 + CHOICE_HEIGHT=4 + + CHOICE=$(dialog \ + --menu "Que desea descargar?" \ + $HEIGHT $WIDTH $CHOICE_HEIGHT \ + Video "" \ + Audio "" \ + 2>&1 >/dev/tty) + + case $CHOICE in + Video) + youtube-dl $URL + ;; + Audio) + youtube-dl -x $URL + ;; + esac' > ~/bin/termux-url-opener && + chmod +x ~/bin/termux-url-opener && + mkdir -p ~/.termux && + echo "extra-keys = [ \ + ['ESC', '/', '|', 'HOME', 'UP', 'END', 'PGUP', '-'], \ + ['TAB','CTRL', 'ALT', 'LEFT', 'DOWN', 'RIGHT', 'PGDN', '~'] \ + ]" > ~/.termux/termux.properties +``` diff --git a/troubleshoot/ubuntu_network.md b/troubleshoot/ubuntu_network.md new file mode 100644 index 0000000..a84a980 --- /dev/null +++ b/troubleshoot/ubuntu_network.md @@ -0,0 +1,43 @@ +# NetworkManager + +- `nm-applet` to run old GUI and activate `Enable Networking`. + +- `nm-connection-editor` to edit any weird configuration in the connections. + +- You can also see what the **NetworkManager** is doing with these commands. +```bash +# Run one by one to see if anything is useful +nmcli device +nmcli +nmcli device show +``` + +`unmanaged` means **NetworkManager** will not manage that device. + +### Documentation: https://help.ubuntu.com/community/NetworkManager + +--- + +# Netplan + +```bash +# Create a config file +sudo nano /etc/netplan/ethernet.yaml +``` +and enter this +```bash +network: + version: 2 + renderer: networkd + ethernets: + eno1: + dhcp4: true +``` +replace `eno1` with whatever your device is (mine was `ens33`). +To see your list of devices, run `ip addr`. + +Finally apply the new configurations + + sudo netplan apply + +### Documentation: https://netplan.io/reference#examples diff --git a/ubuntu fresh install.md b/ubuntu fresh install.md new file mode 100644 index 0000000..ad1172a --- /dev/null +++ b/ubuntu fresh install.md @@ -0,0 +1,184 @@ +# Ubuntu fresh setup guide + +## Update & Upgrade + +```bash +sudo apt update && sudo apt upgrade -y +``` + +## Install Packages + +```bash +sudo apt-get install python3-pip zsh curl wget git dconf-editor +sudo apt-get install p7zip-full smplayer cmus speedtest-cli git-gui filezilla pavucontrol paprefs ufw servefile nmap fail2ban gimp most colordiff mosh ncdu qalculate-gtk jq tor fonts-noto nautilus-actions filemanager-actions thunderbird chrome-gnome-shell gnome-tweaks smartmontools & + +pip3 install youtube-dl tldr +``` + +## External Repositories + +### Antimicro + +```bash +sudo add-apt-repository ppa:mdeguzis/libregeek +``` + +As of today, a bionic package is still not available, but the artful works!. + +`sudo nano /etc/apt/sources.list.d/mdeguzis-ubuntu-libregeek-bionic.list` Replace `bionic` with `artful` + +```bash +sudo apt update +sudo apt install antimicro +``` + +Put config file in `~/.config/antimicro` + +### SinkSwitcher + + + +## Web installs + +- docker: +- VSCode: +- chrome: +- syncthing: +- Zsh-syntax-highlighting: + +## Shells + +### Fish + +#### Functions + +- nvm + + Install bass, then configure these functions + + - **__nvm_load.fish** + + ```fish + function __nvm_load + functions -e __nvm_load node npm npx + bass source ~/.nvm/nvm.sh --no-use ';' nvm use 2> /dev/null '||' nvm use default + end + ``` + + - **nvm.fish** + + ```fish + function nvm + functions -e __nvm_load node npm npx + bass source ~/.nvm/nvm.sh --no-use ';' source ~/.nvm/bash_completion ';' nvm $argv + end + ``` + + - **npx.fish** + + ```fish + function npx + __nvm_load + npx $argv + end + ``` + + - **npm.fish** + + ```fish + function npm + __nvm_load + npm $argv + end + ``` + + - **node.fish** + + ```fish + function node + __nvm_load + node $argv + end + ``` + +### Zsh - Edit ~/.zshrc + +#### Add `~/.local/bin` to PATH + +```bash +export PATH=$HOME/.local/bin:$PATH +``` + +#### Add shortcut "Alt+:" [to iterate through arguments](https://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command/55069846#55069846) + +```bash +autoload -Uz copy-earlier-word +zle -N copy-earlier-word +bindkey "^[:" copy-earlier-word +``` + +#### Aliases + +```bash +alias lr="ls -hartl" +alias youtube-dl720='youtube-dl -f "bestvideo[height<=720]+bestaudio/best[height<=720]"' +alias python=python3 +alias ipython=ipython3 +function mkcd () { mkdir -p "$@" && cd "$@"; } +``` + +#### Lazy-load nvm + +```bash +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . $NVM_DIR/nvm.sh --no-use; +[ -s "$NVM_DIR/bash_completion" ] && . $NVM_DIR/bash_completion; +function __nvm_load_node () { + unalias node npm npx; + nvm use 2> /dev/null || nvm use default; + command=$1; + shift 1; + $command $@; +} +alias node='__nvm_load_node node $@' +alias npm='__nvm_load_node npm $@' +alias npx='__nvm_load_node npx $@' +``` + +#### Enable most + +```bash +export PAGER=most +``` + +#### Enable zsh plugins + +```bash +plugins=(git zsh-syntax-highlighting zsh-autosuggestions) +``` + +**Note:** Probably need to install them first + +## Gnome extensions + +- Caffeine +- NetSpeed +- EasyScreenCast + +## Dconf + +### Built-in dash-to-dock extension + +- `org.gnome.shell.extensions.dash-to-dock.click-action` = **`cycle-windows`** +- `org.gnome.shell.extensions.dash-to-dock.scroll-action` = **`cycle-windows`** +- `org.gnome.shell.extensions.dash-to-dock.show-windows-preview` = **`false`** + +## Custom shortcuts + +- `systemctl suspend` +- Cmus +- `qalculate` + +## StartUp + +- Cmus `gnome-terminal -- cmus`