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