Compare commits

...

156 commits

Author SHA1 Message Date
07ed301ddf LFS 2022-07-07 17:57:11 -03:00
9c6da3721e LFS 2022-07-07 17:54:27 -03:00
3603e5e4b7 drip: Agregarle espacio abajo a las listas 2022-07-07 17:51:47 -03:00
99b0f05dae CHINESE GOD OIL 2022-07-07 17:51:21 -03:00
862c4bb05e Android seguro: F-Droid 2022-07-06 21:22:24 -03:00
25939e8a54 Ideas para una web distribuida: Ink & Switch 2022-07-06 12:01:23 -03:00
42f73693a7 Teclados mecánicos: Switch de poder 2022-07-06 11:56:42 -03:00
5a3e4aec06 Aesthetic 2022-07-04 20:19:42 -03:00
2dfbfa2cad Git: Borrar archivos sin trackear 2022-06-25 08:45:04 -03:00
30e4eccf46 2022-06-08 Necesitamos seguridad colectiva 2022-06-08 12:42:48 -03:00
74c461610d Git: Corregir link 2022-06-05 13:04:56 -03:00
dfc6961e97 BitTorrent: btqd 2022-06-04 14:46:47 -03:00
8825d1f2cf Arreglando bugs ajenos: ¡Los arreglaron! 2022-06-02 18:58:38 -03:00
226d7748c9 Nutrición 2022-05-26 13:16:35 -03:00
f4f335b327 XMPP 2022-05-26 13:15:57 -03:00
6df745d4be Android: Relacionado 2022-05-19 18:34:23 -03:00
6f970c8bb5 Android seguro: Plexus 2022-05-19 18:33:31 -03:00
f4880fa693 Android seguro: Drama 2022-05-19 18:32:31 -03:00
b2632ea677 Android seguro 2022-05-19 13:34:49 -03:00
9a02534638 Thinkpad X230: Flashear sin externo 2022-05-11 16:10:31 -03:00
8e80519fb0 Protocolo de toma de decisiones Sutty v0.1: Borrar párrafo de más 2022-03-30 19:32:20 -03:00
4d523f4a9a Protocolo de toma de decisiones Sutty v0.1 2022-03-30 19:29:08 -03:00
5d3f66fb2a aaaaaaaaaaaaaaaaaaaaaaaaaaarainbow.html 2022-03-13 15:40:29 -03:00
377bc34821 Fuck WebRTC 2022-03-13 00:08:19 -03:00
f5fca0043f Linkear al repositorio de Gitea 2022-03-12 21:07:35 -03:00
c368e39d56 Index: Reordenar 2022-03-12 21:06:12 -03:00
690c0d76fc drip: Usar --foreground para la línea de los títulos
Así se ven bien en modo oscuro
2022-03-12 21:01:05 -03:00
893d9d043a drip: Ir a la izquiera, aumentar padding 2022-03-10 09:43:01 -03:00
932e358197 drip: Mejorar manejo de colores 2022-03-10 09:42:25 -03:00
28f4dd1c60 Este sitio: Agregar Ten Digits como inspiración 2022-03-06 18:30:06 -03:00
829deecd4e drip: Sacar fondo de listas y cambiar espaciado 2022-03-06 01:20:43 -03:00
5a1f7ac2e5 drip: Cambiar estilo de titulos 2022-03-06 01:20:17 -03:00
e39b24ecf6 Microcontrolador (teclados mecánicos): Reestructurar 2022-03-06 01:19:59 -03:00
5a73a2a055 Atreus v1 2022-03-06 00:55:12 -03:00
e7eb17bc1b drip: Borde redondeado en multimedia 2022-03-06 00:54:39 -03:00
a9fb8f5a3a drip: Poner el sitio a la derecha para molestar 2022-03-06 00:54:21 -03:00
4dd97f6418 Bookmarklets 2022-03-04 19:25:01 -03:00
a0effd72e0 Thinkpad X230 2022-03-04 19:19:37 -03:00
5a29b533da Fabricación de circuitos impresos 2022-02-27 17:04:25 -03:00
b05799f234 Teclados mecánicos 2022-02-20 12:47:43 -03:00
246f35ee8b Disroot 2022-02-11 15:06:02 -03:00
a173fce5c8 Woodpecker: Setear base_uri 2022-02-08 23:30:20 -03:00
586580f02b Open Graph 2022-02-08 23:29:54 -03:00
948818146c build.sh: Permitir compilar con advertencia de mirror 2022-02-08 23:16:22 -03:00
f9052012db Atreus v2: Agregar Inspiraciones 2022-02-08 23:05:59 -03:00
bf6ad05ee5 Python 2022-02-08 22:07:49 -03:00
8a3770d19f Atreus v2 2022-02-08 19:19:09 -03:00
c5f70e138e Facebook 2022-02-08 19:17:50 -03:00
d1de541cf2 Email: Resetting credentials without email 2022-02-08 19:16:12 -03:00
50b9ebe8c8 PXE 2022-02-07 15:00:08 -03:00
b0dd18b486 Git: Encontrar que eliminó algo 2022-02-03 18:59:32 -03:00
65b81dc3a4 Git: Usar delta para diffs 2022-02-03 18:59:25 -03:00
70e62ab4dd timer.html 2022-02-03 01:18:15 -03:00
7a004a2ca0 NeoMutt 2022-02-03 01:08:19 -03:00
d18bfd7b87 BitTorrent: Agregar propuesta de archivar con BitTorrent 2022-02-01 18:42:19 -03:00
19a1417a39 🤠 2022-02-01 18:12:56 -03:00
1d7eb1da79 Email 2022-02-01 16:48:48 -03:00
df1ba469a9 Android: adb reverse roto 2022-01-31 19:56:02 -03:00
2fc71b19f5 C: C Is Not a Low-Level Language 2022-01-31 15:20:40 -03:00
a45b481819 Inversiones 2022-01-31 12:22:12 -03:00
835fdfab55 OnePlus 5T: Agregar un post de XDA 2022-01-31 01:47:45 -03:00
417c2576c4 Piratería 2022-01-31 01:47:45 -03:00
d66c4873d2 Formatos de texto 2022-01-31 01:47:45 -03:00
0b53bc49f0 PDF 2022-01-26 17:31:31 -03:00
d10e3dd862 Bluetooth 2022-01-21 22:31:56 -03:00
a8a5d2452c Experiencing harmful behavior in Alpine: Mejorar redacción de mis intenciones 2022-01-20 13:27:23 -03:00
d6f874a5c3 Experiencing harmful behavior in Alpine: Agregar fecha 2022-01-20 12:58:42 -03:00
c8178ddd71 Experiencing harmful behavior in Alpine: Usar <mark> en vez de ==
No tengo esa extensión de Markdown
2022-01-20 12:50:20 -03:00
eb260454c2 Experiencing harmful behavior in Alpine 2022-01-20 12:48:12 -03:00
e0d2e3f721 drip.css: Wrappear pre 2022-01-20 12:48:00 -03:00
f0ef995109 Ideas para una web distribuida 2022-01-20 12:22:46 -03:00
cd386b6809 Not So Shoujo Love Story: Arreglar error de formateo 2022-01-17 00:08:12 -03:00
64f3c4d45f Comics: Typo 2022-01-16 22:19:09 -03:00
d34c70c67a Comics y Not So Shoujo Love Story 2022-01-15 20:01:48 -03:00
172766580d HTML 2022-01-14 22:44:23 -03:00
100cad1314 Android Auto 2022-01-13 11:10:36 -03:00
6cb1817b41 Alpine Linux 2022-01-13 11:10:36 -03:00
6471090f56 Gitea 2022-01-09 22:04:36 -03:00
a5f622a64a Programación: agregar Frugal computing: developer perspective 2022-01-01 16:12:21 -03:00
11b78f5b3e Git: agregar How can I trust this git repository? 2021-12-31 15:51:17 -03:00
fdd207b9e2 drip.css: darle un fondo a las listas 2021-12-28 16:36:03 -03:00
18905c42a0 Boox T68 2021-12-28 16:18:03 -03:00
3472ef0f21 Nullificación 2021-12-27 21:13:05 -03:00
e43967db4e Burn Book: formatear bien 2021-12-25 20:11:29 -03:00
23266e78ce Burn Book 2021-12-25 20:10:54 -03:00
41d0cc7e6c Git: Diffs útiles para Alpine 2021-12-21 12:28:45 -03:00
54cc16c7c7 Android: gcompat 2021-12-21 12:13:52 -03:00
7b394a9aa6 Booteables 2021-12-20 22:27:24 -03:00
bd83fc29bb Menú artístico: link en una línea 2021-12-20 22:10:49 -03:00
46323d4f95 Cambiar los links a la repo del sitio a cgit 2021-12-20 22:07:24 -03:00
dbe37fa279 Menú artístico: usar lua5.1 específicamente 2021-12-20 22:00:23 -03:00
e756f00b48 Este sitio 2021-12-20 20:27:26 -03:00
7a3f19821f VPS 2021-12-19 21:54:50 -03:00
50fd5dff49 Permacomputación 2021-12-18 19:24:51 -03:00
56c132634e SONG Music LLC 2021-12-17 15:48:43 -03:00
a552a20461 Android: completar instrucciones de SDK 2021-12-15 12:25:40 -03:00
ad879fa2b3 Android 2021-12-15 12:11:34 -03:00
6d60ffb36e Menú artístico: poner link al código 2021-12-10 18:36:02 -03:00
2016a6bc8c Menú artístico: mejorar entropía 2021-12-10 18:26:44 -03:00
3562c9b132 Lista de páginas: no romper enlaces y mostrar otras páginas .gen 2021-12-10 18:19:14 -03:00
fb01454499 CI: agregar Lua para compilar Menú artístico 2021-12-10 18:16:42 -03:00
a9ada377a1 Menú artístico 2021-12-10 18:15:56 -03:00
a4661a715c Separar lista de páginas en otra página y poder hacer paginas generadas 2021-12-10 17:44:26 -03:00
494771b168 No sobreescribir rel="me" en Mastodon 2021-12-10 11:54:21 -03:00
b949e5a97c Agregar link a Mastodon 2021-12-10 11:48:27 -03:00
3f21d44e7a Antiderechos de autorx 2021-12-03 14:56:02 -03:00
2f314a2437 Subdivx: update 2021-12-02 15:19:35 -03:00
e43ae49df7 OnePlus 5T 2021-12-02 15:08:24 -03:00
c4e6ee40d6 Subdivx: update 2021-12-01 19:32:45 -03:00
8515443d78 Subdivx: update 2021-12-01 14:17:48 -03:00
816a228243 Subdivx: typo 2021-11-30 22:24:21 -03:00
49dff82c30 Subdivx: update 2021-11-30 22:22:34 -03:00
366dc7e7e1 Subdivx: typos 2021-11-30 22:22:29 -03:00
5fafcbff64 Subdivx: nuevo anuncio 2021-11-30 21:30:46 -03:00
869c7a5f24 Subdivx: Si querés contribuir 2021-11-30 20:04:32 -03:00
84565744b9 Subdivx: IRC 2021-11-30 19:40:45 -03:00
0aa88d8c78 Subdivx: es colectivo 2021-11-30 19:23:41 -03:00
f2245bd5b2 Empezar Subdivx 2021-11-30 19:13:33 -03:00
472bdf6a74 Git es difícil 2021-11-29 14:30:12 -03:00
7eaf8081e1 Agregar Alimentación con Examine.com 2021-11-21 16:01:50 -03:00
b9d35a03b0 Agregar Web con HSTS Preload 2021-11-21 16:01:37 -03:00
47ac7c98e4 Programación: Coding Interview University 2021-11-21 16:01:14 -03:00
748fdb6bb2 DecSync: espacios 2021-11-21 16:01:08 -03:00
c1276724cf Programación: agregar Invisible backdoor 2021-11-11 22:10:51 -03:00
db133654c1 Espacios en vez de tabs 2021-11-11 19:51:32 -03:00
063c6d1701 Programación: añadir Destroy All Software 2021-11-11 19:50:20 -03:00
f6343283ed DecSync 2021-11-11 18:36:48 -03:00
cc96b596f7 Mostrar otra cosa si el navegador no soporta <video> 2021-11-03 18:58:01 -03:00
4f26d8e44b Modo oscuro 2021-11-03 18:57:53 -03:00
4b7b7a8962 YouTube: videos, no sitios 2021-11-03 12:06:56 -03:00
07743e180a YouTube 2021-11-03 11:59:07 -03:00
8ff48c9937 Agregar txt2txt a juguetes 2021-11-03 08:54:08 -03:00
704e27d5e1 txt2txt: empezar 2021-11-03 08:50:30 -03:00
22a948ab17 Revert "Prueba para la CI"
This reverts commit 4629391408.
2021-11-01 11:06:07 -03:00
e6ca420a2a Prueba para la CI 2021-11-01 11:00:49 -03:00
f7006c5961 drip.css: agregarle DRIP a las citas 2021-11-01 10:12:16 -03:00
a9ca3d1b40 ... 2021-11-01 10:01:18 -03:00
dde89887fd Diseño 2021-10-31 00:42:38 -03:00
46ee99f13c Cocina: separar lista de sitios en inglés 2021-10-28 12:44:45 -03:00
f848c155c9 Cocina: agregar Internet Shaquille 2021-10-28 12:44:17 -03:00
5006bd47d1 Cocina: Subtitulos pls 2021-10-27 17:55:57 -03:00
a14e194572 Cocina: agregar CookLang 2021-10-27 17:55:48 -03:00
80116ff517 Cocina 2021-10-22 21:55:53 -03:00
da5994dcfc Git 2021-10-12 23:34:39 -03:00
091a8a88b5 Arreglando bugs ajenos: agregar repo 2021-10-11 17:27:59 -03:00
1d16af2902 index: poner escrituras recientes primero 2021-10-11 16:38:46 -03:00
1e3455d64a :set spell spelllang=es :) 2021-10-11 16:36:13 -03:00
980a8b384b Banda ancha 2021-10-11 16:31:49 -03:00
ca21ed158b Reutilizar código de markdown en index 2021-10-11 16:27:56 -03:00
a36c69108e Arrelgar typo 2021-10-11 16:27:33 -03:00
d39cfe0623 Inicializar inicio 2021-10-11 16:18:21 -03:00
d163d8706b Usar tabs para listas 2021-10-11 16:17:24 -03:00
2da50891b8 Algunas cosas de ShellCheck 2021-10-11 16:14:23 -03:00
f63bd3d3ab No usar echo -n (no es POSIX) 2021-10-11 16:13:38 -03:00
f1519be536 Agregar Arreglando bugs ajenos al index 2021-10-11 16:12:48 -03:00
1c9981cd6e Arreglando bugs ajenos 2021-10-11 16:12:42 -03:00
80 changed files with 1427 additions and 31 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.mp4 filter=lfs diff=lfs merge=lfs -text

View file

@ -2,10 +2,10 @@ pipeline:
build:
image: docker.io/alpine:3.14
commands:
- apk add cmark git cmd:setup-timezone
- apk add cmark git cmd:setup-timezone lua5.1
# Para generar las fechas bien
- setup-timezone -z America/Argentina/Buenos_Aires
- ./build.sh
- base_uri=https://nulo.in/ ./build.sh
deploy:
image: docker.io/alpine:3.14
commands:

View file

@ -0,0 +1,7 @@
La gran mayoría de herramientas de seguridad y privacidad que recomendamos lxs hacktivistas son individualistas, forzándote a hacer copias de seguridad por tu cuenta (y si perdés acceso, chau a tus datos) o institucionistas en donde tenés que confiarle a una entidad/empresa/organización en cuidar de tus datos correctamente (a nivel integridad pero también seguridad).
Lo raro es que ya tenemos -hace mucho tiempo- las herramientas para hacer copias de seguridad colectivistas. Tenemos protocolos como BitTorrent permitiendo compartir copias de seguridad de datos entre nodos de distintas personas. Y encima, tenemos el [esquema de Shamir](https://es.wikipedia.org/wiki/Esquema_de_Shamir) para compartir copias de seguridad de llaves de cifrado (para cifrar las copias de seguridad de datos) entre personas de confianza.
Lo interesante de este esquema es que da una especie de _confianza parcial_ a esas personas ya que **requiere que al menos N personas de confianza de tus M personas de confianza se junten para restaurar acceso**. Es decir que podés tener 7 personas de confianza pero solo se pueda restaurar acceso con al menos 4. Esto hace que, aún si una, dos o tres personas conspiran contra vos para hackear tu identidad, no lo puedan hacer sin conseguir acceso a las llaves de las otra 4 personas.
[Vitalik (el de Ethereum) piensa lo mismo](https://vitalik.ca/general/2021/01/11/recovery.html). Inspirado en este [dramático post](https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/) ([HackerNews](https://news.ycombinator.com/item?id=31652650)).

2
Aesthetic.md Normal file
View file

@ -0,0 +1,2 @@
- [@nametheblue en Twitter](https://twitter.com/nametheblue)

1
Alimentación.md Normal file
View file

@ -0,0 +1 @@
- [Examine.com](https://examine.com): sitio con análisis (en inglés) de estudios y otras cosas sobre nutrición

3
Alpine Linux.md Normal file
View file

@ -0,0 +1,3 @@
## Trucos
- Instala la documentación de todos los paquetes instalados con el metapaquete `docs`: `apk add docs`

6
Android Auto.md Normal file
View file

@ -0,0 +1,6 @@
Es un sistema para conectar un celular Android a la pantalla de un auto para tener instrucciones de navegación y otras funcionalidades.
- No lo probé pero sospecho que requiere de los servicios de Google
- Desde ~2018 **solo muestra aplicaciones instaladas de la Play Store**.
Se debería llamar Google Auto.

38
Android seguro.md Normal file
View file

@ -0,0 +1,38 @@
Hay varios proyectos con el objetivo de hacer distribuciones de Android seguras. Algunas de ellas:
- [GrapheneOS](https://grapheneos.org/): el OG. Solo soporta celulares Google Pixel (por temas de seguridad). Antes conocido como CopperheadOS (ese nombre [ahora es usado por otra gente mandafruta](https://grapheneos.org/history/copperheados)). No soporta MicroG pero si [Play Services sandboxeados](https://grapheneos.org/usage#sandboxed-google-play).
- [DivestOS](https://divestos.org/): Soft fork de LineageOS. Trae muchas cosas de GrapheneOS. Soporta dispositivos que GrapheneOS y hasta LineageOS no soportan. Hace cosas interesantes para hacerlos "lo más seguro posible", como un [patcher de CVEs del kernel](https://gitlab.com/divested-mobile/cve_checker). No soporta MicroG (aunque tiene la opción al momento de compilar) ni Play Services.
- [CalyxOS](https://calyxos.org/): Fork de GrapheneOS con muchas funcionalidades de seguridad removidas. Solo soporta Google Pixels y Xiaomi Redmi A2 ([betas para OnePlus nuevos y FairPhone 4](https://calyxos.org/news/2022/05/04/fp-op-may-update/)). Incluye MicroG opcional.
## Dump
- [Plexus](https://plexus.techlore.tech/): Base de datos de aplicaciones que funcionan sin Play Services o con MicroG.
- [Problemas con F-Droid según Daniel Micay](https://github.com/GrapheneOS/Camera/issues/227#issuecomment-1147386415)
## Conflictos actuales
CalyxOS (¿junto a MicroG?) está peleado con GrapheneOS ([hilo de Twitter de GrapheneOS](https://web.archive.org/web/20220430044111/https://twitter.com/GrapheneOS/status/1520193441770188810), [hilo de GitHub sobre la seguridad de MicroG con Daniel Micay (desarrollador de Graphene)](https://web.archive.org/web/20210808002006/https://github.com/microg/GmsCore/issues/1467)).
GrapheneOS acusa a CalyxOS de decir haber creado SeedVault (ver hilo de Twitter). No se que es verdad, [el primer commit](https://github.com/seedvault-app/seedvault/commits/android12?after=e26081fcfa61231b01ee80c102d61999e3ab03f3+629&branch=android12&qualified_name=refs%2Fheads%2Fandroid12) es de "Steve Soltys" que no veo directamente asociado a GrapheneOS ni a Calyx y [el mayor contribuidor](https://github.com/seedvault-app/seedvault/graphs/contributors) ("Torsten Grote") tampoco.
Hay mucho lore y drama, [este video de 53 minutos(!) habla más sobre este](https://vid.puffyan.us/watch?v=Dx7CZ-2Bajg) aparentemente desde la perspectiva de Calyx, pero no tengo ganas de verlo. Daniel Micay (strcat) conspira en que fue hecho junto a Calyx:
>```
>23:08 strcat[m] well, you folks at Calyx
>23:08 strcat[m] have participated in bullying and harassment of me
>23:08 strcat[m] including in collaboration with techlore
>23:08 strcat[m] and I will be publicly calling you out on that and your attempt at projecting what your community has been doing onto me
>23:09 strcat[m] your dishonest personal attack on me there
>23:09 strcat[m] kicking us out of the organization
>```
[logs](https://web.archive.org/web/20210403012439/https://freenode.logbot.info/AOSPAlliance/20201211)
Dump de links relacionados:
- [What is the history of seedvault? Who created it? : r/PrivacyGuides](https://old.reddit.com/r/PrivacyGuides/comments/t8moav/what_is_the_history_of_seedvault_who_created_it/)
- [More drama around GrapheneOS and CalyxOS - midwest.social](https://midwest.social/post/2467)
- [replace AOSP keyboard with FlorisBoard when it has Direct Boot support and more baseline features · Issue #579 · GrapheneOS/os-issue-tracker · GitHub](https://github.com/GrapheneOS/os-issue-tracker/issues/579) - GrapheneOS no acepta (A)GPL
- [Daniel Micay on Twitter: "Someone posting across platforms in threads that aren't even about GrapheneOS bringing up my name and claiming I'm crazy/delusional thinks that they're the victim because we archived it and posted a response in those threads. They're trying to turn it into some kind of drama now." / Twitter](https://mobile.twitter.com/DanielMicay/status/1520227741374812161)
- [Daniel Micay on Twitter: "https://t.co/ZYbEFgDjsA People engaging in this are not somehow victims because they were banned from our community. Very strange to see them pretending as if they've been wronged by being banned for such highly abusive and underhanded behavior which has been ongoing for years." / Twitter](https://mobile.twitter.com/DanielMicay/status/1518262412482334722)
- [Daniel Micay on Twitter: "Some developers create these issues on their own by not using separate app ids for different variants of their apps, but many are handling this properly and most don't have incompatible variants available. F-Droid is the elephant in the room making this a common real world issue." / Twitter](https://mobile.twitter.com/DanielMicay/status/1517191368338456581)
- [Daniel Micay on Twitter: "Today they've been alternating between spreading libel, anti-semitic attacks and pretending to be a GrapheneOS user who needs help in an attempt to waste the time of our community members and developers who are very willing to spend substantial time helping people." / Twitter](https://mobile.twitter.com/DanielMicay/status/1511641020089479175)

56
Android.md Normal file
View file

@ -0,0 +1,56 @@
## Relacionado
- [[Android seguro]]
- [Battery Historian](https://developer.android.com/topic/performance/power/setup-battery-historian): Herramienta para analizar el uso de batería
## Desarrollo en Alpine
Estas instrucciones están parcialmente tomadas de [esta respuesta en StackOverflow](https://stackoverflow.com/a/66316335).
1. Para instalar el SDK en Alpine, primero instalemos `android-tools` para instalar las herramientas básicas de Android (`adb` por ejemplo) junto a sus versiones de Java:
```sh
# Correr como root:
apk add android-tools
```
2. Después tenemos que crear un `ANDROID_SDK_ROOT`:
```sh
mkdir ~/android-sdk
# ¡Poner en ~/.profile!
export ANDROID_SDK_ROOT="$HOME/android-sdk"
export PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin"
```
3. Bajamos [commandlinetools](https://developer.android.com/studio#command-tools) (que incluye `sdkmanager`) y lo extraemos dentro de `~/android-sdk/cmdline-tools/latest`.
4. Finalmente, instalamos las cosas que necesitamos. Por ejemplo, para [Lunar](https://0xacab.org/lunaramaturitmo/app/) (acorde a [la documentación](https://0xacab.org/lunaramaturitmo/app/-/blob/master/docs/prepare.md)):
```sh
sdkmanager 'build-tools;29.0.2' 'platforms;android-29'
```
5. Instalamos [`gcompat`](https://git.adelielinux.org/adelie/gcompat) que nos permite correr binarios que requieren [Glibc](https://es.wikipedia.org/wiki/Glibc) en Alpine que no lo tiene:
```sh
# Correr como root:
apk add gcompat
```
## `adb reverse` roto
En algunos dispostivos, cuando están conectados a través de ADB TCP/IP se rompen al intentar usar `adb reverse`:
```
$ adb reverse tcp:42069 tcp:42069
more than one device/emulator
```
Aún cuando no hay otros dispositivos. La solución es hacer el `adb reverse` antes de conectarse mientras está conectado por USB:
```
adb tcpip 5555
adb reverse tcp:42069 tcp:42069
adb connect IP:5555
```

View file

@ -0,0 +1,2 @@
- [Mundo viejo, mundo nuevo de Hernán Casciari](https://www.youtube.com/watch?v=62zc4zB77f4)
- [Los justos de Hernán Casciari](https://www.youtube.com/watch?v=GWO8wghlyE4) sobre rips, subtitulado comunitario

205
Arreglando bugs ajenos.md Normal file
View file

@ -0,0 +1,205 @@
_Actualización 2022-06-02_: después de reportar lo que encontré, DW arregló el primer bug y asumo el segundo (no me acuerdo que ejercicios estaban rotos, por lo que no puedo testear). Y lo mejor: no borraron los source maps, permitiendome mantener haciendo cambios de funcionalidad (por ejemplo, mis modificaciones permiten acelerar audios) 💓
A continuación, el post original:
<small>2021/10/11</small>
Estoy aprendiendo alemán y mi principal recurso es el "Aprender Alemán" de la Deutsche Welle ([learngerman.dw.com](https://learngerman.dw.com/es/overview)). Sin embargo, en una de las recientes actualizaciones al sitio/app, rompieron _varias_ cosas.
Les mandé un mail al equipo de desarrollo ¡pero no me contestaron! Así que lo arreglé yo mismo.
Pero ¿cómo? El código es privativo y no tengo acceso. El _JavaScript_ que llega a mi navegador está minificado, es decir que se le elimina palabras y se comprime a un archivo para ahorrar ancho de banda. Pero **otra de las razones por las que se minifica es para no dar acceso al código.**
Sin embargo, el equipo de desarrollo cometió un error (¿intencionalmente?) en donde dejaron los "source maps". Los source maps son unos archivos que le permiten a las herramientas de desarrolladorx saber que parte del código minificado es cuál línea de código. ¡Por eso se llaman mapas! Para lograr esto, contienen casi todo el código del sitio.
Pero hay un último 5% del código que me hace falta para poder aplicar cambios: la configuración de las herramientas que minifican y compilan el código. Para mi suerte, este sitio utiliza una tecnología con la que ya tengo experiencia (React) así que puedo reconstruir esta configuración por mi cuenta.
Sabiendo esto, vayamos a lo práctico.
## Extrayendo el código
Empiezo por abrir la ventana de herramientas de desarrolladorx de mi navegador en el sitio y extraigo los enlaces a los archivos que terminan con `.map`, que son los source maps. Los guardo en un archivo con un enlace por línea y los descargo utilizando un script:
```sh
for f in $(cat files); do
wget $f
done
```
Ok, ahora necesito extraer los archivos de código de cada uno. Por suerte, ya existen herramientas que lo hagan por mi. Probé con [este script](https://gist.github.com/banyudu/b17a9cb3f05296b76a9f3051f66c3dcd) pero mi mejor experiencia fue con [este](https://github.com/akx/source-from-sourcemaps).
```sh
for f in *.map; do
node source-from-sourcemaps.js $f
done
```
## Levantando el código localmente
Después configuré una herramienta que compila código de React y hace otras magias por mi llamada [Vite](https://vitejs.dev). Podría haber usado la que lxs desarrolladorxs del sitio usaron originalmente, [webpack](https://webpack.js.org/), pero en mi experiencia es muy tedioso de configurar.
Tuve varios problemas al intentar levantar un entorno de desarrollo local con el código. Acá están algunos junto a sus soluciones en ningún orden particular:
- Vite esperaba que los archivos de React tengan la extensión `.jsx` mientras que originalmente tenían la extensión `.js`. Script:
```sh
for f in $(find -iname '*.js'); do
mv $f ${f}x
done
```
- Había una parte del código que eran archivos SVG "compilados" a React. Sin embargo, estos esperaban una variable especial de webpack (o algún plugin de webpack) que por supuesto no existía. Para esto, hice otro script para inyectarles esa variable:
```sh
for f in $(find -iname '*.svg.js'); do
echo 'const __webpack_public_path__ = "https://learngerman.dw.com/";' > ${f}.lol
cat $f >> ${f}.lol
mv ${f}.lol $f
done
```
- Tenía que instalar las dependencias de todo el proyecto. Esto lo hice con más script-fu:
```sh
grep -r "from '[\w@].*';" . > imports
sort -u imports > imports.uniq
xargs pnpm add < imports.uniq
# Por alguna razón esto no fue suficiente y tuve que manualmente añadir varias dependencias
pnpm add graphql videojs-seek-buttons videojs-contrib-quality-levels videojs-hls-quality-selector videojs-seek-buttons videojs-hls-quality-selector
```
- Faltaba tener el CSS localmente así que lo descargé:
```sh
for f in basestyles stylesheets customBaku; do
wget https://learngerman.dw.com/assets/css/${f}.css
done
```
- En `config.js` se tomaban variables de entorno que asumo existen en el entorno de trabajo de lxs desarrolladorxs. Yo las mentí:
```js
const process = {
env: {
// REACT_APP_GRAPHQL_BASE_URL: "https://learngerman.dw.com/graphql",
REACT_APP_GRAPHQL_BASE_URL: "https://localhost:4002/graphql",
REACT_APP_RECAPTCHA_SITEKEY: null,
},
};
```
Notese como originalmente había mentido diciendo que la URL de la API era learngerman.dw.com, pero luego lo cambié para que apunte a una URL local ya que la API no me permitía accederla desde un sitio no legítimo. Esa URL local apunta a un proxy a la API real.
Es muy probable que haya tenido que hacer más cosas y me haya olvidado. Fue mucho prueba y error hasta que el sitio finalmente cargó.
## Arreglando bug 1: problema de accesibilidad
Por un tiempo, tuve una de mis muñecas inaccesibles por unas semanas. Esto me obligo a usar exclusivamente la otra, complicando el uso del mouse y utilizando el teclado lo más posible.
Recientemente, en el sitio agregaron una solapa de "transcripción" mostrando todo el dialogo que había en el video del ejercicio. Sin embargo, cuando esta solapa estaba cerrada, se podían seguir seleccionando los enlaces dentro de la solapa con el teclado, haciendo la navegación por teclado tediosa.
<video controls src="Arreglando bugs ajenos.md-details.mp4">Tu navegador no soporta video HTML5.</video>
La solucion es simplemente usar el elemento de solapa que ya viene con el navegador: [`<details>`](https://developer.mozilla.org/es/docs/Web/HTML/Element/details). (La página de `<details>` en MDN esta desactualizada al momento de escribir este artículo.)
Estos fueron los cambios que hice:
```diff
diff --git a/./components/ContentContainer/AccordionContainer.jsx.orig b/./components/ContentContainer/AccordionContainer.jsx
index ed71204..d0ea66e 100644
--- a/./components/ContentContainer/AccordionContainer.jsx.orig
+++ b/./components/ContentContainer/AccordionContainer.jsx
@@ -6,43 +6,26 @@ import { colors } from '../../utils/css';
import { useTranslation } from '../../hooks/useTranslation';
export const AccordionContainer = ({ title, children, className }) => {
- const element = useRef(null);
- const [isOpen, { toggleOnClick }] = useToggle();
- const height = element.current ? element.current.scrollHeight : '0';
const titleTranslation = useTranslation(title);
return (
- <div className={className}>
- <div className="row noVMargins">
+ <details className={className}>
+ <summary className="row noVMargins">
<div className="col-sm-offset-1 col-sm-10 col-lg-offset-2 col-lg-8">
- <button tabIndex={0} onClick={toggleOnClick}>
<h4>
{titleTranslation}
- <ToggleableArrow
- className="toggleable-arrow"
- fill={colors.LG_BLACK}
- {...{
- isUp: isOpen,
- }}
- />
</h4>
- </button>
</div>
- </div>
+ </summary>
<AccordionContainerContent
- height={height}
- isOpen={isOpen}
- ref={element}
- aria-expanded={isOpen}
>
{children}
</AccordionContainerContent>
- </div>
+ </details>
);
};
export const AccordionContainerContent = styled.div`
- max-height: ${({ isOpen, height }) => (isOpen ? height : '1')}px;
overflow: hidden;
background-color: ${colors.LG_WHITE};
transition: max-height 0.7s;
```
## Arreglando bug 2: no cargan algunos ejercicios
Esto tardó mucho más tiempo de arreglar y sinceramente no vale la pena explicarlo. El cambio es bastante simple, lo explico en inglés:
```diff
diff --git a/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx.orig b/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx
index 6d35539..66b5005 100644
--- a/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx.orig
+++ b/components/Lesson/LessonExercise/LessonExerciseItem/LessonExerciseItem.jsx
@@ -91,12 +91,20 @@ export const getExerciseMediaInputComponentByType = data => {
<MediaInputAudio data={data} />
</div>
);
+ // XXX: Here is the problem. These exercises return inputType == 'VIDEO'
+ // even though they don't have any videos (videos == []) causing some
+ // code that assumes that there is a video inside videos to fail
+ // (the MediaInputVideo component.)
case 'VIDEO':
- return (
- <div className="input-header-video">
- <MediaInputVideo data={data} />
- </div>
- );
+ // This "if" is our patch. If it isn't true, it fallsthrough to the default
+ // behaviour (returning null.)
+ if (data.content.videos.length > 0) {
+ return (
+ <div className="input-header-video">
+ <MediaInputVideo data={data} />
+ </div>
+ );
+ }
default:
return null;
}
```
## Conclusión
Más allá del desarrollo técnico que hice, creo que es más importante el político: [**el código desarrollado con dinero público debería ser público**](https://publiccode.eu/es/). Para el caso... todo el código debería ser público, pero eso es un debate para otro día.
Por otro lado, se me vienen a la mente la necesidad de testear el código para que no pasen cosas como bug 2, y también el testeo de herramientas de accesibilidad para bug 1.
[Gute Nacht!](https://gitea.nulo.in/Nulo/learngerman)

BIN
Arreglando bugs ajenos.md-details.mp4 (Stored with Git LFS) Normal file

Binary file not shown.

3
Atreus v1.md Normal file
View file

@ -0,0 +1,3 @@
![Foto del Atreus v1 de frente](Atreus%20v1.md-frente.jpg)
![Foto del Atreus v1 de atrás, exponiendo sus cables interiores](Atreus%20v1.md-atrás.jpg)

BIN
Atreus v1.md-atrás.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 KiB

BIN
Atreus v1.md-frente.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

24
Atreus v2.md Normal file
View file

@ -0,0 +1,24 @@
Take two. Hay varios problemas con mi v1:
- Se rompe muy fácil el cableado.
- La placa de arriba es de plástico, que se dobla mucho.
- Puse Outemu Blue pensando que me iban a buscar pero creo que no me gustan el ruido que hacen.
- Quiero hacer otro teclado más limpio :P
## Inspiraciones
- [Atreus 21 - DIY handwired and split keyboard](https://old.reddit.com/r/MechanicalKeyboards/comments/g0lhxs/atreus_21_diy_handwired_and_split_atreus_keyboard/) - Atreus split. Lo más interesante es que es un handwired hotswap muy limpio, este me dio la idea de hacerlo hotswap.
## Partes
Cuando hice v1 originalmente, casi no había de donde comprar switches y cosas para teclados. Lo único que encontraba era [switches Outemu en Nisuta](https://wirepc.com/producto/NSSWO). Pero en 2021 aparecieron dos empresas que importan cosas: [LatamKeys](https://latamkeys.com/) y [CYTinfo](https://www.cytinfo.com.ar/). Aparte, LatamKeys tiene un Discord activo que me ayudó diciendome donde conseguir varias cosas (como el alambre de cobre esmaltado e "impresión" de acero o aluminio).
- ¿Outemu Silent Grays? (CYTinfo)
- No se si usar unos distintos para los modificadores como en el anterior que usa Red.
- No estoy seguro que quiero. Me gustan mis Outemu Blue pero no me gusta el ruido, así que creo que quiero táctiles. Intenté brevemente unos Black, pero siento que son muy duros y no se si me gustan lineares para todas las teclas.
- ¿Hotswap sockets? Entiendo que los Kalih son compatibles con todos los switches "comunes". Me gustaría tenerlos por mi indecisión de switch.
- Arduino: reutilizar el de la v1 si lo puedo desoldar bien. Sino, tengo otro extra. Es uno chino con USB-C.
- Placa de abajo: reutilizar el de la v1 (acrílico transparente).
- Placa de arriba (switch plate): hacer una de acero inoxidable.
- Alambre de cobre esmaltado.
- Keycaps: reutilizar las de la v1, también creo que tengo de sobra.

19
BitTorrent.md Normal file
View file

@ -0,0 +1,19 @@
- [Propuesta para archivar todo el Internet Archive con BitTorrent (Archive Team)](https://wiki.archiveteam.org/index.php/INTERNETARCHIVE.BAK/torrents_implementation)
## Ideas
### Magnets/torrents reproducibles
Muchas veces pasa que se generan distintos torrents para los mismos archivos. Esto hace que la _swarm_ de peers sea distinta, causando una distribución ineficiente que hace a la red más lenta innecesariamente.
Para evitar esto, se podría hacer un estándar para generar torrents reproducibles inspirado en el [software reproducible](https://reproducible-builds.org/).
Esto se puede hacer únicamente en archivos grandes (¿>1MB?) para evitar tener muchos torrents distintos para un torrent con muchos archivos chicos como un sitio web ([[Ideas para una web distribuida]]).
Esto lo haría el programa que cree el torrent. Cuando detecta un archivo grande, lo hace un torrent separado y crea un "hipervinculo" en el torrent madre para que sepa donde está el archivo.
Esta sería una extensión incompatible con los clientes actuales ya que no descargarían automáticamente el archivo. Aunque... podría armarse el torrent separado pero también agregar el archivo al torrent madre. Lx peer que soporta esta extensión puede detectar el hipervínculo y descargarlo de ahí. A partir de eso hasta podría detectar cuando otrx peer le pide el archivo del torrent madre y servirle el del torrent separado, haciendo un uso eficiente de disco y beneficiando también a peers desactualizados.
## Clientes
- [sircmpwn/btqd](https://git.sr.ht/~sircmpwn/btqd) en Hare

10
Bluetooth.md Normal file
View file

@ -0,0 +1,10 @@
## Activar botones multimedia Bluetooth en Linux
Por alguna razón, tenemos que específicamente cargar un modulo de kernel (`uinput`) antes que el daemon de Bluetooth para que funcione.<sup>[askubuntu.com](https://askubuntu.com/a/6643)</sup>
```
# modprobe uinput
# service bluetooth restart
# # Cargar cada vez que inicia la máquina
# echo 'uinput' | tee -a /etc/modules
```

28
Bookmarklets.md Normal file
View file

@ -0,0 +1,28 @@
>Un bookmarklet es un marcador que, en lugar de apuntar a una dirección URL, hace referencia a una pequeña porción de código JavaScript para ejecutar ciertas tareas automáticamente[..]
[Wikipedia](https://es.wikipedia.org/wiki/Bookmarklet)
## Mostrar un borde rosa en todos los elementos para debuggear
```
javascript:(()=>{let style=document.head.querySelector('style#outline');if(style){style.remove()}else{style=document.createElement('style');style.id='outline';document.head.appendChild(style);style.append(`*{outline: 1px solid pink}`)}})()
```
Deestructurado:
```javascript
// Hacer un bloque que se auto-ejecuta, aislando sus variables del entorno global
(() => {
// Intentar buscar si ya aplicamos el estilo
let style = document.head.querySelector('style#outline')
if (style) {
// Si lo hicimos, borrarlo
style.remove()
} else {
// Si no, crearlo
style = document.createElement('style')
style.id = 'outline'
document.head.appendChild(style)
style.append(`*{outline: 1px solid pink}`)
}
})()
```

1
Booteables.md Normal file
View file

@ -0,0 +1 @@
- [Ventoy](https://www.ventoy.net/en/index.html): automágicamente bootea ISOs dentro de un pendrive sin tener que flashearlo cada vez

7
Boox T68.md Normal file
View file

@ -0,0 +1,7 @@
- Un ereader con software malo.
- Update.zips:
- Booxtor:
- [Reuploads a MEGA por bsnick](https://www.mobileread.com/forums/showpost.php?p=3728867&postcount=907)
- [Reupload de eso al Inernet Archive](https://archive.org/details/boox-t68-m96-booxtor-update.zip)
- [Update.zip (versión desconocida, cortesía del Internet Archive)](https://web.archive.org/web/20170706225957if_/http://www.ereader-store.de/DATA/T68/update.zip)
- [Guía de como flashear el update.zip en el caso de que se brickee (de Booxtor)](https://www.mobileread.com/forums/showthread.php?s=36252b33ca897a409c1773ae75c5cbd0&t=242726)

4
Burn Book.md Normal file
View file

@ -0,0 +1,4 @@
> El _Libro de Quemar_ es un libro creado por _Las Plasticas_ para empezar rumores, historias y chismes sobre todas las chicas (y varios chicos) que van a la _Escuela Secundaria North Shore_.
de [Mean Girls Wiki](https://meangirls.fandom.com/wiki/Burn_Book), traducción mía.

4
C.md
View file

@ -1,5 +1,9 @@
El lenguaje de programación más viejo, inseguro y aburrido.
## Críticas
- [C Is Not a Low-Level Language](https://cacm.acm.org/magazines/2018/7/229036-c-is-not-a-low-level-language/fulltext). Habla sobre como los procesadores se intentan adaptar al modelo de C en vez de cambiar el modelo de lenguaje de programación con consecuencias catastróficas (menos velocidad, Meltdown/Spectre).
## Recursos
- [Beej's Guide to C Programming](https://beej.us/guide/bgc/)

19
CHINESE GOD OIL.md Normal file
View file

@ -0,0 +1,19 @@
Término técnico para esta receta. [Viene de TikTok](https://www.tiktok.com/@foodiechina888/video/7071812170157198594). TRENDING **TOFU** RECIPE IN CHINA.
<video src="CHINESE GOD OIL.md-tiktok.h264.mp4" controls></video>
1. - Harina de almidón de maíz (maicena) (la receta pide "potato starch" pero YOLO)
- Huevos revueltos (sin cocinar lol)
2. - Ajo picado
- Cebolla de verdeo
- chili powder
- Semillas de sesamo blancas
- Aceite hirviendo
3. - Salsa de soja "liviana" (una cucharada)
- Vinagre (una cucharada)
- Sal (1/2 cucharada)
- Azúcar (1/2 cucharada)
4. Tirarle **cilantro**

BIN
CHINESE GOD OIL.md-tiktok.h264.mp4 (Stored with Git LFS) Normal file

Binary file not shown.

BIN
CHINESE GOD OIL.md-tiktok.mp4 (Stored with Git LFS) Normal file

Binary file not shown.

10
Cocina.md Normal file
View file

@ -0,0 +1,10 @@
## Sitios copados
- Inglés
- [GrimGrains](https://grimgrains.com) de [Hundred Rabbits](https://100r.co)
- [Broke Bank Vegan](https://brokebankvegan.com)
- [Internet Shaquille](https://www.youtube.com/c/internetshaquille), canal de YouTube sobre tips y de cocina y cosas
## Otras cosas
- [CookLang](https://cooklang.org/), ¡Markdown para recetas!

3
Comics.md Normal file
View file

@ -0,0 +1,3 @@
Disfruto leer comics/webtoons/manga. Acá hay un par de los que escribí algo:
- [[Not So Shoujo Love Story]]

9
DecSync.md Normal file
View file

@ -0,0 +1,9 @@
- [Repositorio GitHub](https://github.com/39aldo39/DecSync)
Es un formato para archivos con datos de calendarios, tareas, RSS, contactos y otras cosas para ser sincronizado con Syncthing o otras herramientas similares.
## Experiencia 2021-11
Intenté instalar el plugin de Radicale localmente, sin embargo estaba compilado para glibc y uso Alpine que usa musl.
Probé en un servidor con glibc, pero al sincronizar mi calendario empezó a crashear constantemente con un error de Kotlin. Me harté y configuré Radicale solo.

3
Diseño.md Normal file
View file

@ -0,0 +1,3 @@
## Links
- [What Instagram looks like after an eco-friendly makeover](https://www.fastcompany.com/90469602/what-instagram-looks-like-after-an-eco-friendly-makeover)

5
Disroot.md Normal file
View file

@ -0,0 +1,5 @@
> Algo huele mal en Disroot.
>
> Hace tiempo solicité que su servidor hubzilla bloqueara la conexión con pods fachos, se negaron. Ahora me entero que un administrador de disroot.org es antivacunas. De otro de los administradores, el hispano hablante, recuerdo su cercanía con el estalinismo y algunos comentarios transfóbicos. Lo anterior me es suficiente para abandonar esa plataforma. 🤮
[todon.nl](https://todon.nl/@tlapil/107780606192837997)

2
Email.md Normal file
View file

@ -0,0 +1,2 @@
- [Email Privacy Tester](https://www.emailprivacytester.com/)
- [Resetting credentials without email](https://cblgh.org/password-restoration/)

4
Este sitio.md Normal file
View file

@ -0,0 +1,4 @@
## Inspiración e ideas a futuro
- [Blot](https://blot.im)
- [Ten Digits](https://tendigits.space/site/home.html)

View file

@ -0,0 +1,259 @@
<small>Started writing 2022-01-01, published 2022-01-20 with help from friends.</small>
I'm a new contributor to aports/Alpine. Recently, [I took maintainership of `telegram-desktop` (and the related `tg_owt`)](https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/28864) after [upgrading it for a few versions](https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27025) and generally improving the situation of the package by using some packaged dependencies instead of bundled ones.
The MR for the change of maintainership also contained many changes to the APKBUILD with the help of psykose and mps. Along with it, I added some comments that explained where dependencies were taken from, which were bundled with the package, which were patched out, etc. This was in the hope of making it easier to check for new dependencies in newer releases. I also added a `TODO` comment [as suggested by CODINGSTYLE.md](https://gitlab.alpinelinux.org/alpine/aports/-/blob/4cded765f8b08139a36a01cdf327776571ced825/CODINGSTYLE.md#todo-comments) stating the need to eventually upgrade the package to Qt6.
Because of this, I had a conflict with mps.
I'm writing this post to have it documented publicly in the hopes that it doesn't happen again and if it does, that it can be pointed to this to show it's not a first occurrence. These types of abuse are usually lost in IRC logs and mailing list archives.
Before merging the MR, mps asked me in #alpine-devel to remove comments. I disagreed, saying that the comments were there for a good reason (this is pretty long):
<details>
<summary>IRC Log</summary>
```
2021-12-30 15:43:34 <mps> Nulo: MR is ok but please remove so much not needed comments from APKBUILD, those which are needed add to git commit msg
2021-12-30 15:44:12 <Nulo> mps, which comments do you find are not needed?
2021-12-30 15:44:41 <mps> mentioning qt6
2021-12-30 15:45:00 <Nulo> I wanted to leave info about why each dependency is bundled or not and how to easily check for new dependencies according to the wiki page (because upstream doesn't like mentioning new dependencies in changelogs)
2021-12-30 15:45:01 <psykose> qt6 comment is fine
2021-12-30 15:45:43 <Nulo> It's just one line :') and it's a TODO, I tried to follow CODINGSTYLE.md
2021-12-30 15:45:44 <mps> psykose: why it can't be fine in commit msg
2021-12-30 15:45:57 <psykose> because when someone opens the apkbuild they don't see the commit messages
2021-12-30 15:46:16 <mps> so git log is complicated
2021-12-30 15:46:32 <psykose> idk about you but i don't have the time to read the 30 prior commits of every package i touch
2021-12-30 15:46:45 <psykose> a todo: in the apkbuild is extremely clear on the other hand
2021-12-30 15:46:47 <mps> then you should
2021-12-30 15:47:36 <mps> if someone doesn't have time then s/he shouldn't work on pkg
2021-12-30 15:47:46 <psykose> it is literally the same thing but takes more time to find
2021-12-30 15:47:53 <psykose> and is more likely to be missed
2021-12-30 15:47:56 <Nulo> To be clear, I added comments because it's the sort of info I wished I had when I started "maintaining" the package. "Why is Qt6 not enabled? Should it be enabled?" (actually, that was my change, but I couldn't understand why Void had done it)
2021-12-30 15:48:02 <psykose> for absolutely no benefit aside from... saving 1 line in a 100 line file
2021-12-30 15:48:03 <psykose> get real
2021-12-30 15:48:09 <ikke> I typically put information both in comments and in the commit message
2021-12-30 15:48:46 <mps> every character saved is worth thing
2021-12-30 15:48:48 <Hello71> commit messages should be used for information that was relevant at the time, but is likely to expire soon. comments should be used for information which is likely to remain relevant
2021-12-30 15:49:11 <Hello71> "upgrade to 3.5.0" is not relevant for future readers to know
2021-12-30 15:49:24 <mps> Hello71: meh
2021-12-30 15:49:35 <mps> I disagree
2021-12-30 15:50:29 <mps> git log is invented to keep history, look at kernel git log, and I'm sure you did a lot of times
2021-12-30 15:50:40 <ikke> How often do you read all commits affecting an APKBUILD to figure out all the contexT?
2021-12-30 15:50:49 <Hello71> so in your opinion, code should never have any comments?
2021-12-30 15:51:00 <mps> ikke: often
2021-12-30 15:51:26 <psykose> Nulo: you may also now make it minsizerel
2021-12-30 15:51:41 <mps> and if I don't understand something than I use 'git log -p' always
2021-12-30 15:52:07 <ikke> But what if the comment was right there, explaining it?
2021-12-30 15:52:07 <mps> Hello71: I'm not against all comments
2021-12-30 15:52:20 <Hello71> for some projects, there is arguably reason to keep information in commits rather than source tree to save space for users who only need latest version. for aports i think this doesn't really apply
2021-12-30 15:52:42 <ikke> To me they are not mutually exclusive
2021-12-30 15:53:14 <mps> ok, I give up, do whatever you want
2021-12-30 15:53:31 <Nulo> psykose, done
2021-12-30 15:54:31 <mps> and enjoy mess
2021-12-30 15:55:22 <Nulo> psykose, https://gitlab.alpinelinux.org/Nulo/aports/-/jobs/579660#L55 lint complains about MinSizeRel, normal?
2021-12-30 15:55:34 <psykose> yeah, it will go away after atools gets a bump/container refresh
2021-12-30 15:55:36 <psykose> but it is changed
2021-12-30 15:55:56 <mps> Hello71: btw, I'm sure you meet long numbers of code where comment and code don't 'agree'
2021-12-30 15:58:18 <mps> Nulo: I removed hold label from telegram-desktop
2021-12-30 15:58:36 <Nulo> Thanks
2021-12-30 16:25:37 <Nulo> Who is "in charge" of merging this now that it has no maintainer? https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/28864
2021-12-30 16:26:10 <psykose> people with merge access
2021-12-30 16:26:18 <psykose> maintainers can't merge normally either
2021-12-30 16:26:45 <Nulo> Well, of approving it I guess
2021-12-30 16:26:51 <psykose> doesn't have to be
2021-12-30 16:27:07 <psykose> and you are the maintainer
2021-12-30 16:28:57 <PJ[m]> +1 for comments instead of commit messages, i hate deep diving git log to find context which could be done as simple comment
2021-12-30 16:51:31 <dalias> i prefer commit messages over comments because.. (1) temporal locality, to the *change* not the code. they're describing the reason for changing what is done or how it's done, and are missing context when you don't see them alongside the change
2021-12-30 16:52:38 <dalias> (2) bitrot. often when making changes, a comment that no longer applies (and that might even be misleading) is overlooked and left in place. this can't happen if it's instead attached to the immutable change it was associated with
2021-12-30 16:54:07 <dalias> (3) clutter from exaggerated impression of relevance/importance when making the change
2021-12-30 16:54:25 <dalias> and reading git log isn't a "deep dive", it's a trivial one-line command
2021-12-30 16:54:30 <psykose> i don't disagree with any of this, but the context was a TODO comment
2021-12-30 16:54:42 <psykose> of which there are 4 mentions in the musl history, and 22 in the tree
2021-12-30 16:59:50 <dalias> :)
2021-12-30 17:04:15 <Ariadne> i only use code comments for situations where i expect somebody (multiple somebodies) are going to ask about something weird
2021-12-30 17:13:00 <skarnet> code comments are for voodoo parts that aren't self-explaining
2021-12-30 17:13:11 <skarnet> (self-explanatory? English is hard.)
2021-12-30 17:56:21 <mps> nice to see that some smart people agree with me :)
2021-12-30 17:57:19 <mps> Nulo: I will merge it this time but please be more receptive what smart people say next time ;)
2021-12-30 17:58:06 <Nulo> I very much believe that Qt6 it's a voodoo part that isn't self-explanatory; but I wasn't explaining anything, I made a TODO
2021-12-30 17:58:14 <mps> Nulo: whatever we say you did a good work
2021-12-30 17:58:16 <psykose> if you think everyone that disagrees with you is a moron you are free to close the merge requests as well
2021-12-30 17:58:19 <Nulo> The other comments explain why some dependencies are bundled, etc
2021-12-30 17:58:51 <Nulo> mps, thanks <3 also huge thanks to psykose and someone else which I forgot
2021-12-30 17:59:40 <mps> psykose: yes, I have rights to do this but I don't think _everyone_ is moron, we just disagrees I think
2021-12-30 18:00:51 <mps> psykose: I prefer consistent state of alpine and I will fight for it to much higher degree
```
</details>
To me, I thought it was fine to leave the comments as many users agreed, and in the end mps was who merged the MR. However, hours later, mps deleted the comments he didn't like in an [unrelated commit](https://gitlab.alpinelinux.org/alpine/aports/-/commit/fa3e9621791ce3a36ee8b2dd463f884c7ff62be4) (fixing riscv64 builds, for which I am thankful for.) psykose pointed it out in the room:
<details id="tsc-log">
<summary>IRC Log</summary>
```
2021-12-30 22:54:59 <psykose> bypassing the maintainer to delete some todo comments is also quite poor form
snip
2021-12-30 23:08:45 <mps> psykose: ask TSC to remove me from alpine, you will make me a favor because this will save me some time and nerves
snip
2021-12-31 00:58:45 <Nulo> mps, can you *please* not bypass me just to remove some comments which you said you "gave up" on
2021-12-31 00:59:12 <Nulo> _why_ https://gitlab.alpinelinux.org/alpine/aports/-/commit/fa3e9621791ce3a36ee8b2dd463f884c7ff62be4
2021-12-31 01:08:17 <Nulo> Thank you for fixing riscv64 BTW
snip
2021-12-31 08:54:40 <mps> Nulo: there are more but please read backlog
snip
2021-12-31 12:52:05 <Nulo> mps, I believe I've read the backlog, what did I miss?
2021-12-31 12:56:55 <Nulo> I don't want to remove you TSC, especially because I have no power to do that. I want to solve this situation without stepping on each other
2021-12-31 12:57:52 <Nulo> When you proposed to remove the comments, I (and other folks) generally disagreed. Instead of accepting that, you merged my changes and then removed them in an unrelated commit, I guess in hope that I wouldn't notice
2021-12-31 13:17:51 <mps> Nulo: do you really-really think comment '# disable jemalloc' belong to APKBUILD
2021-12-31 13:19:47 <Nulo> It is relevant because the list of dependencies (the wiki page link which you deleted) had jemalloc as a dependency, but we are patching it out instead. It provides an explanation as of to why that dependency wasn't in the list.
2021-12-31 13:23:36 <mps> git commit msg servers this
2021-12-31 13:36:47 <mps> Nulo: you should follow alpine best practice and not introduce 'featurism' from other distros
2021-12-31 13:37:13 <Nulo> mps, ?
2021-12-31 13:37:15 <mps> and not only you but also other newcomers to alpine
2021-12-31 13:38:42 <Nulo> What is featurism?
2021-12-31 13:38:50 <valerius> when you try to become Debian
2021-12-31 13:39:49 <Nulo> AFAIK I'm following best practices according to CODINGSTYLE.md and the only other distro I have ever contributed to was Void
2021-12-31 13:39:54 <mps> or windows/macos even ;)
2021-12-31 13:40:25 <orbea> comments, the slipperly slope to windows....
2021-12-31 13:41:38 <valerius> some people buy the Escalade and want all the fancy features for that one trip they might or might not take one day, meanwhile they overpay for gas the entire time they own it
2021-12-31 13:41:43 <valerius> the same people choose a heavy distro
2021-12-31 13:42:36 <valerius> meanwhile, practical people choose things that do what needs to be done and nothing else
2021-12-31 13:43:02 <Nulo> We are talking about... code comments, no?
2021-12-31 13:43:14 <Nulo> To be specific, about 5 lines of comments
2021-12-31 13:43:26 <mps> Nulo: yes
2021-12-31 13:44:06 <ikke> It doesn't matter if the application wipes your harddrive, as long as there are no superfluous comments
2021-12-31 13:44:09 <mps> only important notes goes to APKBUILD comment
2021-12-31 13:45:53 <mps> and be assured that I will remove all superfluous things I see
2021-12-31 13:46:48 <skarnet> abuild is written in shell, so comments impede run-time performance!
2021-12-31 13:47:27 <mps> we made a BIG mistake with one of infra decision when accepted 'something' on which we agreed post mortem that was bad
2021-12-31 13:47:56 <skarnet> that's not what post mortem means, but I suppose you wrote it on purpose :P
2021-12-31 13:48:15 <mps> skarnet: good conclusion
2021-12-31 13:52:00 <Nulo> The wiki seems to link to no-longer-existent forums in the sidebar
2021-12-31 13:52:38 <mps> wiki should be removed as was forum long ago
2021-12-31 13:59:59 <Nulo> Whatever, I'm leaving this room for now. I don't want to deal with this bullshit
# I leave the room
2021-12-31 14:01:21 <mps> please don't use bad words here
snip
2021-12-31 14:11:03 <ikke> mps: Was it worth it to scare Nulo away?
snip
2021-12-31 14:11:48 <mps> ikke: I don't have answer, and my intention is not to 'scare' anyone
snip
2021-12-31 14:13:02 <mps> ikke: I just want alpine to be 'small, simple, secure'
2021-12-31 14:13:52 <mps> ikke: if these are not our 'goals' anymore I can stop
2021-12-31 14:14:41 <orbea> mps: to be frank you achvieved none of those with this
2021-12-31 14:14:48 <orbea> *achieved even
2021-12-31 14:15:18 <mps> orbea: yes, I know, you are right, but I still trying :)
2021-12-31 14:16:02 <mps> 'hope dies last'
```
</details>
Then, mps [upgraded the package](https://gitlab.alpinelinux.org/alpine/aports/-/commit/d8f83f325691d77f135f725a799f2afd5d7fd2da) even though I already had an [MR open](https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/29040) with the change. This is presumably because the MR also reintroduced the comments. It was also marked as a draft because I wanted to ask if it made sense to reintroduce the comments or not.
I was told that by Ariadne later on (see below) that I should assume that the upgrade was made in good faith, but I have no reason to believe that as mps hadn't touched the package in over a year (as far as I can tell), I had already sent an MR and he had told me a few days ago to specifically open an issue to upgrade a package to notify the maintainer instead of just sending an MR:
<details>
<summary>IRC Log</summary>
```
2021-12-25 14:50:23 <Nulo> Any reason 3.15 doesn't have foot 1.10.3 (as opposed to 1.10.1)? Should I send a patch?
2021-12-25 14:51:33 <ikke> It's up to the maintainer to make sure packages in stable releases are updated as well
2021-12-25 14:52:58 <Nulo> amk, come thru
# amk is the current maintainer of foot
2021-12-25 14:59:16 <Nulo> https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/28849 Is this fine? I cherrypicked commits from master
2021-12-25 15:00:49 <mps> do we backport packages to stable without reason (bug or secfix)
2021-12-25 15:01:10 <mps> ikke: ^
2021-12-25 15:03:27 <ikke> Mostly up to the maintainer. We don't refuse updates just because no one reported a bug (barring our general stable release policies)
2021-12-25 15:04:13 <mps> hmm, I disagree with 'policy'
2021-12-25 15:04:19 <Nulo> There is a reason, I'm stumbling upon a bug which has been fixed according to upstream (crashes)
2021-12-25 15:04:22 <mps> with this*
2021-12-25 15:04:57 <mps> Nulo: then you should create issue first and assign it to maintainer
2021-12-25 15:05:23 <ikke> mps: burocracy
2021-12-25 15:05:35 <mps> ikke: or chaos ;p
2021-12-25 15:06:00 <Nulo> Yeah I'm a bit confused as of to why I would need to do that. Maintainer already made those changes on edge, I'm just reapplying in 3.15
2021-12-25 15:07:00 <psykose> almost done going through the whole list of py3.10 stuff
2021-12-25 15:07:12 <mps> Nulo: I told above, backport to stable only if bug or security fixed, and in exceptional cases something really is needed
2021-12-25 15:07:34 <ikke> How about fixing bugs before users run into them?
2021-12-25 15:07:35 <psykose> those foot releases fixed some bugs
2021-12-25 15:08:01 <Nulo> I just said, it fixed some issues that I'm stumbling upon. Check the CHANGELOG: https://codeberg.org/dnkl/foot/src/branch/master/CHANGELOG.md#1-10-3
2021-12-25 15:08:15 <mps> that is not problem, maintainer should be first informed
2021-12-25 15:10:04 <Nulo> They are automatically informed by algitbot; https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/28849 has been assigned to the maintainer
2021-12-25 15:10:21 <mps> ikke: 'fixing bugs before users run into them?' are you dreaming :)
2021-12-25 15:13:14 <ikke> No, but upstream apparently already got bugreports and made new releases fixing them
2021-12-25 15:13:31 <ikke> Why should we by policy wait for users to report these bugs to us before we fix them?
2021-12-25 15:14:20 <omni> I don't get it either
2021-12-25 15:14:26 <mps> imo maintainer should be informed
2021-12-25 15:14:33 <ikke> Sure
2021-12-25 15:14:45 <ikke> but that does not necessarily have to happen by a separate issue
2021-12-25 15:15:34 <ikke> like Nulo said, maintainers already get notified when an MR is opened for their package
2021-12-25 15:15:44 <mps> well, I create MR and maintainer is auto assigned but s/he is offline for some time and you blindly merge it
2021-12-25 15:16:03 <omni> not blindly, I don't think
2021-12-25 15:16:16 <omni> a lot of packages are updated without involvment of the maintainer and if it wouldn't be like that many packages would be very outdated
2021-12-25 15:16:18 <mps> i see this as potential problem
```
</details>
I find this in the scope of the [Code of Conduct](https://alpinelinux.org/community/code-of-conduct.html), as it is pretty unwelcoming of my work to be constantly bypassed as a package maintainer while being told by the same person that maintainers should be aware of modifications made to their packages.
Because of this, I asked in #alpine-devel who was willing to act as a "neutral third-party" as that's what was stated in the CoC for conflict resolutions. mps was kind enough to give his opinion:
<details>
<summary>IRC Log</summary>
```
2022-01-01 20:23:20 <Nulo> I've sadly ended up in a conflict about Alpine. The CoC suggests to "work through the conflict using a neutral third party in a transparent manner", how would that work? Thanks
2022-01-01 20:23:55 <mps> use common sense
snip
2022-01-01 20:25:47 <mps> when I joined alpine I'm told by 'elders' to use common sense as best thing
```
</details>
Soon after that, Ariadne privately messaged me asking me about the situation. She first told me that I should report it to the Technical Steering Comittee, but I was told a few moments later that apparently mps "does not want to waste the TSC's time with [my] dispute." This is ironic as he [previously](#tsc-log) explicitly told psykose to report it to the TSC.
She then asked me if restoring the deleted comments would be an acceptable outcome. I said no, because the problem wasn't that mps removed some comments. The problem was that mps bypassed me as a maintainer twice, making changes which he was explicitly told not to. <mark>This is the kind of unwelcoming behavior that turns people away from free software communities</mark>. I was then told that there was no interest in kicking out mps from the project, and that she had spoken with mps for him to stop this behavior.
I for one don't believe that someone can change their behavior which they repeated many times can change it by being told not to one hour after they last did it. In fact, I don't think mps understood the problem at all:
```
2022-01-05 08:42:03 <mps> I don't dare to do NMU merge anymore, risking to be called by TSC :)
```
The problem wasn't the Non Maintainer Update, the problem was the intent behind it. And that wasn't the thing that caused me to report it, it was multiple occurrences of similar situations. Even then, [mps did it again](https://gitlab.alpinelinux.org/alpine/aports/-/commit/94bd1055a16156933ab982ad419b1f112b9347e3) updating the package to a pre-release version (telegram-desktop versioning scheme is weird) and acted offended in IRC afterwards:
<details>
<summary>IRC Log</summary>
```
2022-01-17 09:55:20 <mps> which if these lines 7 or 8 are maintainer comment here https://git.alpinelinux.org/aports/tree/community/telegram-desktop/APKBUILD#n7
2022-01-17 09:55:27 <mps> s/if/of/
2022-01-17 09:55:28 <alpine-meetbot> mps meant to say: which of these lines 7 or 8 are maintainer comment here https://git.alpinelinux.org/aports/tree/community/telegram-desktop/APKBUILD#n7
2022-01-17 09:56:01 <mps> I think I will be attacked again if I fix this ;)
2022-01-17 10:05:14 <Misthios> 2 version?
2022-01-17 10:07:10 <mps> or maintainer comment
2022-01-17 10:07:52 <mps> jk, ofc
2022-01-17 10:14:13 <psykose> that just looks like an oversight with two pkgvers
2022-01-17 10:14:37 <psykose> not sure why you are acting like a child again, but there is no issue with deleting an obviously duplicated pkgver
2022-01-17 10:14:48 <ikke> Probably badly resolved conflict
2022-01-17 10:15:11 <psykose> yeah
2022-01-17 10:18:21 <mps> psykose: please be careful with your words
2022-01-17 10:20:08 <psykose> i am
2022-01-17 10:20:51 <mps> don't talk with me like this!
```
</details>
Yes, that was an an oversight of my part but also of mps (he merged my changes.) I had already noticed that and had fixed it locally, waiting for a new release of telegram-desktop to commit it.
I understand that the TSC doesn't want to kick him out; mps currently maintains 82 packages, and I'm sure he does much more in the project. My objective is, instead, to make sure Alpine is a community that welcomes contributions. To this end, I can only think that this means detecting problematic behavior as this one, and possibly kicking people out (or, at least, preventing it from happening.) This is not just about mps.
Just reading the logs and seeing what he did should make it clear that he's being an asshole. I hope it's clear that I'm acting in good faith. It's wild to me how the only way to make him stop bypassing me was to report this as a CoC misconduct, even though this happened publicly in front of OPs in #alpine-devel. Even though they answered and disagreed, they didn't stop mps from doing what he did, and speaking like he did.
Frankly, I don't want to end this on a bad note. I like Alpine as a project, and apart from mps, everyone has been nothing but nice. However, I don't feel that the response I got goes anywhere as the TSC aren't interested in making any change. That makes me uncomfortable.
- [December 2021 #alpine-devel logs](https://irclogs.alpinelinux.org/%23alpine-devel-2021-12.log)
- [January 2022 #alpine-devel logs](https://irclogs.alpinelinux.org/%23alpine-devel-2022-01.log)

View file

@ -0,0 +1,11 @@
Hay varias empresas que hacen prototipado de PCBs en baja cantidad. Pueden servir para hacer [[Teclados mecánicos]].
## China
- [JLCPCB](https://jlcpcb.com)
## Argentina
- [2GTECH](https://2gtech.com.ar)
- [MayerPCB](https://www.mayerpcb.com) (tienen cotizado automático online)
- [Eleprint](https://eleprint.com.ar)

2
Facebook.md Normal file
View file

@ -0,0 +1,2 @@
- [Stop Using Facebook](https://txti.es/stopusingfacebook)
- [Hilo](https://merveilles.town/@rostiger/107739200494411589)

1
Formatos de texto.md Normal file
View file

@ -0,0 +1 @@
- [text/enriched MIME Content-type (RFC1523)](https://datatracker.ietf.org/doc/html/rfc1523)

9
Fuck WebRTC.md Normal file
View file

@ -0,0 +1,9 @@
Una de esas tecnoutopías de usar tecnologías del amo para desmantelar el amo.
> Las herramientas del amo nunca desmantelarán la casa del amo.
WebRTC está diseñado para hacer conexiones entre computadoras directamente para reducir latencia y no tener que pasar innecesariamente por un servidor para cosas como video/llamadas. Algunas personas piensan que es una buena idea usar esta tecnología para hacer que la web sea distribuida usando los mismos navegadores de siempre.
No funciona. No conozco ninguna cosa que use [WebTorrent](https://webtorrent.io) como método principal de distribución de cosas que funcione. [_Change my mind_](https://knowyourmeme.com/memes/steven-crowders-change-my-mind-campus-sign).
Previamente, [queríamos libertad en la nube y lo único que conseguimos fue una web más compleja](https://fauno.endefensadelsl.org/Quer%C3%ADamos-libertad-en-la-nube-y-lo-%C3%BAnico-que-conseguimos-fue-una-web-m%C3%A1s-compleja/). Al estilo del ["te lo dije" de jwz](https://www.jwz.org/blog/2021/01/i-told-you-so-2021-edition/).

35
Git.md Normal file
View file

@ -0,0 +1,35 @@
- [Git es difícil](https://mastodon.sdf.org/@khm/107301080271400610)
- ["¿Como puedo confiar en esta repo de Git?"](https://anarc.at/blog/2020-03-17-git-gpg-verification/) de Anarcat (en inglés)
## Diffs útiles con [delta](https://github.com/dandavison/delta)
- `apk add delta less`
- `~/.gitconfig`
```
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
light = true # Cambiar a dark si se usa tema oscuro
navigate = true # use n and N to move between diff sections
[merge]
conflictstyle = diff3
[diff]
colorMoved = default
```
## Encontrar que commit eliminó algo
```
git log -S <string> archivo
```
[StackOverflow](https://stackoverflow.com/a/4404551)
## Borrar archivos sin trackear
```
git clean
```

10
Gitea.md Normal file
View file

@ -0,0 +1,10 @@
## Cachear avatares
Por defecto, Gitea no manda ETags en los avatares entonces no se cachean. Esto hace que el sitio sea difícil de usar en conexiones lentas. Como las URLs de los avatares son hashes, podemos decirle al navegador que son inmutables ya que si cambia el avatar la URL va a cambiar. Entonces podemos agregar esto a nuestra configuración de nginx, después del bloque `location` normal:
```
location /avatar {
add_header Cache-Control immutable;
proxy_pass http://localhost:3000; # o la URL a tu Gitea
}
```

1
HTML.md Normal file
View file

@ -0,0 +1 @@
- [HTMHell](https://www.htmhell.dev/) (inglés): Ejemplos de errores de accesibilidad y como arreglarlos

View file

@ -0,0 +1,24 @@
## IPFS
En su estado actual, tiene serios problemas técnicos que impiden su uso para el día a día, especialmente para hosts pequeños (ej, [Sutty](https://sutty.coop.ar) o este mismo sitio).
- Es lento y muchas veces no encuentra a lxs peers.
- Esto es aún peor con IPNS (básicamente DNS pero distribuido con llaves) ya que necesita conseguir N confirmaciones de distintos peers para asegurarse que tiene la versión actualizada y no una vieja.
- El daemon (go-ipfs) usa mucha CPU y (según leí, no lo medí) mucho tráfico de red.
- Leí que las distintas implementaciones ({go,js}-ipfs) todavía no interoperan.
- El desarrollo está financiado por organizaciones que creen en los criptopatacones (Filecoin y otras cosas como Ethereum/Web3/NFTs).
## [[BitTorrent]]
- El protocolo funciona pero quizás sea un poco lento para una web.
- Ver [[BitTorrent]] para ver ideas de como mejorarlo en general.
### Implementaciones
- Recuerdo que [ZeroNet](https://zeronet.io) usa BitTorrent para distribuir sitios.
## Otras ideas
- [Ink & Switch](https://www.inkandswitch.com/) investiga y crea tecnologías distribuidas como:
- [Peritext](https://www.inkandswitch.com/peritext/), un CRDT para un editor colaborativo rico
- [Automerge](https://automerge.org/), estructuras de datos para aplicaciones distribuidas

1
Inversiones.md Normal file
View file

@ -0,0 +1 @@
- [FAQ CEDEARs r/merval](https://old.reddit.com/r/merval/comments/lq5er8/faq_cedears_consultas_frecuentes/)

11
Lista de páginas.gen Executable file
View file

@ -0,0 +1,11 @@
#!/bin/sh
echo "<ul>"
for file in *.md; do
title="$(basename "$file" .md)"
echo "<li><a href='$title.html'>$title</a></li>"
done
for file in *.gen; do
title="$(basename "$file" .gen)"
echo "<li><a href='$title.html'>$title</a></li>"
done
echo "</ul>"

55
Menú artístico.gen Executable file
View file

@ -0,0 +1,55 @@
#!/usr/bin/env lua5.1
local m = 1
local f = 2
local tipos = {
{"Un collage", m},
{"Una intervención contrapublicitaria o contrapropaganda", f},
{"Una cerámica", f},
{"Un comic", m},
}
local temas = {
"destrucción ambiental",
"una canción",
"otra obra artística",
"el mercado inmobiliario",
"redes sociales",
}
local adjetivos = {
{"", ""},
{"feo", "fea"},
}
local random_i = 1
local function random(list)
math.randomseed((''..os.time()):reverse() + random_i)
random_i = random_i + 5
return list[math.random(#list)]
end
print("<h2>Algunas obras generadas aleatoriamente</h2><ol>")
for i=1,10 do
local tipo = random(tipos)
local tema = random(temas)
local adjetivo = random(adjetivos)[tipo[2]]
print("<li>"..tipo[1].." "..adjetivo.." sobre "..tema.."</li>")
end
print("</ol>")
print("<h2>Tipos de obra</h2><ol>")
for _, tipo in ipairs(tipos) do
print("<li>"..tipo[1].."</li>")
end
print("</ol><h2>Algunas características (opcional)</h2><ol>")
for _, adjetivo in ipairs({unpack(adjetivos, 2)}) do
print("<li>"..adjetivo[1].."/"..adjetivo[2].."</li>")
end
print("</ol><h2>Temas para la obra</h2><ol>")
for _, tema in ipairs(temas) do
print("<li>"..tema.."</li>")
end
print("</ol>")
print("<p><a href='https://gitea.nulo.in/Nulo/sitio/src/branch/ANTIFASCISTA/Men%C3%BA%20art%C3%ADstico.gen'>Código</a></p>")

View file

@ -0,0 +1,17 @@
El cerebro de los [[Teclados mecánicos]].
## Tipos
### [Arduino Pro Micro](https://www.sparkfun.com/products/12640) y sus miles de clones
![Una foto de un SparkFun Pro Micro](Microcontrolador%20(teclados%20mecánicos).md-pro-micro.jpg)
Su puerto USB suele ser muy frágil.
### [Elite-C](https://keeb.io/products/elite-c-low-profile-version-usb-c-pro-micro-replacement-atmega32u4)
Compatible con el Pro Micro. Tiene un puerto USB-C diseñado para no tener los problemas del Pro Micro.
### [nice!nano](https://nicekeyboards.com/nice-nano/)
Compatible con el Pro Micro. USB-C y Bluetooth(!).

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

1
NeoMutt.md Normal file
View file

@ -0,0 +1 @@
<https://unix.stackexchange.com/a/115321>

View file

@ -0,0 +1,3 @@
> Alerta: ¡spoilers!
Un [webtoon](https://www.webtoons.com/episodeList?titleNo=2189) comedia-romántica no-tan-shoujo. Me gusta que justamente se trata de quemar el cliché shoujo cuando al mismo tiempo es una historia de amor. Simultáneamente, su comedia ridícula e infantil lo desromantiza.

3
Nullificación.md Normal file
View file

@ -0,0 +1,3 @@
- ![Una captura de pantalla de un sitio de pasajes de avión (KAYAK) que dice "Alright! You're off to null." (¡Listo! Ya estás para ir a nulo.)](Nullificación.md-kayak.jpg)
[twitter.com/RReverser](https://twitter.com/RReverser/status/1466813271000981508)

BIN
Nullificación.md-kayak.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

1
Nutrición.md Normal file
View file

@ -0,0 +1 @@
- [Rice, beans, and the "myth" of protein combining](https://www.youtube.com/watch?v=psAlJtgeQsY)

4
OnePlus 5T.md Normal file
View file

@ -0,0 +1,4 @@
- [Encrypted + Locked + LineageOS 16.0 + MicroG on OnePlus 5T](https://github.com/rarecoil/open-dumpling)
- [Un post en r/LineageOS pesimista sobre re-bloquear bootloaders](https://old.reddit.com/r/LineageOS/comments/n7yo7u/a_discussion_about_bootloader_lockingunlocking/)
- [Otro post, específico del OnePlus 5T](https://old.reddit.com/r/LineageOS/comments/op468c/relocking_bootloader_oneplus_5t/)
- [Post de XDA con una guía](https://forum.xda-developers.com/t/11-0-official-lineageos-18-1-for-oneplus-5-5t.4173997/page-17#post-84770085)

1
PDF.md Normal file
View file

@ -0,0 +1 @@
- [Elsevier fingerprintea PDFs](https://social.coop/@jonny/107685726645817029)

5
PXE.md Normal file
View file

@ -0,0 +1,5 @@
PXE es una forma de bootear un sistema operativo a través de una red.
- [Build your own datacenter with PXE and Alpine](https://blog.haschek.at/2019/build-your-own-datacenter-with-pxe-and-alpine.html)
- [PXE on OpenWrt with a different TFTP server](https://gist.github.com/rikka0w0/4c4caac493ce682cbed9ba3e928693d5)
- [PXE boot - Alpine Linux wiki](https://wiki.alpinelinux.org/wiki/PXE_boot)

1
Permacomputación.md Normal file
View file

@ -0,0 +1 @@
- [XXIIVV](https://wiki.xxiivv.com/site/permacomputing.html)

1
Piratería.md Normal file
View file

@ -0,0 +1 @@
- [La Unión Europea retuvo un estudio que muestra que la piratería no daña las ventas](https://www.engadget.com/2017-09-22-eu-suppressed-study-piracy-no-sales-impact.html)

View file

@ -1,2 +1,11 @@
- [Software Does Not Contain Errors](https://tuukkapensala.com/files/software_does_not_contain_errors.txt)
- [Semantic Compression](https://caseymuratori.com/blog_0015)
- [Software Does Not Contain Errors](https://tuukkapensala.com/files/software_does_not_contain_errors.txt)
- [Semantic Compression](https://caseymuratori.com/blog_0015)
- [Destroy All Software](https://www.destroyallsoftware.com/screencasts), tutoriales y screencasts para hacer componentes básicos de sistemas.
- [Invisible backdoor](https://certitude.consulting/blog/en/invisible-backdoor/), el uso de caracteres Unicode invisibles o difíciles de diferenciar de otros para introducir vulnerabilidades en código.
- [Coding Interview University](https://github.com/jwasham/coding-interview-university)
- [Frugal computing: developer perspective](https://wimvanderbauwhede.github.io/articles/frugal-computing-developer/): notas sobre como hacer software más ecológico
- Hacer que los dispositivos duren más es más importante al consumo de energía (osea: soporte de software > consumo de recursos de hardware) pero las dos cosas siguen siendo importantes
- Gran parte de las emisiones del uso de software es de la infraestructura de internet
- Reducir el tráfico es importante.
- Esto no lo dice en el artículo, pero quizás reducir la _distancia_ del tráfico también importa. Ejemplo: es mejor que un dispositivo descarge cosas de un servidor en su mismo país (o en su mismo barrio) que en uno terciarizado.
- ¡Web distribuida!

View file

@ -0,0 +1,32 @@
Dos niveles:
1. Decisiones **rápidas** que son definición de horarios, aprobaciones, etc.
2. Decisiones **profundas** como aceptar clientes, cambios de procesos internos, etc.
- Canal: Zulip con menciones a @all. Estas aparecen en la pestaña de menciones en Zulip.
Como alternativa, se propone la posibilidad de hacer bots que notifiquen por otros medios (Telegram) o por privado a cada persona. Esto implica un desarrollo y vamos a evaluar el interés.
- Formato de las opciones: Se hará una encuesta con /poll [Pregunta] y luego de enviar la encuesta se agregan las opciones.
Todes pueden agregar más opciones a las encuestas. [Documentación de la funcionalidad en Zulip](https://zulip.com/help/create-a-poll)
Hay dos tipos de decisiones las si/no, y las que tienen múltiples opciones.
- Decisiones de si/no
Estas decisiones son las relativas a aprobaciones, consensos rápidos o decisiones técnicas cotidianas. Las opciones son si o no, y cada persona vota una opción.
Nivel de consenso para decisiones rápidas: **40% de les integrantes de la cooperativa (usuaries actives del Zulip) y ninguna que diga que no**. Actualmente serían necesarias 4 personas que digan que sí.
Nivel de consenso para decisiones profundas: **80% de les integrantes de la cooperativa** (actualmente 8). No tienen tiempo límite.
Si es una decisión profunda que genera amplio debate o requiere de explicaciones de más de una oración de largo, tiene que llevarse a la próxima asamblea y decidirse por consenso, aunque sea de sí o no.
- Decisiones de múltiples opciones
Estas decisiones son para definir entre diferentes opciones para resolver una situación. Por ejemplo, para definir horarios de una reunión o de la asamblea. Quien publica la encuesta puede agregar varias opciones pero luego todas las personas pueden agregar alternativas.
Tiempo límite para recibir respuestas: Las encuestas tienen un tiempo límite de 48hs para ser respondidas, pudiendo especificarse un tiempo diferente si fuera necesario. La decisión queda tomada cuando se cumple el tiempo límite y hay una opción que tiene más votos que las demás. Si hubieran dos opciones, se debe realizar otra encuesta.
Para elegirse el horario de la asamblea (la opción con más votos), se requiere que la opción elegida tenga a la mayoría (51%). Si no hay quórum, se vuelve a hacer la encuesta.

5
Python.md Normal file
View file

@ -0,0 +1,5 @@
## Instalar pip para python2
```
python2 -m ensurepip --user
```

53
SONG® Music LLC.md Normal file
View file

@ -0,0 +1,53 @@
SONG® Music LLC. es "un sello discográfico y una plataforma de distriverificacíon con sede en Nueva York, NY". Es una subsidiaria de Parent Company©.<sup>[songm.us][songm.us]</sup>
[songm.us]: https://songm.us "El sitio de SONG® Music LLC"
## NEWSONG® Pro+
El sitio para elegir donde escuchar canciones de la discográfica genera opciones exclusivas para desbloquear con "NEWSONG® Pro+".<sup>[newso.ng/musiccypher][newso.ng/musiccypher]</sup>
<figure>
<img alt="Unlock with NEWSONG® Pro+ with three options: Paulstretch this song, Pitch to Zedd and H&M In-Store Playlister" src="SONG® Music LLC.md-NEWSONG_Pro_ejemplo1.png">
<figcaption>
- "Paulestirar" esta canción ([un método de estirar una canción sin cambiarle el tono](https://manual.audacityteam.org/man/paulstretch.html))
- Pitchear a Zedd ([un productor de música famosisimo](https://es.wikipedia.org/wiki/Zedd))
- Poner en H&M
</figcaption>
</figure>
<figure>
<img alt="Unlock with NEWSONG® Pro+ with five options: Review on RateYourMusic, Rebirth in Correct Generation, Direct-to-CDJ Sync (sponsored), Create TikTok Audio (No Attribution) and thissongissick.com Premiere (sponsored)" src="SONG® Music LLC.md-NEWSONG_Pro_ejemplo2.png">
<figcaption>
- Opinar en RateYourMusic
- Renacer en la Generación Correcta
- Sincronizar Directo-a-[CDJ](https://es.wikipedia.org/wiki/CDJ) (patrocinado)
- Crear Audio de TikTok (Sin Atribución)
- Premiere en thissongissick.com (patrocinado)
</figcaption>
</figure>
<figure>
<img alt="Unlock with NEWSONG® Pro+ with three options: Sync to iPod Nano, AirDrop (Contacts Only) (sponsored) and Generate Type Beat of this audio" src="SONG® Music LLC.md-NEWSONG_Pro_ejemplo3.png">
<figcaption>
- Sincronizar a iPod Nano
- AirDrop (Solo a Contactos) (patrocinado)
- Generar Type Beat de este audio (refiriendose a cuando hacen _beats_ del tipo de unx artista o canción)
</figcaption>
</figure>
<figure>
<img alt="Unlock with NEWSONG® Pro+ with four options: Request a Masterclass from this artist, Send to Kindle (sponsored), Archive this track on Discogs.com and Guitar Tabs" src="SONG® Music LLC.md-NEWSONG_Pro_ejemplo4.png">
<figcaption>
- Pedir una Masterclass de este artista (Masterclass es una empresa en donde artistas reconocidxs pueden dar clases en línea por precios absurdos)
- Mandar a Kindle (patrocinado)
- Archivar esta pista en [Discogs.com](https://discogs.com)
- Guitar Tabs
</figcaption>
</figure>
[newso.ng/musiccypher]: https://newso.ng/musiccypher "El newso.ng de #SONGMusicCypher"

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

28
Subdivx.md Normal file
View file

@ -0,0 +1,28 @@
[Subdivx](https://subdivx.com) está desapareciendo. Acá documento nuestros esfuerzos archivándolo.
Fechas en GMT-3.
## Si querés contribuir
Estoy descargando los archivos iniciales para saber los enlaces de los subtítulos. Mientras tanto, andá preparando una maquina con buena conexión a internet y espacio en disco, idealmente con Linux.
## 2021-11-30
- Descargué todas las paginas de los subtítulos, es decir, `https://www.subdivx.com/?pg={1..5490}`. Esto sirve como indice a todas las paginas de los subtítulos y autorxs.
- 19:12 - Estoy descargando todas las paginas de los subtítulos (`https://www.subdivx.com/X6*.html`). ~~Son `548.825` en total.~~ Corregido, leer abajo.
- 19:25 - Registré `#updivx` en el IRC pirata para el proyecto.
- 21:30 - Cambia el anuncio en Subdivx para decir:
> Bueno, me convencieron, seguimos... cualquier cosa me escriben en @deifar
Seguimos archivando por las dudas.
- 22:10 - Empezamos a distribuir tareas para descargar las paginas de los subtítulos.
## 2021-12-01
- 13:35 - Descubrí que usar wget con muchas listas separadas es _mucho_ más eficiente que aria2. Descargando cosas a ~mil por segundo.
- 19:31 - Terminé de bajar todo y descomprimirlo, ahora a extraer enlaces de subtitulos para descargar. Antes dije que eran `548.825` subtitulos, pero en realidad son `548.815`; habían 10 duplicados por alguna razón.
## 2021-12-02
- 15:18 - Subdivx falla al cargar algunas paginas aleatoriamente con "Unable to Connect db". Estoy revisando si reporta el error correctamente con un código de estado HTTP.

9
Switches.md Normal file
View file

@ -0,0 +1,9 @@
Generalmente usados en los [[Teclados mecánicos]], son la parte que deja pasar una señal eléctrica si es apretado. Hay muchisimos tipos y modelos de switches. Algunos son más silenciosos, otros más fuertes, otros más "táctiles" (si se siente distinto cuando se apreta), otros más bajos, otros pesados.
Sobre la tactilidad y sonido, generalmente hay tres categorías:
- Los lineales que no tienen tactilidad y hacen poco sonido. Ejemplos: Cherry MX Red, Black
- Los tactiles que si tienen tactilidad pero hacen poco sonido. Ejemplos: Cherry MX Brown
- Los clicky que si tienen tactilidad y también hacen sonido. Ejemplos: Cherry MX Blue

12
Teclados mecánicos.md Normal file
View file

@ -0,0 +1,12 @@
Usamos nuestros teclados para usar nuestras multiples computadoras a diario. Los teclados mecánicos proveen una (subjetivamente) más cómoda interfáz. Aparte, al estar hechos de partes razonablemente accesibles, podemos hacer nuestros propios teclados para nuestras necesidades.
## Partes
Cada teclado es diferente, pero generalmente siempre tienen estas partes:
- [[Switches]]
- [[Microcontrolador (teclados mecánicos)]]
A veces tienen cosas como
- Switch de poder como [este](https://articulo.mercadolibre.com.ar/MLA-896352616-x3u-microswitch-llave-tact-switch-smd-3c-8-x55-x18-mm-htec-_JM), usado por muchos teclados inalámbricos.

2
Thinkpad X230.md Normal file
View file

@ -0,0 +1,2 @@
- [How to fix: Thinkpad X230 fails to enter sleep mode, fan keeps running](https://old.reddit.com/r/thinkpad/comments/a1mai6/how_to_fix_thinkpad_x230_fails_to_enter_sleep/) - TL;DR No usar la placa de red Intel 6205.
- [Leah Rowe: como flashear la BIOS entera de una X230 (borrando IME) *sin* un flasher externo (HDA_SDO/"pinmod")](https://twitter.com/n4of7/status/1509484333203136514)

3
VPS.md Normal file
View file

@ -0,0 +1,3 @@
## Oracle Cloud
Oracle da (2021-12-19) servidores con 24 GB de RAM y 4 cores ARM [gratis](https://www.oracle.com/cloud/free/#always-free).

1
Web.md Normal file
View file

@ -0,0 +1 @@
- [HSTS Preload](https://hstspreload.org/)

1
XMPP.md Normal file
View file

@ -0,0 +1 @@
- [Migrating trashserver.net from Prosody to Ejabberd](https://thomas-leister.de/en/migrating-trashserver-prosody-ejabberd/)

31
YouTube.md Normal file
View file

@ -0,0 +1,31 @@
## Restricciones de red
YouTube permite a lxs administradorxs de una red bloquear videos "inapropiados" (!). Este bloqueo funciona [interceptando DNS o HTTP](https://support.google.com/a/answer/6214622?hl=en). En mi caso, es DNS. Para liberarnos de la censura, podemos agregar IPs no censuradas a `/etc/hosts`:
```
172.217.173.142 youtube.com www.youtube.com m.youtube.com youtubei.googleapis.com youtube.googleapis.com www.youtube-nocookie.com
```
Otras IPs, conseguidas el 2021-11-03:
```
172.217.173.238
172.217.172.110
172.217.172.78
142.250.79.174
172.217.173.174
172.217.173.142
172.217.162.238
172.217.29.206
142.250.79.142
142.250.79.110
142.250.79.78
216.58.202.110
216.58.202.78
2800:3f0:4002:804::200e
2800:3f0:4002:813::200e
2800:3f0:4002:812::200e
2800:3f0:4002:811::200e
```
También podemos usar algo como [Piped](https://piped.kavin.rocks/) que es un proxy e interfáz alternativa de YouTube.

View file

@ -0,0 +1,92 @@
<!doctype html>
<meta charset=utf8>
<meta name=viewport content='width=device-width, initial-scale=1.0'>
<style>
body {
background: white;
color: #111;
font-family: sans-serif;
}
* {
margin: 0;
padding: 0;
}
html {
overflow: hidden;
}
#controls {
position: absolute;
}
</style>
<title>atr</title>
<div id=controls>
<div class=coso>
<label for=rect-width>rect width</label>
<input name=rect-width id=rect-width type=range min=2 max=100>
</div>
<div class=coso>
<label for=rect-height>rect height</label>
<input name=rect-height id=rect-height type=range min=2 max=100>
</div>
<div class=coso>
<label for=diff-x>diff x</label>
<input name=diff-x id=diff-x type=range min=-100 max=100 step=0.1 value=10>
</div>
<div class=coso>
<label for=diff-y>diff y</label>
<input name=diff-y id=diff-y type=range min=-100 max=100 step=0.1 value=10>
</div>
</div>
<canvas></canvas>
<script>
const canvas = document.querySelector("canvas")
const ctx = canvas.getContext("2d", {
alpha: false,
})
function resizeCanvas () {
canvas.width = window.innerWidth
canvas.height = window.innerHeight
}
window.addEventListener("resize", resizeCanvas)
resizeCanvas()
function setupInput(inputId, setFunc) {
const input = document.getElementById(inputId)
input.addEventListener('input', event => {
setFunc(parseFloat(event.target.value))
})
setFunc(parseFloat(input.value))
}
let rect = { width: 50, height: 100 }
let diff = { x: 1, y: 1 }
setupInput('rect-width', val => rect.width = val)
setupInput('rect-height', val => rect.height = val)
setupInput('diff-x', val => diff.x = val)
setupInput('diff-y', val => diff.y = val)
function draw (time) {
const i = time / 10
ctx.clearRect(0, 0, canvas.width, canvas.height)
const actualDiff = { x: diff.x / rect.width, y: diff.y / rect.height }
for (let x = 0; x < canvas.width; x += rect.width) {
for (let y = 0; y < canvas.height; y += rect.height) {
ctx.fillStyle = `hsl(${i + x/rect.width*actualDiff.x + y/rect.height*actualDiff.y}, 100%, 50%)`
ctx.fillRect(x, y, rect.width, rect.height)
}
}
window.requestAnimationFrame(draw)
}
window.requestAnimationFrame(draw)
</script>

View file

@ -1,42 +1,62 @@
#!/bin/sh
template () {
echo -n "<!doctype html>"
echo -n "<meta charset=utf-8>"
echo -n "<meta name=viewport content='width=device-width, initial-scale=1.0'>"
echo -n "<link rel=stylesheet href=drip.css>"
echo -n "<title>$1</title>"
echo "<!doctype html>"
echo "<meta charset=utf-8>"
echo "<meta name=viewport content='width=device-width, initial-scale=1.0'>"
echo "<meta name=author content=Nulo>"
echo "<meta property=og:title content='$1'>"
echo "<meta property=og:type content=website>"
if test -n "$base_uri"; then
echo "<meta property=og:url content='${base_uri}${1}.html'>"
fi
echo "<meta property=og:image content=cowboy.svg>"
echo "<link rel=stylesheet href=drip.css>"
echo "<link rel=icon href=cowboy.svg>"
echo "<title>$1</title>"
: "${inicio:=}"
if test "$mirror" = true; then
echo "<p style=color:darkred>Ojo: este sitio es un espejo (mirror). <a href=https://nulo.in>nulo.in</a> es la fuente.</p>"
fi
if test "$inicio" != true; then
echo -n "<a href=.>☚ Volver al inicio</a>"
echo "<a href=.>☚ Volver al inicio</a>"
fi
if test -n "$2"; then
echo -n "<header>"
echo -n "<h1>$1</h1>"
echo -n "<p><small>Último cambio: <time datetime='$(git log -1 --format=%ai "$2")'>$(date -d "@$(git log -1 --format=%at "$2")" '+%Y-%m-%d %H:%M')</time></small></p>"
echo -n "</header>"
echo "<header>"
echo "<h1>$1</h1>"
echo "<p><small>Último cambio: <time datetime='$(git log -1 --format=%ai "$2")'>$(date -d "@$(git log -1 --format=%at "$2")" '+%Y-%m-%d %H:%M')</time></small></p>"
echo "</header>"
fi
}
markdown () {
# TODO: hacky
cmark --unsafe "$1" \
| sed "s/<a h/<a rel='noopener noreferrer' h/gi" \
| sed 's/\[\[\(.*\)\]\]/<a href="\1.html">\1<\/a>/g'
}
outdir=build
mkdir -p $outdir
# Autocopiarnos :)
cp *.sh *.md *.css *.png *.mp4 "$outdir"
cp ./*.sh ./*.md ./*.css ./*.png ./*.jpg ./*.mp4 ./*.svg ./*.html "$outdir"
index="$outdir/index.html"
inicio=true header=false template "nulo.in" > "$index"
cmark --unsafe index.md >> "$index"
echo -n "<h2>Lista de páginas</h2><ul>" >> "$index"
markdown index.md >> "$index"
for file in *.md; do
test "$(basename "$file")" = index.md && continue
title="$(basename "$file" .md)"
outfile="$outdir/$title.html"
template "$title" "$file" > "$outfile"
cmark --unsafe "$file" >> "$outfile"
# TODO: hacky
sed -i "s/<a /<a rel='noopener noreferrer' /gi" "$outfile"
sed -i 's/\[\[\(.*\)\]\]/<a href="\1.html">\1<\/a>/g' "$outfile"
echo -n "<li><a href='$title.html'>$title</a></li>" >> "$index"
markdown "$file" >> "$outfile"
done
for file in *.gen; do
title="$(basename "$file" .gen)"
outfile="$outdir/$title.html"
template "$title" "$file" > "$outfile"
"./$file" >> "$outfile"
done
echo -n "</ul>" >> "$index"

1
cowboy.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFCC4D" d="M33 21a15 15 0 1 1-30 0 15 15 0 0 1 30 0"/><path fill="#664500" d="M25.7 25.6a.4.4 0 0 0-.5 0S21.9 28 18 28c-4 0-7.1-2.4-7.2-2.4a.4.4 0 0 0-.6.5c.1.2 2.7 4.3 7.8 4.3s7.7-4.1 7.8-4.3l-.1-.5zm-11-5.8c0 1.6-1 2.8-2 2.8s-2.1-1.2-2.1-2.8c0-1.6 1-3 2-3s2.1 1.4 2.1 3zm10.7 0c0 1.6-1 2.8-2 2.8-1.2 0-2.1-1.2-2.1-2.8 0-1.6 1-3 2-3 1.2 0 2.1 1.4 2.1 3zM32 6c-1.2 1.5-3.2 2-5 2.2-.4-1.6-1.8-7.3-4.5-7.3-2.4 0-3.3 1-4.5 1-1.2 0-2.1-1-4.5-1-2.7 0-4.1 5.7-4.4 7.3C7 8 5 7.6 4 6 1.8 3.5-1 5.4.4 8.3 2.7 12.8 8.2 16 18 16s15.3-3.2 17.6-7.7C37 5.4 34.2 3.5 32 6.1z"/><path fill="#825D0E" d="M21.5 3C19.6 3 19 4 18 4s-1.6-1-3.5-1C12 3 11 9.8 11 9.8s1.3 2.2 7 2.2 7-2.3 7-2.3S24 3 21.5 3z"/><path fill="#664500" d="M11 6s2 2 7 2 7-2 7-2v2s-2.2 2-7 2-7-2-7-2V6z"/></svg>

After

Width:  |  Height:  |  Size: 835 B

View file

@ -1,13 +1,32 @@
:root {
--background: white;
--foreground: #111;
}
body {
background: white;
background: var(--background);
color: #111;
color: var(--foreground);
font-family: sans-serif;
max-width: 45rem;
margin: 0 auto;
margin: 0;
padding: 1rem;
}
header {
margin: 2rem 0;
text-align: center;
}
h2 {
border-bottom: var(--foreground) solid 1px;
}
img,
video {
max-width: 100%;
border-radius: 12px;
}
abbr {
@ -16,4 +35,40 @@ abbr {
pre {
overflow-x: auto;
white-space: break-spaces;
}
blockquote {
border-left: solid 3px;
border-color: #111;
border-color: var(--foreground);
margin: auto 0.5em;
padding-left: 1em;
}
ul,
ol {
padding: 0;
padding-left: 1.5rem;
padding-top: 0.5rem;
}
li {
margin: 0.5rem 0;
padding: 0 0.2rem;
}
@media (prefers-color-scheme: dark) {
body {
--background: black;
--foreground: #eee;
}
abbr {
color: lightgray;
}
a {
color: gold;
}
a:visited {
color: #ff9;
}
}

View file

@ -3,15 +3,24 @@
<p><abbr title="adjetivo">adj.</abbr> inexistente (que carece de existencia).
<small>¿pero nos importa lo que dice la RAE?</small></p>
Este es mi hogar. ¿Estás perdidx?
Este es mi hogar. ¿Estás perdidx? [[Lista de páginas]]
Algunas cosas que escribí recientemente:
- [[Arreglando bugs ajenos]]
Algunos de mis proyectos:
- [Manejador de Tareas](https://tareas.nulo.in)
- Laburos:
- [Salvá la costanera](https://salvalacostanera.com.ar), [código](https://gitea.nulo.in/Nulo/salva-la-costanera)
- Juguetes:
- [Cuarentena](https://cuarentena.nulo.in)
- [Este sitio](https://gitea.nulo.in/Nulo/sitio)
- [Este sitio](https://gitea.nulo.in/Nulo/sitio)
- Juguetes:
- [Cuarentena](https://cuarentena.nulo.in)
- [[txt2txt]]
- [Manejador de Tareas](https://tareas.nulo.in)
- Laburos:
- [Salvá la costanera](https://salvalacostanera.com.ar), [código](https://gitea.nulo.in/Nulo/salva-la-costanera)
Webamigx: [nadie@nulo.in](mailto:nadie@nulo.in) <small>no gods no webmasters</small>
<a rel="me noopener noreferrer" href="https://todon.eu/@Nulo">Mastodon</a>
> De este sitio se desprenden graves falencias tales como simbología confusa, cuestionamientos ideológicos-sociales, objetivos no adecuados al hecho estético, ilimitada fantasía...

56
timer.html Normal file
View file

@ -0,0 +1,56 @@
<!doctype html>
<meta charset=utf-8>
<meta name=viewport content='width=device-width, initial-scale=1.0'>
<link rel=stylesheet href=https://nulo.in/drip.css>
<title>Timer de guita</title>
<style>
body {
display: flex;
min-height: 100vh;
justify-content: center;
align-items: center;
padding: 0;
}
main {
text-align: center;
padding: 0 1em;
}
input {
width: 5em;
}
</style>
<main>
<h1>Guita: <span id="guita" data-guita="0">$ 0.00</span></h1>
<div>
<label for="por-hora">Guita por hora por persona:</label>
<input value="0" type="number" id="por-hora" />
</div>
<div>
<label for="personas">Cantidad de personas:</label>
<input value="1" type="number" id="personas" />
</div>
<button>Empezar</button>
</main>
<script>
const guitaEl = document.querySelector('#guita')
const porHoraEl = document.querySelector('#por-hora')
const personasEl = document.querySelector('#personas')
const buttonEl = document.querySelector('button')
let interval = null
buttonEl.addEventListener('click', event => {
if (interval) {
clearInterval(interval)
buttonEl.textContent = 'Empezar'
} else {
interval = setInterval(() => {
guitaEl.dataset.guita = parseFloat(guitaEl.dataset.guita) + (porHoraEl.value / 60 / 60) * personasEl.value
guitaEl.textContent = `$ ${parseFloat(guitaEl.dataset.guita).toFixed(2)}`
}, 1000)
buttonEl.textContent = 'Parar'
}
})
</script>

36
txt2txt.md Normal file
View file

@ -0,0 +1,36 @@
De [Copiona](https://copiona.com/proyectos/2020/05/10/txt-txt.html)
> ```
> jj un parate en nuestras acw
> m_j¯ividades, pero ni en panj¯_j
> ¯__emia generalizada mund_jwj
> ¯¯al las trabam__mjjdoras cogniwm_j
> ¯ivas dem__mjjmos de producir (y m_jw
> jjw_ en este momento de virtu___j
> ylizaci_jn_j, y el punto inter_j
> ¯¯w__ow_ante de esto es que ad_j¯¯w
> ____ms de nuestras mentes, la c
> ir¯¯w____rn_jtica utiliza los cam_j
> wj¯¯nos de internet para su j¯_j
> ¯__espliegue. _mj¯¯w____ pregunto; si w
> wyueremos parar todo y camrwj¯¯___j
> yrlo, no habr_m__mjj que parar inwj
> __j¯ernet_j¿query_os apagar inwm_j
> ¯ernet_j, estamos atrapadas
> entre nuestras herrami_j¯¯w
> ____ntas de lir¯¯w____raci_jn (aunq__yj
> ¯e ni son tan nuestras_j.
>
> _mjwj¯¯ mayor miedo es no darme cu_j¯¯w
> ____nta cuando sea el fin de mj
> ya especiey yo est_girando p
> or la ventana y apretando
> estas mec_jnicas teclas en wj
> jw_imrwj¯¯osis con las pantallas, w
> jjw_in poder apreciar el fin
> al de la civilizaci_jn.
> ```
Creo que el diccionario del script (del que derivé [mi programa](https://gitea.nulo.in/Nulo/tzt2tzt)) está desactualizado, por eso faltan cosas.