Merge repository docs
into knowledge
This commit is contained in:
commit
3d987eab94
5
.markdownlint.json
Normal file
5
.markdownlint.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"MD024": false,
|
||||
"MD013": false,
|
||||
"MD033": false
|
||||
}
|
50
Bitcoin Explicacion.es.md
Normal file
50
Bitcoin Explicacion.es.md
Normal file
|
@ -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 <https://bitcoinfees.earn.com> 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.
|
86
DB_MYSQL_TRANSACTIONS.es.md
Normal file
86
DB_MYSQL_TRANSACTIONS.es.md
Normal file
|
@ -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 <https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html> 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 <https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html>
|
||||
|
||||
### 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.
|
65
Ssh server as a Tor onion service.es.md
Normal file
65
Ssh server as a Tor onion service.es.md
Normal file
|
@ -0,0 +1,65 @@
|
|||
# Configurar a un servicio onion
|
||||
|
||||
*copiado sin verguenza alguna de <https://www.techrepublic.com/article/how-to-run-an-ssh-connection-through-tor/>*
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
<kbd>Ctrl</kbd>+<kbd>x</kbd> 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
|
||||
|
||||
<https://community.torproject.org/onion-services/setup/>
|
65
Ssh server as a Tor onion service.md
Normal file
65
Ssh server as a Tor onion service.md
Normal file
|
@ -0,0 +1,65 @@
|
|||
# Configure an onion service
|
||||
|
||||
*Shamelessly copied from <https://www.techrepublic.com/article/how-to-run-an-ssh-connection-through-tor/>*
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
<kbd>Ctrl</kbd>+<kbd>x</kbd> 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
|
||||
|
||||
<https://community.torproject.org/onion-services/setup/>
|
113
bash-zsh_TerminalShorcuts.md
Normal file
113
bash-zsh_TerminalShorcuts.md
Normal file
|
@ -0,0 +1,113 @@
|
|||
# Terminal Shortcuts
|
||||
|
||||
## Default shortcuts
|
||||
|
||||
For Ubuntu's default keybinding settings (i.e Emacs keybindings)
|
||||
|
||||
### Insert previous arguments
|
||||
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>: insert last argument from last command.
|
||||
- <kbd>Alt</kbd>+<kbd>number</kbd>+<kbd>.</kbd>: insert #nth last argument from last command.
|
||||
- <kbd>Alt</kbd>+<kbd>-</kbd> , <kbd>number</kbd> , <kbd>Alt</kbd>+<kbd>.</kbd>, **zsh:** <kbd>Alt</kbd>+<kbd>-</kbd>+<kbd>number</kbd>+<kbd>.</kbd>: 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
|
||||
|
||||
- <kbd>Alt</kbd>+<kbd>0</kbd>+<kbd>.</kbd>: insert first argument of last command = `mv`
|
||||
- <kbd>Alt</kbd>+<kbd>2</kbd>+<kbd>.</kbd>: insert last 2nd argument of last command = `foo`
|
||||
- <kbd>up</kbd> , <kbd>Ctrl</kbd>+<kbd>w</kbd>: last command without the last word = `mv foo`
|
||||
|
||||
### Cut/Paste commands
|
||||
|
||||
(relative to cursor's position)
|
||||
|
||||
- <kbd>Ctrl</kbd>+<kbd>w</kbd>: cuts last word
|
||||
- <kbd>Alt</kbd>+<kbd>d</kbd>: cuts next word
|
||||
- <kbd>Ctrl</kbd>+<kbd>k</kbd>: cuts everything after
|
||||
- <kbd>Ctrl</kbd>+<kbd>u</kbd>, **zsh:** <kbd>Alt</kbd>+<kbd>w</kbd>: cuts everything before
|
||||
- **zsh:** <kbd>Ctrl</kbd>+<kbd>u</kbd>: cuts the entire command *(In bash you can combine <kbd>Ctrl</kbd>+<kbd>u</kbd> , <kbd>Ctrl</kbd>+<kbd>k</kbd>)*
|
||||
- <kbd>Ctrl</kbd>+<kbd>y</kbd>: paste characters previously cut with any **Cut command**. *In bash you can chain **cut commands**, and <kbd>Ctrl</kbd>+<kbd>y</kbd> will paste them all.*
|
||||
|
||||
### Move cursor
|
||||
|
||||
- <kbd>Ctrl</kbd>+<kbd>left</kbd>: move to last word
|
||||
- <kbd>Ctrl</kbd>+<kbd>right</kbd>: move to next word
|
||||
- <kbd>home</kbd> or <kbd>Ctrl</kbd>+<kbd>a</kbd>: move to start of command
|
||||
- <kbd>end</kbd> or <kbd>Ctrl</kbd>+<kbd>e</kbd>: move to end of command
|
||||
|
||||
### Other
|
||||
|
||||
- <kbd>Ctrl</kbd>+<kbd>_</kbd>: undo last edit *(very useful when exceeding <kbd>Ctrl</kbd>+<kbd>w</kbd>)*
|
||||
|
||||
### 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 <kbd>Alt</kbd>+<kbd>.</kbd> to go as back as you want, then use <kbd>Alt</kbd>+<kbd>:</kbd> to iterate through the arguments
|
||||
|
||||
#### Example
|
||||
|
||||
Last command is
|
||||
|
||||
echo 1 2 3 4 5
|
||||
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>: `5`
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>+<kbd>:</kbd>: `4`
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>+<kbd>:</kbd>+<kbd>:</kbd>: `3`
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>: `2`
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>: `1`
|
||||
- <kbd>Alt</kbd>+<kbd>.</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>+<kbd>:</kbd>: `echo`
|
||||
|
||||
source: <https://stackoverflow.com/a/34861762/3163120>
|
||||
|
||||
## Other examples
|
||||
|
||||
### Common usecases
|
||||
|
||||
Let's consider the last command to be:
|
||||
|
||||
mv foo bar
|
||||
|
||||
<kbd>up</kbd> , <kbd>Ctrl</kbd>+<kbd>w</kbd>: last command without the last word = `mv foo`
|
||||
|
||||
<kbd>Alt</kbd>+<kbd>0</kbd>+<kbd>.</kbd>: 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 <kbd>Ctrl</kbd>+<kbd>w</kbd> 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 <kbd>Ctrl</kbd>+<kbd>w</kbd>, you'd have to repeat it 12 times.
|
||||
|
||||
---
|
||||
|
||||
It would be great to have similar shortcuts that only stops at the **space character**
|
159
install youtube-dl in android.md
Normal file
159
install youtube-dl in android.md
Normal file
|
@ -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 <https://www.reddit.com/r/Piracy/comments/baufql/youtubedl_the_easy_way_on_android/>
|
||||
|
||||
## 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
|
||||
|
||||
<https://termux.com/>
|
||||
|
||||
## Open Termux and run one of these
|
||||
|
||||
<!-- no toc -->
|
||||
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 <kbd>Enter</kbd>
|
||||
- A prompt to enable storage will appear, press <kbd>y</kbd> then <kbd>Enter</kbd>
|
||||
- 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
|
||||
```
|
43
troubleshoot/ubuntu_network.md
Normal file
43
troubleshoot/ubuntu_network.md
Normal file
|
@ -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
|
184
ubuntu fresh install.md
Normal file
184
ubuntu fresh install.md
Normal file
|
@ -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!. <https://github.com/AntiMicro/antimicro/issues>
|
||||
|
||||
`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 <https://gist.github.com/madacol/19f8c71ba98f484a4294ccfe90e88e6e> in `~/.config/antimicro`
|
||||
|
||||
### SinkSwitcher
|
||||
|
||||
<https://github.com/madacol/sinkSwitcher>
|
||||
|
||||
## Web installs
|
||||
|
||||
- docker: <https://download.docker.com>
|
||||
- VSCode: <https://code.visualstudio.com/>
|
||||
- chrome: <https://www.chrome.com/>
|
||||
- syncthing: <https://apt.syncthing.net/>
|
||||
- Zsh-syntax-highlighting: <https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md>
|
||||
|
||||
## 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 <https://extensions.gnome.org/extension/517/caffeine/>
|
||||
- NetSpeed <https://extensions.gnome.org/extension/104/netspeed/>
|
||||
- EasyScreenCast <https://extensions.gnome.org/extension/690/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 <https://medium.com/@madacol/configure-cmus-music-player-on-the-terminal-in-ubuntu-3c513d2d2cd0>
|
||||
- `qalculate`
|
||||
|
||||
## StartUp
|
||||
|
||||
- Cmus `gnome-terminal -- cmus`
|
Loading…
Reference in New Issue
Block a user