Compare commits
156 commits
07ed301ddf
...
5bce98058e
Author | SHA1 | Date | |
---|---|---|---|
5bce98058e | |||
4a65f90f65 | |||
0e58837f4c | |||
44ccc141c7 | |||
e9865615cd | |||
dec52415bc | |||
8a006a2d89 | |||
0db0f0bc24 | |||
244c066ec1 | |||
621c22ae1c | |||
d6a542f7a6 | |||
49d83a0edb | |||
659a804ba9 | |||
92d872b134 | |||
cf0438dc3b | |||
9491a609dc | |||
e32168c4f6 | |||
182fe7e10f | |||
bb00989d59 | |||
c8d513afd9 | |||
5cfb7720de | |||
51c84dc220 | |||
5fc5c0fd8b | |||
5368a5652c | |||
5760406a1e | |||
1788e13afb | |||
f202a9e6a9 | |||
c85ab90797 | |||
44b896ce70 | |||
868b3039c5 | |||
1aca7be131 | |||
364387b902 | |||
a095d81c17 | |||
b1162e5b5a | |||
9c336e977e | |||
8fb9f89b45 | |||
c423563b7c | |||
c949de066b | |||
0879094260 | |||
5fa721d18f | |||
b2d5f35c81 | |||
7b8e8e1c65 | |||
2e5bd6988c | |||
a4774bc1f0 | |||
1c5188a6fa | |||
d518ad650a | |||
994a6da3f1 | |||
9052efb811 | |||
464da1fb47 | |||
4a37fe6562 | |||
4bb4d39e63 | |||
0406cd03b2 | |||
2409c18e5e | |||
6a1491ad31 | |||
35a7d789cd | |||
ac2545c194 | |||
37b3bc4f6e | |||
e1d382c2c9 | |||
8b974db76c | |||
9668f87750 | |||
53acb6b8d7 | |||
e19169b40d | |||
c698417eca | |||
abce15f144 | |||
eded730ad5 | |||
4ba5487d18 | |||
9ec71903d8 | |||
7841304514 | |||
f9729aab93 | |||
8fc1aa8314 | |||
9f5d36c94e | |||
02603026e8 | |||
94353e8149 | |||
566c0bc8d0 | |||
b45f0ae560 | |||
bbce98618a | |||
a786cd3b14 | |||
5002b5923d | |||
9b1a8b41e7 | |||
08a6a02b24 | |||
efd8535431 | |||
acb3afa449 | |||
622d270a92 | |||
9c8be87927 | |||
54da2e73ab | |||
2b7b568b25 | |||
afc1a982c7 | |||
688584fa4d | |||
4a4fc40e0e | |||
eaded97726 | |||
14c94ad8e9 | |||
5a0d4a7634 | |||
64d2613b3d | |||
b99087b7d3 | |||
8dae8c64b0 | |||
b78544f8c5 | |||
435f2d9c42 | |||
5ec522e4c2 | |||
767de5e58c | |||
1ceaa80ba5 | |||
1de517f77b | |||
11429eef2c | |||
d956f6efe1 | |||
ade5b6c49b | |||
dd3301cdfa | |||
01a2dfe843 | |||
3f88b1009e | |||
7dc2d33168 | |||
a839e47606 | |||
ef3b1acf67 | |||
ccf71ff4a9 | |||
ffddd24fe0 | |||
234721f925 | |||
6271ff32e1 | |||
059c284bc8 | |||
291a3ecf87 | |||
7f4c38fb0c | |||
ae9ef9b96b | |||
7b847462f1 | |||
4251b6d70d | |||
927d0f528e | |||
61ec8db6c7 | |||
bc198e5daf | |||
b4d09a173e | |||
30f51d40ab | |||
b2ceae7d2a | |||
6983a0bc47 | |||
610ecb04ef | |||
fa55d4a140 | |||
a879027c81 | |||
facfe569e1 | |||
ba8d00b2d5 | |||
d7f19ac302 | |||
c761c729eb | |||
4629391408 | |||
cff655085d | |||
e41da81bac | |||
8d20f25f0a | |||
1312303da9 | |||
67edc3e1b2 | |||
bff00c8e0c | |||
2657959789 | |||
f3b5039e5d | |||
7fe3139558 | |||
d77b17e9e2 | |||
9ae42a73a8 | |||
1b0edbf42c | |||
867fe67d53 | |||
34d9d8134f | |||
d74c32321b | |||
f16745d9ad | |||
a439056607 | |||
266728fbf3 | |||
78ed5db561 | |||
118d147835 | |||
075782e988 |
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
|
@ -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:
|
||||
|
|
7
2022-06-08 Necesitamos seguridad colectiva.md
Normal 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
|
@ -0,0 +1,2 @@
|
|||
- [@nametheblue en Twitter](https://twitter.com/nametheblue)
|
||||
|
1
Alimentación.md
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||
```
|
2
Antiderechos de autorx.md
Normal 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
|
@ -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
3
Atreus v1.md
Normal 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
After Width: | Height: | Size: 533 KiB |
BIN
Atreus v1.md-frente.jpg
Normal file
After Width: | Height: | Size: 225 KiB |
24
Atreus v2.md
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
BIN
CHINESE GOD OIL.md-tiktok.mp4
(Stored with Git LFS)
Normal file
10
Cocina.md
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -0,0 +1,4 @@
|
|||
## Inspiración e ideas a futuro
|
||||
|
||||
- [Blot](https://blot.im)
|
||||
- [Ten Digits](https://tendigits.space/site/home.html)
|
259
Experiencing harmful behavior in Alpine.md
Normal 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)
|
||||
|
11
Fabricación de circuitos impresos.md
Normal 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
|
@ -0,0 +1,2 @@
|
|||
- [Stop Using Facebook](https://txti.es/stopusingfacebook)
|
||||
- [Hilo](https://merveilles.town/@rostiger/107739200494411589)
|
1
Formatos de texto.md
Normal file
|
@ -0,0 +1 @@
|
|||
- [text/enriched MIME Content-type (RFC1523)](https://datatracker.ietf.org/doc/html/rfc1523)
|
9
Fuck WebRTC.md
Normal 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
|
@ -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
|
@ -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
|
@ -0,0 +1 @@
|
|||
- [HTMHell](https://www.htmhell.dev/) (inglés): Ejemplos de errores de accesibilidad y como arreglarlos
|
24
Ideas para una web distribuida.md
Normal 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
|
@ -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
|
@ -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
|
@ -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>")
|
17
Microcontrolador (teclados mecánicos).md
Normal 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(!).
|
BIN
Microcontrolador (teclados mecánicos).md-pro-micro.jpg
Normal file
After Width: | Height: | Size: 184 KiB |
1
NeoMutt.md
Normal file
|
@ -0,0 +1 @@
|
|||
<https://unix.stackexchange.com/a/115321>
|
3
Not So Shoujo Love Story.md
Normal 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
|
@ -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
After Width: | Height: | Size: 29 KiB |
1
Nutrición.md
Normal 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
|
@ -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
|
@ -0,0 +1 @@
|
|||
- [Elsevier fingerprintea PDFs](https://social.coop/@jonny/107685726645817029)
|
5
PXE.md
Normal 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
|
@ -0,0 +1 @@
|
|||
- [XXIIVV](https://wiki.xxiivv.com/site/permacomputing.html)
|
1
Piratería.md
Normal 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)
|
|
@ -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)
|
||||
- [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!
|
||||
|
|
32
Protocolo de toma de decisiones Sutty v0.1.md
Normal 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
|
@ -0,0 +1,5 @@
|
|||
## Instalar pip para python2
|
||||
|
||||
```
|
||||
python2 -m ensurepip --user
|
||||
```
|
53
SONG® Music LLC.md
Normal 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"
|
BIN
SONG® Music LLC.md-NEWSONG_Pro_ejemplo1.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
SONG® Music LLC.md-NEWSONG_Pro_ejemplo2.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
SONG® Music LLC.md-NEWSONG_Pro_ejemplo3.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
SONG® Music LLC.md-NEWSONG_Pro_ejemplo4.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
28
Subdivx.md
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -0,0 +1 @@
|
|||
- [HSTS Preload](https://hstspreload.org/)
|
1
XMPP.md
Normal 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
|
@ -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.
|
92
aaaaaaaaaaaaaaaaaaaaaaaaaaarainbow.html
Normal 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>
|
58
build.sh
|
@ -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
|
@ -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 |
57
drip.css
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
17
index.md
|
@ -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:
|
||||
|
||||
- [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)
|
||||
- Juguetes:
|
||||
- [Cuarentena](https://cuarentena.nulo.in)
|
||||
- [Este sitio](https://gitea.nulo.in/Nulo/sitio)
|
||||
|
||||
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
|
@ -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
|
@ -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.
|
||||
|
||||
|