diff --git a/cached-feeds/brunoscheufler.xml b/cached-feeds/brunoscheufler.xml index 08ec319..65236a7 100644 --- a/cached-feeds/brunoscheufler.xml +++ b/cached-feeds/brunoscheufler.xml @@ -6,10 +6,80 @@ Blog posts by Bruno Scheufler en-us - Wed, 30 Aug 2023 20:10:09 GMT - Wed, 30 Aug 2023 20:10:09 GMT + Sun, 17 Dec 2023 20:59:05 GMT + Sun, 17 Dec 2023 20:59:05 GMT 60 + + Learning to enjoy trying new things and looking stupid + https://brunoscheufler.com/blog/2023-12-17-learning-to-enjoy-trying-new-things-and-looking-stupid + Sun, 17 Dec 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-12-17-learning-to-enjoy-trying-new-things-and-looking-stupid + + + + On Competition + https://brunoscheufler.com/blog/2023-12-10-on-competition + Sun, 10 Dec 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-12-10-on-competition + + + + Recording Better Demos + https://brunoscheufler.com/blog/2023-12-03-recording-better-demos + Sun, 03 Dec 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-12-03-recording-better-demos + + + + On Distraction and Procrastination + https://brunoscheufler.com/blog/2023-11-26-on-distraction-and-procrastination + Sun, 26 Nov 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-11-26-on-distraction-and-procrastination + + + + Product Versioning for Fast-Moving Teams + https://brunoscheufler.com/blog/2023-11-20-product-versioning-for-fast-moving-teams + Mon, 20 Nov 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-11-20-product-versioning-for-fast-moving-teams + + + + Setting up Hosted macOS GitHub Actions Workflows for Electron Builds + https://brunoscheufler.com/blog/2023-11-12-setting-up-hosted-macos-github-actions-workflows-for-electron-builds + Sun, 12 Nov 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-11-12-setting-up-hosted-macos-github-actions-workflows-for-electron-builds + + + + Releasing Electron apps for macOS + https://brunoscheufler.com/blog/2023-11-05-releasing-electron-apps-for-macos + Sun, 05 Nov 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-11-05-releasing-electron-apps-for-macos + + + + Syncing State between Electron Contexts + https://brunoscheufler.com/blog/2023-10-29-syncing-state-between-electron-contexts + Sun, 29 Oct 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-10-29-syncing-state-between-electron-contexts + + + + Go Embeds and JSON + https://brunoscheufler.com/blog/2023-10-22-go-embeds-and-json + Sun, 22 Oct 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-10-22-go-embeds-and-json + + + + Looking back on a decade in software engineering + https://brunoscheufler.com/blog/2023-09-03-looking-back-on-a-decade-in-software-engineering + Sun, 03 Sep 2023 18:00:00 GMT + https://brunoscheufler.com/blog/2023-09-03-looking-back-on-a-decade-in-software-engineering + + Building Canvas-Based Web Applications https://brunoscheufler.com/blog/2023-08-30-building-canvas-based-web-applications diff --git a/cached-feeds/copiona.xml b/cached-feeds/copiona.xml index f13dd85..d7b3634 100644 --- a/cached-feeds/copiona.xml +++ b/cached-feeds/copiona.xml @@ -1,106 +1,284 @@ -Jekyll2023-08-29T19:11:49-03:00/feed.xmlcopiona.com | un bunker biteario de @librenautaprocess [╭╭╯╭╯╭╭╯╭╯]2023-08-28T00:00:00-03:002023-08-29T10:20:21-03:00/process -

-]]>
Librenauta
Log 0212023-07-15T00:00:00-03:002023-07-16T11:30:05-03:00/log-21 -
  • rayos solares contemporaneos
  • -]]>
    librenauta
    Qué lenguaje hablan las cosas del mundo [LIC]2023-07-07T00:00:00-03:002023-07-07T10:20:21-03:00/que-lenguaje-hablan-las-cosas-del-mundo-licDespués de cruzar ideas con MAQ en barcelona, quedamos en contacto para poder pensar algo en conjunto ya que veíamos que tenemos algunas perspectivas similares sobre cómo leer cosas del mundo~.

    -

    MAQ tiene una visión transversal del sonido y la performance. Queríamos hacer algo que pueda inundar el espacio de transformación: sonido y gráfica

    -

    Gracias a la invitación de Andrés Belfanti a exponer en Ramos Generales pudimos ponernos a pensar algo para la muestra: ¿Qué lenguajes hablan las cosas del mundo?

    -

    Acá un registro de lo que hicimos con varias imagenes y videos de Aina :

    -
    - -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    ]]>
    MAQ && Librenauta
    internet es un intercambio de besos entre dispositivos2023-06-19T00:00:00-03:002023-06-19T13:20:21-03:00/internet-es-un-intercambio-de-besos-entre-dispositivosAquí para descargar Stickers en formato A3 para imprimir de: internet-es-un-intercambio-de-besos-entre-dispositivos

    ]]>
    Librenauta
    Log 0202023-04-08T00:00:00-03:002023-04-08T17:30:05-03:00/log-20 -
  • mirar el movimiento, se escapa de nuestros músculos
  • -]]>
    librenauta
    Risografía - internet es una poesía sin terminar2023-04-08T00:00:00-03:002023-01-23T20:20:21-03:00/internet-es-una-poes%C3%ADa-sin-terminarViajé a barcelona y unos días antes pude contactarme con dotheprint un pequeño estudio de impresión de risografía para hacer algunas copias locales. La verdad no sabía muy bien como sería el resultado de la impresión asi que me vi unos tutoriales de como generar cada capa en youtube color por color y mande a imprimir un fanzine que diseñe en viaje llamado: internet es una poesía sin terminar

    +Jekyll2023-11-10T17:45:40-03:00/feed.xmlJardín web de @librenautaAirtemis [antología]2023-11-06T00:00:00-03:002023-11-06T00:00:00-03:00/airtemisAirtemis [Antologia] +

    ¿cómo sonaría un mazazo contra un servidor corporativo?

    -

    Un poco engloba cuál es la internet que quiero y por qué :F

    +

    por faquistan

    -

    internet-es-una-poesía-sin-terminar

    -
    -

    acá se puede puede bajar el pdf para leerlo online e irpimirlo [formato A3]

    -

    acá una version en formato magenta y negro para poder imprimir en láser [formato A3]

    -

    acá se pueden bajar un .zip con los archivos separados por color para imprimir en risografía.

    -

    Acá una muestra de las capas, el diseño esta hecho en inkscape en 2 colores + opacidades y luego procesado en gimp separando cada color en una máscara y exportandolo :D

    -

    Es importante saber que la máquina de risografía sólo lee valores en escala de grises. por eso las placas siguientes están en negro, el color lo aplica cuando imprime cada tambor. ∩`-´)⊃━( . °°. )

    ]]>
    Librenauta
    EU-librenauta2023-03-15T00:00:00-03:002023-01-20T20:20:21-03:00/EU-librenautaRoadtrip
    -

    tiempo: [16.03.2023] al [30.04.2023]

    +

    «las circunstancias hacen al sujeto en la misma medida en que éste hace a las circunstancias» +Marx & Engels, La ideología alemana.

    +

    Hace un tiempo tuvimos en Awkache un encuentro de autoformación en torno a la novedad tecnológica del momento: la Inteligencia Artificial, y el impacto que esta puede tener en el trabajo cultural. A mí me tocó estudiar sobre el movimiento luddita, y a partir de mi scrolleo curioso y degustativo sobre un puñado de resultados de búsqueda en internet, empecé a maquinar una serie de reflexiones que me gustaría compartir.

    +

    El movimiento surgió en el climax de la llamada Revolución Industrial (en Inglaterra, durante las primeras décadas del siglo XIX). Se dieron allí, entre otros, dos fenómenos simultáneos que me interesa destacar: aparece el proletariado urbano, a través de la proletarización forzosa de campesinos y artesanos, mediante el despojo de las tierras de los primeros y la destrucción de las condiciones económicas de los segundos; y la revolución de la técnica, que aceleró como nunca antes los tiempos de producción. El movimiento luddita estuvo formado por gente de la periferia de Londres que estaba siendo forzosamente urbanizada, y que a modo de protesta, salió a romper las nuevas máquinas de los empresarios textiles. Se juntaban a la noche, cuando nadie los veía, y destruían los equipos a mazazos; incluso algunas veces prendían fuego las fábricas. No tenían demandas precisas y su líder era un personaje ficticio, que se habían inventado para distraer a la policía: King Ludd o Ned Ludd, quien según se decía, se encondía en el mismo bosque que Robin Hood, y a quien le deben su nombre.

    +

    Ahora bien: en ciertos sentidos comunes “cultos” se le dice luddita despectivamente a alguien acusado/a de tecnófobo/a.. Esto es falso: lzs ludditas no estaban en contra de la tecnología: la mayoría de ellzs eran hijos de artesanos o ellzs mismos lo eran y en ningún momento destruían las máquinas de sus propios talleres. Lzs ludditas destruían las máquinas ensambladas en las nuevas fábricas, no las suyas propias. No rechazaban la tecnología por sí misma, sino aquella que para ellzs ocasionaba un daño al común, en este caso a la producción artesanal de tejidos en pequeños pueblos. Recordemos que el abaratamiento de costos (y también el de salarios) suscitado por la Revolución Industrial les estaba dejando fuera de juego. +Frente a esta resistencia del pueblo, se empezó a organizar la fuerza armada interna en Inglaterra, con el fin de neutralizar esa protesta que desafiaba la propiedad privada. Así se empezaron a configurar las tareas de inteligencia que hoy son típicas en la policía: espionaje, infiltración, delación, saboteo. El objetivo era reprimir una sublevación que contaba con la participación de cientos de personas. Una vez que el movimiento fue aplastado (aquellos que fueron atrapados pasaron por el ojo de la horca), el escarnio de la sociedad moderna cayó sobre ellos como una pesada tumba de azabache. Es cierto: su lucha era imposible. Estaban tratando de detener un proceso objetivamente imparable, pero es injusto adjudicarles el carácter de tecnófobos, pues estaban lejos de serlo.

    +

    Según Christian Ferrer, lzs ludditas atacaban las máquinas y plantas industriales de su tiempo porque intuían que esta novedosa Revolución iba a desbaratar los poderes de regulación comunitaria que ellzs hasta ese momento tenían. En este punto me parece que vale la pena, sobre todo para ir acercándonos al tema que nos convoca, referirme al concepto de enajenación, desde una perspectiva materialista-histórica. Lzs ludditas de alguna manera veían, acaso por el contraste respecto de la producción artesanal, que la regulación comunitaria de la técnica se estaba enajenando hacia la valorización del capital y la producción de mercancías. Es decir, la innovación tecnológica que proponía e imponía la modernidad capitalista no estaba para producir bienes de uso, como acaso lo hacía el artesanado en relación “armónica” con su comunidad, sino valor o valor de cambio. De una manera intuitiva, lzs ludditas se sublevaron contra este proceso que separaba la actividad productiva no solo de la cobertura de las necesidades originales de su época, sino también del metabolismo entre la sociedad y su medio, para terminar depositándola en la valorización del valor. Esto es, en el enriquecimiento de la clase dominante mediante la hiper-aceleración del proceso productivo para una mejor competencia de capitales en la balanza temporal del trabajo abstracto. +Desde este ángulo, entonces, proponemos que lzs ludditas tienen menos que ver con la tecnofobia que con una crítica romántica (tan romántica que el poeta Lord Byron dirá «abajo todos los reyes menos King Ludd») a la racionalidad técnica capitalista, que no es la única racionalidad técnica posible, pero sí, como se nos hace evidente hoy, una de las menos sostenibles. No sólo a nivel ambiental sino también a nivel humano. Abriendo el largo curso crítico-melancólico de la izquierda marxista, el Herbert Marcuse de la posguerra escribe su famosa Crítica a la razón instrumental, en la que en buena medida aborda estos problemas.

    +

    Marcuse considera que, en la medida en que el desarrollo técnico-tecnológico se subsume a un proceso tan metafísico como la producción y valorización del valor, este se vuelve en contra del ser humano y de sus necesidades tanto materiales como espirituales básicas. Bajo el yugo de las relaciones de producción capitalistas, la técnica se constituye mediante una razón instrumental que es utilizada para el dominio de la naturaleza y de la sociedad. La razón social imperante se vuelve hacia un control absoluto del medio social y ambiental que garantice el estatus quo. Desde los ludditas hasta hoy, pasando por Marcuse, la enajenación de la técnica es un proceso cada vez más profundo.

    +

    Extrapolándolo a tiempos más cercanos a nuestra actualidad, pensemos en ejemplos concretos, ¿qué pasó con Internet? ¿Por qué un producto de la creatividad humana que prometía tanto liberarnos de los algoritmos sociales del orden establecido; que prometía la libertad de acceso al conocimiento, o una democratización de la expresión individual… y hasta la posibilidad de desplegarnos intelectual o artísticamente con herramientas autogestionadas, etc., devino en esta tecno-concentración oligopólica y privatizada de la vida social digital?

    +

    Hay evidentemente un problema con que el desarrollo técnico, tanto de software como de hardware, esté no sólo atado a la lógica mercantil y de la propiedad privada, sino también (y en consecuencia) a parámetros de productividad, eficiencia y demás estructuras de propaganda del régimen empresarial. De ahí que la utopía digital haya decantado en este espacio virtual dominado por la economía de la atención, la hipervigilancia, la masiva concentración de recursos financieros y técnicos por parte de las bigtechs, algoritmos personalizados para garantizar la retroalimentación de contenidos en cámaras de eco y burbujas de filtro que limitan la diversidad de perspectivas; o la centralización de datos usada para dirigir la publicidad, influir en las opiniones y comportamientos de los usuarios, y tomar decisiones basadas en datos a gran escala (la bigdata). Ocurre que, como dijo alguna vez Bolivar Echeverría, el capital se ve obligado a imprimir al aparato tecnológico y cultural un carácter ideológico cada vez más acentuado y a desatar en él una contradicción insuperable entre su función propiamente productiva (la investigación científica o artística de la realidad) y su función ideológica (la justificación del sistema).

    +

    En contraposición a esta hegemonía bestial, desde el software libre y el código abierto a la piratería y las redes sociales del fediverso, existen un montón de prácticas políticas que buscan recuperar la técnica como potencia, devolviéndole la socialización a su desarrollo y, en muchos casos, prefigurando otro internet posible. Porque, recuperando la experiencia luddita, no se trata de rechazar de plano todo avance tecnológico “por haber sido producido por el capital”. La creatividad del trabajo no se subordina de plano a su forma capitalista, sino que es imperativo arribar a una posición dialéctica: el desarrollo técnico, en tanto producto del trabajo, existe dentro de y contra su forma capitalista-mercantil, en un proceso constante de creatividad y sofocamiento, entre oposición e imposición, su curso no escapa a las relaciones de fuerza y poder de la lucha de clases. La conciencia de clase se expande desde abajo hacia los sectores más privilegiados del trabajo a través de la lucha, la confrontación y la organización políticas.

    +

    La construcción de nuestra autonomía social y política, entonces, no puede escindirse de la construcción de nuestra autonomía técnica y tecnológica, menos aún en un mundo cada vez más digitalizado. ¿O acaso son hechos aislados, a principios de los 2000s, el avance de la clase trabajadora en erráticas posiciones de poder y la socialización informática del mismo período? ¿No tienen que ver el reflujo contemporáneo de nuestras organizaciones anticapitalistas y el avance del fascismo con la mencionada tecno-concentración oligopólica de los recursos internéticos? +No se trata simplemente de expropiar los medios de producción tecnológica o volver cooperativas a las bigtechs, sino también de redebatir socialmente tanto sus funciones como la propia racionalidad social (y ambiental) de la técnica. Es decir, para qué queremos esos medios de producción, qué fines, qué sentidos y qué formas pensamos darles. Estos debates tecno-políticos no pueden escapar a nuestros intereses en tanto clase trabajadora: serán socializados, serán democráticos, o no serán nada. Porque tampoco son posibles (o deseables) por fuera de la lucha de clases y la progresiva conquista de poder de la clase trabajadora.

    +

    Solo en la medida que nuestra racionalidad técnica comienza a liberarse de las relaciones mercantiles a las que la somete el dominio del capital y su propaganda burguesa, puede empezar a forjar ideas innovadoras de socialización tecnológica. Sin perder de vista que cualquier avance técnico del trabajo, ante derrotas o reflujos políticos de nuestra clase, puede ser cooptado, reconfigurado y subsumido a las relaciones capitalistas y la concentración de poder empresarial… tal como viene pasando. La lucha es cruel y es mucha y posiblemente se estire durante generaciones, pero como podría decir una cyberguerrillera: antes morir hackeando que vivir atadx a una cadena de montaje cognitivo determinada tiránicamente por las infames relaciones sociales existentes.

    +

    Las propuestas a nivel praxis de estas líneas son, como decía más arriba, muchas hoy día, y no cabe duda que se pueden multiplicar según las condiciones, capacidades, necesidades e intereses de cada grupalidad u organización que las pretenda poner en práctica colectiva. Muchas veces no hace falta tanto más que levantar las banderas de proyectos flotantes. Sin embargo, no es desestimable la apuesta a recuperar la iconoclasia luddita, porque es difícil construir algo nuevo sin romper de alguna manera lo existente, es decir, sin romper con estas relaciones sociales de propiedad y producción.

    +

    En esa línea, es importante que nos vayamos animando a una auto-alfabetización tecnológica colectiva a partir de las vastas experiencias de educación popular. No para saber programar una página web de un día para el otro, sino para ir reapropiándonos social y políticamente de la técnica. Omnia sunt communia.

    +

    La Magia Y La Técnica

    +
    +

    por Mnemo

    +
    +

    Uno de los mayores y menos estudiados aportes al pensamiento político provenientes de la historia del arte viene de la mano de Aby Warburg (1866-1929), el erudito investigador de la cultura del Renacimiento y la Antigüedad pagana.

    +

    Durante su carrera, que incluyó estudios con Karl Lamprecht en la Universidad de Bonn (Alemania) que lo acercaron a las ideas de Jacob Burckhardt y Friedrich Nietzsche; un viaje a Nuevo México a la región de los Pueblo en donde presenció el ritual de la serpiente; o el paso por la clínica psiquiátrica Bellevue en Kreuzlingen (Suiza) dirigida por Ludwig Binswanger, Warburg se obsesionó con la dialéctica entre dos modos de visión sobre el mundo: la técnica y la magia.

    +

    Dentro de estos dos modos, podrían trazarse dos operaciones de construcción de sentido: el símbolo (unión) y el diábolo (división). La técnica, especialmente la técnica moderna, en su forma simbólica, une las cosas del mundo dejando cada vez menos espacio entre ellas. Por ejemplo, el espacio que hay entre un martillo y un clavo puede ser rellenado por una operación imaginaria simple (un golpe que clava el clavo) que sin embargo permite derivaciones imprevistas: el golpe fallido, un golpe en el dedo, un clavo que se dobla. Permite un mínimo espacio para la reflexión. Sin embargo, hoy la técnica es incomprensible: un conjunto de transistores, capacitores, microchips y absurdas composiciones alquímicas sin intervalos por rellenar con procesos imaginativos. Intervalo, ahí la palabra mágica.

    +

    En su dimensión diabólica/ diabólógica, en cambio, la técnica se separa de todo lo que no es ella misma: la ciencia moderna no permite la existencia de otros saberes más que los que esta configura. La magia, por su parte, funciona en un doble movimiento simbólico-diabólico: une las cosas dividiéndolas. Así lo muestra Warburg en su texto sobre El ritual de la serpiente de los Pueblo. En esta danza de la lluvia, la imagen zigzagueante de la serpiente se asimila mimético-formalmente a la del rayo, esperando que el baile con el animal atraiga la ansiada precipitación. +Lo que permite el abordaje mágico del mundo (que, podríamos decir, no encuentra hoy mejor expresión que las prácticas e investigaciones artísticas) es la creación de un espacio para el pensamiento (denkraum) que la técnica no habilita, especialmente ahora, en una semio-esfera híper-mediada por tecnologías de la comunicación que nadie comprende del todo. Ese espacio para el pensamiento, que en la técnica es meramente reflexivo, en la magia es además devoto porque permite la creación de confianza en lo que une, de fe en un sentido no religioso sino ético en tanto construye una creencia en algo más grande que lo individual, que trasciende lo individual para realizarse en lo múltiple, en un nosotrxs más allá del yo, porque el espacio entre las cosas se llena con una imaginación colectiva. En un mundo abarrotado por el control técnico, la confianza mágica puede darnos algo de espacio. +Podría encontrarse ese sitio, ese denkraum, en la política. Justamente esta ha sido pensada como una técnica social que genera espacios para la configuración de reflexiones. Los partidos tradicionales siguen pensando de esa manera. En la política clásica también se pueden encontrar correspondencias con las líneas que unen (simbólicas) y las que dividen (diabólicas): Por un lado, la política de izquierda es una técnica que trata de programarse a través de la lógica, la argumentación retórica basada en el razonamiento, cada vez más reducido a un ya inexistente sentido común proletario. La derecha, en cambio, pergeña a la política como un acto de magia: el espacio entre las cosas no es lógico sino patológico, eminentemente emocional y devocional; casi que, en un acto contradictorio, genera comunidad en vez de segregar, una comunidad movida por un resentimiento sin objeto, insuflado mágicamente en los espacios vacíos entre las cosas, generando un sentido de confianza basado en el carisma, en la replicación mimética. Sin embargo, la dimensión técnica de la política permanece allí, pero esta vez no en un sentido lógico, sino etológico instrumental: ligado al control, a la medición del comportamiento y su posterior encauzamiento maquínico. +Vivimos en un mundo delirantemente asimétrico. La magia y la técnica en la política se encuentran desastrosamente mal distribuidas. La est-ética parece un terreno exclusivo de la esfera política de derecha, de la derecha que se encuentra más a la derecha, y el Ars Rhetorica se desvanece en la autocomplacencia. Mientras el progresismo se consagra en el onanismo de la banal fantasía kitsch-conceptual, el conservadurismo ha incorporado a su arte (la política) una máquina de construir fórmulas emotivas (pathosformel, de vuelta a Warburg) para captar todas las posibilidades pasionales de las masas: la emoción es, por definición, movimiento hacia afuera, y la derecha se expande como una mancha de tinta que abarca todo el espectro lumínico cada vez más hacia el exterior, se sale del yo. El progresismo, acartonado ya, sin color, se repliega al monismo solipsista e identitario de lo minoritario hecho bandera, hecho orgullo. He aquí el problema: no debemos ser minoría. O, al menos, no debemos jactarnos de serlo, no debemos complacernos en la sustancia minoritaria que tiende a la homogeneidad. +Doble problema de asimetría, entonces, porque nos falta magia y somos menos. Un ejemplo histórico para contrarrestar esta dual carencia es el ya mencionado ritual de la serpiente: un rito mágico-comunitario para cubrir una necesidad, devolverle simetría al mundo en el vaivén entre el rayo y el ofidio. +¿Qué rituales políticos, qué técnicas sociales podemos idear hoy para propiciar un espacio de encuentro mágico que salve las distancias entre los surcos por los que se encarrilan los deseos?

    +
    +

    Flujo y resistencia: una defensa a la tracción lenta en medio de la vorágine

    +
    +

    por floresdefuego +Landscape *

    +
    +

    Isn’t it plain the sheets of moss, except that +they have no tongues, could lecture +all day if they wanted about
    +spiritual patience? Isn’t it clear +the black oaks along the path are standing +as though they were the most fragile of flowers?

    +

    Every morning I walk like this around +the pond, thinking: if the doors of my heart +ever close, I am as good as dead.

    +

    Every morning, so far, I’m alive. And now +the crows break off from the rest of the darkness +and burst up into the sky—as though

    +

    all night they had thought of what they would like +their lives to be, and imagined +their strong, thick wings.

    +
    Mary Oliver.
    +
    +

    El inicio de este texto era distinto; lo construí desde el afuera. Era yo la que observaba sin observarme, sin entrar en él.

    +

    Hace tres semanas, antes de salir de casa, le había dejado una nota a Paula en la que le decía: escribo contra el tiempo. Ella no estaba y esa noche iríamos/fuimos juntas a un concierto. Yo viajaba/viajé al día siguiente y antes de abordar el avión debía conseguir un par de implementos que me hacían falta. El tiempo era poco, casi que ni existía. Esa pendulación intensa entre el adentro y el afuera, entrar y volver a salir, era lo que nos quedaba a ambas antes de separarnos: esa bisagra entre lo que otros ven en nosotros y lo que nosotros vemos en ellos. Una duplicación. El acercamiento de dos amantes.

    +

    Escribimos siempre contra el tiempo, no con él; vivimos en la resistencia o en la fluidez y casi siempre contra el tiempo. Un circuito que a veces se contiene y otras veces se expande.

    +

    Hoy retomo la escritura: esta es una defensa a la quietud en medio de la hiperproducción. Es un llamado a la contemplación del musgo y su acción lenta en medio del ecosistema que nos rodea; un grito y una invocación para modificar nuestro marco visual, tal como nos es dado, y formular una guía sutil y textual para romper con el automatismo de la mirada.

    +

    **

    +

    En junio de 2021, en una casa con pocos muebles y tras muchas horas de trabajo, mi cuerpo colapsó y se desgonzó sobre la pared del comedor. Caí, no pude ver y lo que siguió después fue una escena en donde dos fuerzas chocaron: el movimiento invitando a la quietud, y la quietud generando vértigo.

    +

    Aparecieron las náuseas, un pitido en el oído derecho que me dejó hasta ahora sorda de ese lado y una sensación que se manifiesta cada tanto, marcada por el zumbido y la inestabilidad.

    +

    ¿Tengo?, ¿soy?, ¿padezco? … A menudo me pregunto qué verbo usar para hablar de ese vértigo que en ciertas ocasiones me aparece.

    +

    No está a mi lado _siempre; tampoco soy eso; no sé si verdaderamente _lo padezco. Me duele, me inmoviliza y me hace trastabillar.

    +

    JUNIO: y lo que ocurrió después de ese primer descenso estuvo signado por la necesidad de relatarme a mí misma lo que pasó, de explicármelo, todavía m á s. Ese adverbio de cantidad que me autoimpuse, que detesto, y que veo en cualquier pantalla. ¿Más optimización? ¿Más alimentación? ¿Más entrenamiento? ¿Qué más?

    +

    No puedes sostener el cuerpo en el exceso. No hay guarida que aguante por siempre el excedente, lo que sobra siempre es desechado o enferma.

    +
    +

    En 1992, el profesor Fernando Vásquez Rodríguez, hizo una distinción que me acompañó durante años: la diferencia entre ver y mirar. Para él, ver es una acción natural que además de ser inmediata es fisiológica, indeterminada y sin intención; mirar, por el contrario, es mediato, cultural, determinado e intencional. Mientras que el ver es instintivo, el mirar está regulado por marcos de socialización visual que configuran formas de mirar y construyen una dicotomía adentro/afuera.

    +

    Los marcos de socialización visual, afirma el autor, generan una serie de distinciones que habilitan qué y quiénes son visibles y determinan qué aspectos visuales se refuerzan, esconden, amplían o disminuyen. Estos marcos han permeado nuestra cotidianeidad y estandarizado la manera en la que vemos, reconocemos e identificamos lo que nos rodea.

    +

    Un ejemplo claro es la masificación del streaming: uno de los fenómenos de homogenización de contenido audiovisual más notorio; la heterogeneidad con la que crecimos y nos hicimos adolescentes como piratas parece haber quedado atrás. Los catálogos de contenidos, que se impulsan a través del marketing, han hecho que miles de personas, de forma simultánea, consuman hasta deglutir productos audiovisuales de manera paga, para luego, hablar o simular una conversación interesante alrededor de un contenido maquillado en grandes fábricas en las que apenas sí hay sindicatos y sabemos cómo se produjeron.

    +

    Entre las décadas de los años 80 y 90, tanto en Estados Unidos como en Reino Unido, el término Cultura Visual empezó a tener mayor difusión en la Sociología, la Semiótica, los Estudios Culturales, Feminismos e Historia Cultural del Arte. Por medio de diversas perspectivas teóricas y metodológicas, cada área suministró nuevos elementos para analizar, de manera multidisciplinar y sistémica, las repercusiones que tenían ciertos recursos visuales al reproducir valores estéticos, estereotipos de género y de clase, que han cimentado con ahínco relaciones de poder y asimetría.

    +

    La cultura visual no se construye de manera individual, sino que está adherida a regímenes escópicos que determinan modos de mirar ligados a marcos epistemológicos que cuentan, generalmente, con respaldo institucional desde diferentes frentes: vemos lo que nos permiten ver; reconocemos lo que nos ha sido mostrado una y otra vez; interiorizamos todo aquello con lo que se nos bombardea en cada una de las pantallas a las que saludamos entre muecas y reflejos.

    +

    **

    +

    Yo tenía 21 años cuando Wilmer Villa, unos de mis profesores de pregrado, repetía un Proverbio de Antonio Machado mientras se bamboleaba por el salón. Un proverbio que susurro a veces cuando dejo de verme y mirar: «El ojo que ves no es/ ojo porque tú lo veas; es ojo porque te ve».

    +

    Este proverbio, que me ha acompañado durante casi diez años, ha sido un guiño respecto a lo que ocurre cuando se ve y se mira y el otro te ve y te mira también. La observación que hago y el reflejo que se me devuelve están en mí y viceversa. Y es ese bamboleo, ese ritmo bidireccional, lo que me permite entrar en y pertenecer con.

    +

    Esta forma paradojal del reconocimiento entre el ver y el mirar me recuerda a Ursula K Le Guin y Donna Haraway. Ambas, desde guaridas próximas, se han preguntado sobre el devenir de todos nosotros en lo que respecta al futuro y la interconexión tecnológica que nos atraviesa; ahora, cuando el único horizonte que se reconoce es el del exceso, las pienso cada vez más con dulzura y trazo entre sus obras una interconexión.

    +

    En el inicio de Los Desposeídos, Le Guin se refiere a un muro, y esta figura le permite ilustrar la ambigüedad que este encarna: el muro es bifásico, todo adentro es afuera, depende de cómo se lo mire, depende de cuáles sean las ficciones lingüísticas que rijan nuestra concepción de él. Haraway, por su parte, propone el devenir cybor: una manera de situarse dentro y fuera del muro, volverse artificio y naturaleza, ocupar dos lugares a la vez.

    +
    +

    « La visión es siempre una cuestión del “poder de ver” y, quizás, de la violencia implícita en nuestras prácticas visualizadoras. ¿Con la sangre de quién se crearon mis ojos? » (Donna Haraway. Ciencia, cyborgs y mujeres: la reinvención de la naturaleza).

    +
    +
    +

    En 2021 me mudé a una casa cuya vista da a un bosque en el que sobrevuelan golondrinas. Desde hace dos años los sábados recorro casi siempre la misma ruta. Me muevo como un péndulo, me detengo y encauzo de nuevo. Aproximo mi cuerpo a viejos limoneros que, dependiendo de la temporada, están repletos de fruta, musgo y liquen.

    +

    He recolectado decenas de fotos. He tocado con las yemas de mis dedos micro-ecosistemas que a veces son áridos y en ocasiones desprenden agua que chorrea en las manos. Mi fascinación con el musgo venía de antes, pero pude observarlo y contemplarlo mucho mejor entonces.

    +

    La estructura briófita de los musgos permite que su reproducción ocurra en el aire: no en el subsuelo de la raíz, sino en el cielo de las aves que planean y en él se posan. En los lechos, o colonias densas en las que viven los musgos, cada planta se ancla al suelo a través de un tallo falso que se conoce como caulidio y que contiene esporofitos; cada esporofito es una cápsula de esporas en su extremo más superficial. A medida que el viento y el agua llevan estas esporas lejos de sus camas de origen, los musgos se multiplican. Todo su cuerpo, húmedo y expandido, se divide en nuevas esporas que viajan con el aire y construyen una nueva comuna que se duplica.

    +

    ¿Qué tocas cuando tocas un musgo? ¿Qué observas, miras y ves cuando te detienes a contemplar? ¿Qué hay ahí, en la corteza de un árbol que estuvo antes y está ahora frente a ti y tú cerca de él?

    +

    El musgo ha existido durante más de 480 millones de años y es una de las primeras especies que convirtió la superficie seca en agua. Una planta vascular que puede soportar 30 veces su propio peso. Un colchón húmedo, verdoso y multitexturizado que no es un parásito y vive de manera armónica, que resulta imperceptible en la tracción cotidiana, retiene agua y al liberarla l-e-n-t-a-m-e-n-t-e favorece la infiltración de la lluvia, previene la erosión del suelo, mantiene la humedad atmosférica, suaviza los árboles, protege a los animales demasiado pequeños y me puso en el centro del pecho, a mí, de nuevo un corazón.

    +

    Él roza y yo toco. Él resposa en el árbol que a su vez me toca a mí. Sobre la corteza; entre las rendijas y alcantarillas, sobre las piedras del río repleto de agua dulce y entre las rocas del mar salado; en las cajas de obras de arte; en el borde de los cursos de agua. Me recuerda a una de las preguntas de Merleau-Ponty en “The Visible and the Invisible”: qué toca mi mano cuando toca a otra y qué es aquella, que está siendo tocada. Contacto y movimiento, contemplación y observación.

      -
    • -

      15.03.2023 Buenos Aires > Madrid ~ aeropuerto

      -
    • -
    • -

      16.03.2023 Madrid > Valencia en tren renfe. El primer lugar que voy a visitar es Carcaixent.

      -
    • -
    • -

      22.03.2023 Valencia > Barcelona en tren renfe. me cruzo con sofie & milton en su casa. y después un piso en el centro de bcn

      -
    • -
    • -

      03.04.2023 Barcelona > Berlin en avión ~ tren a Berlin Friedrichstraße station para llegar caminando al hostel

      -
    • -
    • -

      10.04.2023 Berlin > Rotterdam ~ tren hasta la rotterdam central station

      -
    • -
    • -

      16.04.2023 Rotterdam > Bruselas ~ tren de rotterdam central station a Brusells-Mid

      -
    • -
    • -

      16.04.2023 Bruselas > Londres ~ salgo para londres en el Eurostar, llego a St Pancras International y luego hostel

      -
    • -
    • -

      22.04.2023 Londres > Valencia ~ avión

      -
    • -
    • -

      29.04.2023 Valencia > Madrid ~ tren para la estación

      -
    • -
    • -

      29.04.2023 Madrid > Argentina

      -
    • +
    -

    Cuaderno de viaje

    -

    perdón por mi letra. se que tengo que mejorarla. pero lo que no tengo de caligrafía lo tengo de recolectora.

    -

    estan escaneadas muy increible para poder usar las flores en los colashes que necesites.

    -

    todas las flores son libres.

    ]]>
    Librenauta
    Quemar un libro 8 [ Un jardín by Cian ]2023-03-14T00:00:00-03:002023-03-15T18:25:21-03:00/quemar-un-libro-un-jardinUn Jardín by @soycian -

    Es un pequeño pero muy meticuloso fanzine: permite jugar, mirar a través de las ventanitas y conocer a cian desde el ángulo perfecto: la sensibilidad.

    -

    aquí el scann para descarga <3 para mirar de cerquita, imprimir, copiar y compartir.

    ]]>
    librenauta
    Log 0192023-02-06T00:00:00-03:002023-02-06T10:00:05-03:00/log-19 -
  • capas y capas en nuestras manos.
  • -]]>
    librenauta
    Migrar bots a mastodon2023-02-06T00:00:00-03:002023-02-06T17:20:21-03:00/migrar-bots-a-mastodonMigrar bots de tw a mastodon -

    El 7.02.2023 la API1 de tw se cierrá, musk (el dueño de tw) cerrará el acceso de forma gratuita, esto constituye la muerte muchísimos bots que mejoraban mi experiencia en esa plataforma. definitivamente era una de las pocas cosas que me acercaban a tw. todos los bots creados con cheapbotsdonequick.com/ morirán a partir de mañana. tanto como los crossposters como crossposter.masto.donte.com.br/ y las paginas para encontrar gente cerca en tw.

    -

    Por suerte para cada decision individual de una empresa hay una propuesta colectiva

    +

    – Musgo, del latín, muscus, que a su vez proviene del griego μόσχος: almizcle. +– Corteza, del castellano antiguo corteça, y este del latín vulgar corticea, derivado del clásico corticem, acusativo de cortex. +– Caminar, del latín «caminare», que significa «andar». Su raíz etimológica es «cam», que significa «paso» o «marcha». En latín, la voz «caminare» derivó del verbo «caminus», que significa «camino». Esta palabra latina se relaciona con el griego «kamino», que también significa «camino». La raíz griega «kam» se encuentra en varias palabras relacionadas con la caminata, incluyendo «kampe», que significa «campo», y «kamptos», que significa «flexible». +– Tocar, onomatopéyica por toc +– Alma, del latín ánima, que proviene a su vez del griego ανεμος (anemos), cuya raíz es el indoeuropeo anu y cuyo significado es “viento”. De la misma raíz proviene la palabra animal y, también de la misma raíz, proviene el verbo animar (animare, dar vida). +– Espíritu, del latín spiritus y este del verbo spirare (soplar). +– Alma, en hebreo, es נפש, néfesch, que significa “garganta” y proviene de la raíz “respirar” (Ras Shamra, UT 129, 137). +– En hebreo la palabra espíritu es רוח, ruaj, que significa “viento”.

    +

    El ojo que observa; el guiño que rehace el ver y convierte el mirar en algo situado y específico; el pendular bípedo de la mano que sostiene, repasa y se entiende en el tacto; la palabra que contiene y rehace el mundo. El musgo en la piedra, como la canción de Violeta. El musgo que nace en la roca. La roca, la tierra, el árbol. La planta que nos hace bajar la mirada.

    +
                         *
    +
    +

    No sé a dónde va este texto o quizás sí.

    +

    Va sobre la volatilidad y la estática.

    +

    Va sobre el desfase y la pulsión.

    +

    Es sobre el movimiento y la pausa que necesito en medio de los bits.

    +

    Tiene que ver con mi jardín y la luz que refleja; con el sonido apabullante de horas de tecleo y automatizaciones digitales que prometen un futuro más productivo, más rápido, más vertiginoso, más compacto, más ágil, más rentable, más y más agreste. Un futuro del que unos pocos se pavonean, cuando incluyen porcentiles para justificar que millones de agua dulce enfríen servidores que responden preguntas mientras todos morimos de sofoco.

    +

    Un futuro con más seguridad. Simulada por “claves dinámicas” en las aplicaciones de bancos. Generas una de esas claves dinámicas antes de autorizar una transacción. Entonces, millones de números giran detrás de la pantalla y zas: ahora tienes un número fugaz con el cual puedes terminar un procedimiento. Entonces es más seguro.

    +

    Nunca es menos, porque siempre tiene que ser más. Y en los últimos meses, la emergencia de cientos de Inteligencias Artificiales ha apalancado hasta la naúsea ese adverbio de cantidad que lo rebasa todo. Lo llena todo hasta el derrame.

    +
    Más 
    +
    +       M á s 
    +
    +                         Más
    +
    +       +
    +
    += Claves dinámicas.
    +
    +

    Todas las IA son la fórmula mágica del más. Del exceso. Del regusto y del vacío en millones de oraciones frías, calculadas y genéricas. Imágenes duplicadas con un filtro extra. Videos con labios estáticos que emiten sonido y se difunden entre millones de canales de internet. MÁS, desde el menos de quien no se ve y se encarga de entrenar un algoritmo que aplana el mundo ofreciéndonos solo una superficie chata a explorar.

      -
    • -

      primero hay que generar una cuenta en botsin.space la instancia dedicada a bots en mastodon.

      -
    • -
    • -

      para levantar nuestros bots ahora logearemos con nuestra cuenta de mastodon en cheapbotstootsweet.com

      -
    • +
    -

    basicamente v21 hizo el mismo proyecto pero para que funcione con la API de mastodon.

    -

    cheapbot

    +

    En medio del atasco de este texto, hablé con Stefany, quien volvió a ver fuego en mi pecho tras años de distancia y alguna que otra conversación. Le dije que no sabía cómo articularlo; me era difícil construir un ecosistema con piezas sueltas cuando por pulsión, erosión e impulso, quería que el final de esto que estoy escribiendo fuera un frame completo. Ella leyó que lo que une todas estas líneas es la relación que tiene el musgo con el agua.

    +
    +

    Agua y piedra +Tao Te Ching +Versión en español de Ursula K Le Guin

    +
    +

    Lo más blando en el mundo +corre y pasa de prisa +sobre lo más duro del mundo.

    +

    Lo inmaterial +penetra +lo impenetrable.

    +

    Así es como he aprendido las virtudes del no hacer.

    +

    La enseñanza silente, +el beneficio del no hacer; +no muchos lo comprenden.

    +

    Los musgos, en cambio, nunca buscan más. Existen en una relación simbiótica en la que se contraen o expanden según el flujo de agua que llegue a ellos. La cuenca que no es cuenca pero que fluye y que es lugar para sí y para otros.

    +

    En esta pugna contra el tiempo, contra el exceso, mi apuesta es por la tracción lenta y el desmontar de los marcos de visualización que, por décadas, me alejaron del musgo. Un rezo: que tus ojos se abran, que te entre la vida al pecho de nuevo.

    +

    Sé que la piratería, el software libre, las redes independientes, las grietas y las fugas en entornos digitales son una forma efectiva para ser parte de otras formas de cooperación y existencia. He estado ahí. He sido parte de movimientos rápidos, robos, expropiaciones y copias.

    +

    Este texto es un llamado de auxilio y una súplica: contemplemos el musgo. Empujemos la agencia, consistencia y rugido hacia el acto taichí de no hacer nada. Este texto es un movimiento multiforme con los otros que no conozco pero que quiero ver y mirar: somos más cuando el movimiento nos permite existir en comunión.

    ]]>
    librenauta
    Objetos Interespecie2023-10-14T00:00:00-03:002023-10-14T16:20:21-03:00/objetos-interespecieObjetos Interespecie +

    Hace 2 años terminé de cursar la carrera de Diseño Industrial en la UNLP y estaba pensando qué rama de interés en el diseño me gustaría desarrollar.

    +

    La formación (como casi todo el diseño) está pensado para resolver problemáticas centradas en las usuarias human-centered design y no me parece para nada un proceso que esté mal, sino que el enfoque que estoy buscando escapa un poco del antropocentrismo.

    +

    No es por capricho, creo que tenemos una responsabilidad enorme al construir y desarrollar nuestra propia naturaleza y nuestros entornos. También creo que nuestra responsabilidad es política, y como no proyecto en mis años de vida que el proceso de industrialización se detenga de un momento para otro, comencé a pensar que si vamos a seguir construyendo objetos para el mundo, creando nuestra propia naturaleza por lo menos que coexista con otros animales y podamos pensar / los con una visión más amplia.

    +

    Crear objetos que tengan beneficios para otras especies también. Esto no quiere decir que “hay que resolver problemas para otras especies” (que también, más cuando nosotres rompemos sus ambientes), sino que pensar soluciones nuestras que complementen con necesidades de otras especies cercanas.

    +

    ¿Podré iniciar un movimiento internacional? la idea de producir y pensar objetos interespecies?

    +

    Quizá esto nos permite encontrar una nueva estética, una función simbólica que sea permeable para otras especies tanto como para la nuestra. encontrar el valor útil / útil en cada lado, multiplicar la experiencia.

    +

    ¿Qué quiere decir esto?

    +

    Que la morfología y la lógica, la interpretación de los objetos puede tener varios sentidos ya que hay que tener en cuenta cómo perciben otras especies los objetos. ¿Qué sentidos usan? un murciélago ve con ultrasonido tira ondas ultrasónicas al aire y detecta los rebotes para armar un mapa mental de proximidad. quizá podemos hacer objetos invisibles también.

    +

    objetos|sotejob

    +

    Material que encontre relacionado

      -
    • copiar exactamente el mismo .json que pegamos en cheapbotdonequick en cheapbotstootsweet <3
    • -
    -
    -
      -
    1. -

      una API es una interfaz de programación de aplicaciones que permite a desarrolladoras interactuar con plataformas de acuerdo a protocolos definidos. más info acá

      -
    2. -
    -
    ]]>
    Librenauta
    \ No newline at end of file +
  • https://www.alphavillejournal.com/Issue17/HTML/ArticleHook.html
  • +]]>
    Librenauta
    Puede un edificio contener arte entre las grietas2023-10-12T00:00:00-03:002023-07-07T10:20:21-03:00/puede-un-edificio-contener-arte-entre-las-grietasWorker-art

    +

    Los edificios de mi ciudad se agrietan o por el movimiento de las estructuras o por alguna propiedad de los materiales. Entonces son llamados obrerxs para tapar esas grietas con un sellador.

    +

    La primicia es que al estar tapando las grietas algunx obrerx pinta de más, hace una linea para que quede completa la composición. al bajar desde la altura ve en perspectiva su obra. nadie lo sabe.

    ]]>
    Librenauta
    Fósiles2023-10-12T00:00:00-03:002023-10-12T10:20:21-03:00/f%C3%B3siles-de-metalFósiles +

    fósiles metálicos de nuestra civilización que podemos encontrar caminando. A esto llamo nostalgia futurista.

    +
    ]]>
    Librenauta
    Log 0232023-10-11T00:00:00-03:002023-10-12T17:36:05-03:00/log-23 +
  • nuestra casa un dia a la mañana <3
  • +]]>
    librenauta
    Poemas que me gustan2023-10-06T00:00:00-03:002023-10-06T08:20:21-03:00/poemas-que-me-gustanPlan para lo que más me importa - Luis Pescetti +
    +

    Argentino

    +
    +

    He perdido al tenis al fútbol, +en natación y al vóleibol, +y ella me miraba. +Salí último en torneos de ajedrez, billar, karate, +esquí acuático montañismo y pelota vasca. +No logré calificar para competir en bowling, críquet, sumo, pin pon, +bésibol, escalada y patinaje sobre hielo sobre ruedas o lo que fuera. +Tropecé al querer entrar al cuadrilátero de boxeo, +perdí la tabla de surf… +y ella me miraba. +Casi me saco un ojo en esgrima, +no me elegía ningún capitán para jugar fútbol, +en remo no logré llevar el ritmo, +en equitación iba en contra del trote del caballo, +en una regata jamás pude armar la vela, +se me desataba el cinturón blanco en judo… +y ella me miraba. +Voy a inventar un deporte secreto, +entrenaré y entrenaré sin decirle a nadie. +Luego la invitaré a primera fila +y no haré más que ganar, ganar, ganar y ganar +frente a sus ojos, +lo único, lo que más me importa.

    +
    +

    Rojos - Germán Machado -

    +
    +

    Uruguayo

    +
    +

    si te comes el rojo del tomate +¿Te servirá después ese color para gritar “¡peligro!”, para decir “te quiero”?

    +

    para decir “te quiero” prefiero un rojo de frutillas,

    +

    para gritar “¡peligro!”, en cambio, rojo morrón me cabe

    +

    y el rojo tomate lo guardo para estar confundido, como cuando +no sabes: si es fruta o verdura, si es amor o macana, si el peligro es andar +o quedarse parado, si morrones frutillas o algún que otro tomate +va bien en la ensalada que te he preparado.

    +
    +

    Pero más - Luis Pescetti

    +
    +

    Argentino

    +
    +

    Casi todo lo que veo +lo quiero tocar, +pero más: el mar. +Pero más tu cara +que te quiero, quiero +y quiero. +Casi todo lo que veo +lo quiero tocar, +pero más: el cielo. +Pero más tus labios, +que te quiero, quiero +y quiero. +Casi todo lo que veo +lo quiero tocar, +pero más: la lluvia. +pero más tu mano, +que te quiero, quiero +y quiero. +Casi todo lo que veo +lo quiero tocar, +pero más: tus ojos +y más: tu cabello, +y más cada palabra +que dice tu aliento.

    ]]>
    Librenauta
    Log 0222023-09-26T00:00:00-03:002023-09-26T17:36:05-03:00/log-22 +
  • Bomber jacket ascii by TDLH <3
  • +]]>
    librenauta
    songs2023-09-09T00:00:00-03:002023-07-05T10:55:46-03:00/songsexperiment2023-08-29T00:00:00-03:002023-08-29T11:30:05-03:00/experimentResulta que podes llamar a la gema de image2ascii y hacer cortar una imagen.gif en varias imagenes para procesarlas.

    +

    Edité el run.rb del oficial para poder pasarle los parametros como ARGS

    +
    # uso:
    +# $ ruby run-1.rb $filename '$chars'
    +
    +require 'rmagick'
    +require 'image2ascii'
    +require 'json'
    +require 'fileutils'
    +# ingresar nombre de archivo del gif
    +file = ARGV.first
    +file_name_with_extn = File.basename file 
    +# ingresar que caracteres se van a usar
    +chars = ARGV.last
    +
    +animated = Magick::Image.read("#{file_name_with_extn}")
    +count = 0
    +tempHash = {}
    +animated.each do |x|
    +    x.write("./images/image#{count}.jpg")
    +    dude = Image2ASCII.new("./images/image#{count}.jpg")
    +    # usar caracteres ingresados
    +    dude.chars = "#{chars}"
    +    # generar en pantalla completa ( width : dude.winsize ) 
    +    text = dude.generate( width: 80)
    +    # poner la salida en text
    +    puts text
    +    tempHash["#{count}"] = text.gsub!("\n", "<br>")
    +    count = count + 1
    +end
    +
    +FileUtils.rm_rf("./images/.", secure: true)
    +
    +File.open("steps.json","w") do |f|
    +    f.write(tempHash.to_json)
    +end
    +
    +
    +

    Por ejemplo

    +
    +
    + +

    +
    +
    +

    Que dispositivos tenemos para activar la memoria? fotos, sonidos , olores, movimientos, perspectivas, objetos, plantas, gestos. ultimamente empece a hacer esta bibilioteca de sonidos porque pensaba en coleccionar disparadores de recuerdos.

    +

    La memoria humana es un dispositivo muy frágil, se reescribe, se regenera, se acomoda a nuevos contextos. +Estos pulsos de frecuencia estan para no olvidar la gestualidad linguistica de personas que me rodearon.

    +

    El sonido, la voz, despierta recuerdos en diferentes partes del cuerpo. hasta quiza más intensos que copiar una imagen de una foto en nuestra cabeza.

    ]]>
    experiment2023-08-28T00:00:00-03:002023-08-28T00:00:00-03:00/experiment-menu
    \ No newline at end of file diff --git a/cached-feeds/j3s.xml b/cached-feeds/j3s.xml index e847ef1..e0c9472 100644 --- a/cached-feeds/j3s.xml +++ b/cached-feeds/j3s.xml @@ -4,12 +4,26 @@ j3s.sh - 2023-06-06T00:00:00.000Z + 2023-10-20T00:00:00.000Z Jes Olson https://j3s.sh/ + + recover lost text by coredumping firefox + + https://j3s.sh/thought/recover-lost-text-by-coredumping-firefox.html + 2023-10-20T00:00:00.000Z + + + + shell tip: print json with printf + + https://j3s.sh/thought/shell-tip-print-json-with-printf.html + 2023-10-06T00:00:00.000Z + + i will never participate in weird internet caste systems @@ -66,18 +80,4 @@ 2022-03-23T00:00:00.000Z - - storing passwords with age - - https://j3s.sh/thought/storing-passwords-with-age.html - 2021-04-20T00:00:00.000Z - - - - building a fixed gear bicycle - - https://j3s.sh/thought/building-a-fixed-gear-bicycle.html - 2020-12-20T00:00:00.000Z - - \ No newline at end of file diff --git a/cached-feeds/nexxel.xml b/cached-feeds/nexxel.xml new file mode 100644 index 0000000..b334e6b --- /dev/null +++ b/cached-feeds/nexxel.xml @@ -0,0 +1,1344 @@ +nexxel's blogWritings on programming and technology.https://www.nexxel.dev/Ricing MacOShttps://www.nexxel.dev/blog/ricing-macos/https://www.nexxel.dev/blog/ricing-macos/My MacOS Rice.Wed, 01 Nov 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>Recently a screenshot of my MacOS rice blew up on X (formerly Twitter), eventually becoming <a href="https://x.com/nexxeln/status/1715433387337642135/">my most liked post</a> of all time.</p> +<p></p> +<p>I've been asked a lot about my setup, so I decided to write a blog post about it.</p> +<h2>Window Manager</h2> +<p>There's only one decent tiling window manager for MacOS, and that's <a href="https://github.com/koekeishiya/yabai/">yabai</a>. It allows you to control your windows and spaces by using a CLI, for which you can set hotkeys using <a href="https://github.com/koekeishiya/skhd">skhd</a>. yabai is a tiling window manager, which means it automatically arranges and resizes your open application windows in a non-overlapping manner. It allows you to move and manipulate windows in various ways, including moving windows to different spaces and changing the layout of spaces along with a whole lot of other features.</p> +<p>It's probably not as good as some of the amazing window managers available for Linux such as <a href="https://madnight.github.io/bspwm">bspwm</a> or <a href="https://hyprland.org/">hyprland</a> but it works and I haven't had any problems with it so far.</p> +<p>To install yabai, go through the <a href="https://github.com/koekeishiya/yabai/wiki">yabai wiki</a>.</p> +<p>Here's my yabai config:</p> +<pre><code># ~/.config/yabai/yabairc + +# bsp, stack or float +yabai -m config layout bsp + +yabai -m config window_placement second_child + +# padding +yabai -m config window_gap 12 +yabai -m config top_padding 4 +yabai -m config bottom_padding 4 +yabai -m config right_padding 4 +yabai -m config left_padding 4 + +# mouse settings +yabai -m config mouse_follows_focus on +yabai -m config mouse_modifier alt +# left click and drag +yabai -m config mouse_action1 move +# right click and drag +yabai -m config mouse_action2 resize +yabai -m config mouse_drop_action swap + +# disable yabai for these apps +yabai -m rule --add app="^Discord$" manage=off +</code></pre> +<h1>Hotkey Daemon</h1> +<p>yabai is usally paired with <a href="https://github.com/koekeishiya/skhd">skhd</a> which is an excellent hotkey daemon for MacOS. It utilizes a very simple DSL to define hotkeys. Using skhd, you can setup hotkeys for quickly executing yabai commands.</p> +<p>To install skhd follow <a href="https://github.com/koekeishiya/skhd#install">this guide</a>.</p> +<p>Here's my skhd config:</p> +<pre><code># ~/.config/skhd/skhdrc + +# start and stop +ctrl + alt - q: yabai --stop-service +ctrl + alt - s: yabai --start-service + +# changing window focus +alt - s: yabai -m window --focus south +alt - w: yabai -m window --focus north +alt - a: yabai -m window --focus west +alt - d: yabai -m window --focus east + +# rotate layout clockwise +shift + alt - c: yabai -m space --rotate 270 + +# rotate layout anti-clockwise +shift + alt - a: yabai -m space --rotate 270 + +# flip alone x-axis +shift + alt - x: yabai -m space -- mirror x-axis + +# flip along y-axis +shift + alt - y: yabai -m space --mirror y-axis + +# toggle window float +shift + alt - t: yabai -m window --toggle float --grid 4:4:1:1:2:2 + +# maximize a window +shift + alt - m: yabai -m window --toggle zoom-fullscreen + +# reset window size +shift + alt - e: yabai -m space --balance + +# swap windows +shift + alt - h: yabai -m window --swap west +shift + alt - j: yabai -m window --swap south +shift + alt - k: yabai -m window --swap north +shift + alt - l: yabai -m window --swap east + +# move window and split +ctrl + alt - h: yabai -m window --warp west +ctrl + alt - j: yabai -m window --warp south +ctrl + alt - k: yabai -m window --warp north +ctrl + alt - l: yabai -m window --warp east +</code></pre> +<p>I typically use vim keybindings for most things, but here I make one execption when it comes to changing window focus. I find it more convenient to use the <code>wasd</code> keys for this purpose because they're closer to the left <code>option</code> key.</p> +<h1>Terminal Emulator</h1> +<p>I use <a href="https://alacritty.org">Alacritty</a> as my terminal. It's super fast and customizable. I have written about it in my previous blog posts as well. Since then my configuration has udpated and now I have a pretty minimal yet aesthetic config.</p> +<pre><code># ~/.config/alacritty/alacritty.yml + +env: + TERM: xterm-256color + +font: + size: 14 + normal: + family: "Dank Mono" + style: Regular + bold: + style: Bold + italic: + style: Italic + bold_italic: + style: Bold Italic + +window: + option_as_alt: Both + # Window padding (changes require restart) + # + # Blank space added around the window in pixels. This padding is not scaled by + # DPI and the specified value is always added at both opposing sides. + padding: + x: 12 + y: 12 + + # Spread additional padding evenly around the terminal content. + dynamic_padding: false + + # Window decorations + decorations: buttonless + # + # Startup Mode (changes require restart) + # + # Values for `startup_mode`: + # - Windowed + # - Maximized + # - Fullscreen + # + # Values for `startup_mode` (macOS only): + # - SimpleFullscreen + startup_mode: Windowed + + # Background opacity + opacity: 1 + +# Colors (Mellow) +colors: + # Default colors + primary: + background: "#161617" + foreground: "#c9c7cd" + + # Cursor colors + cursor: + text: "#c9c7cd" + cursor: "#757581" + + # Normal colors + normal: + black: "#27272a" + red: "#f5a191" + green: "#90b99f" + yellow: "#e6b99d" + blue: "#aca1cf" + magenta: "#e29eca" + cyan: "#ea83a5" + white: "#c1c0d4" + + # Bright colors + bright: + black: "#353539" + red: "#ffae9f" + green: "#9dc6ac" + yellow: "#f0c5a9" + blue: "#b9aeda" + magenta: "#ecaad6" + cyan: "#f591b2" + white: "#cac9dd" +</code></pre> +<h1>Editor</h1> +<p>Dont't worry, I still primarily use VSCode for anything serious, but I did create a new Neovim configuration from scratch which I don't plan on updating frequently. I kept it quite minimal and used very few plugins. Here's Neovim and VSCode side by side.</p> +<p></p> +<ul> +<li><a href="https://github.com/nexxeln/dots/tree/main/Library/Application%20Support/Code%20-%20Insiders/User">VSCode config</a></li> +<li><a href="https://github.com/nexxeln/dots/tree/main/.config/nvim">Neovim config</a></li> +</ul> +<h2>Conclusion</h2> +<p>This isn't a blog post I necessarily wanted to write but I kind of had to because the X post blew up. Hopefully it serves you as a good reference for configuring your Mac.</p> +<ul> +<li><a href="https://github.com/nexxeln/dots">Dotfiles</a></li> +<li><a href="https://x.com/nexxeln/status/1715433387337642135/">X Post</a></li> +</ul> +How I Organise My Lifehttps://www.nexxel.dev/blog/organising-life/https://www.nexxel.dev/blog/organising-life/In this post, I share the apps and the simplistic approach I use to organise my life.Thu, 03 Aug 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>Over the last few months, I've set out to really get my life sorted and organised so I can manage my time and thoughts better. I have explored numerous apps, and "productivity setups", searching for that seamless integration that could bring a sense of order to my chaotic mind and life. But nothing quite hit the mark until recently.</p> +<p>This is not going to be one of complex setups that you often see productivity influencers making videos and courses about. I actually rejected Obsidian once because I found it really overwhelming after watching a YouTube video setting it up so extensively, reminiscent to configuring <a href="https://www.gnu.org/software/emacs/">Emacs</a>. In my opinion, people watch these second brain and personal knowledge management setup videos and think it's the holy grail of productivity. They fall into the trap of constantly looking for the perfect app and the perfect setup, always trying to optimise their workflow when they're actually just wasting their time without actually focusing on what's important: getting stuff done.</p> +<p>My setup embraces simplicity. Here's what I wanted from my workflow.</p> +<ul> +<li>Note taking app: Has to have <a href="https://help.obsidian.md/Plugins/Backlinks">backlinks</a> and a simple way to organise notes by topics. Should sync across all devices</li> +<li>Calendar app: Creating and editing events should be fast. Also needs to have good NLP for dates and sync with my phone's calendar widget.</li> +<li>Tasks app: Should be easy to quickly add tasks. Has to have good NLP (Natural Language Processing) for dates Also should sync across all devices</li> +</ul> +<p>So here are my apps of choice and how I use them.</p> +<h2>Note Taking App: Obsidian</h2> +<p><a href="https://obsidian.md">Obsidian</a> is my choice of app for note taking. As I mentioned in the intro, I had used it previously in a very complex and overwhelming setup for a week which just didn't feel right. Almost all videos of Obsidian on YouTube were like that. So I had rejected the app back then.</p> +<p>Fast forward a few months and I saw Obsidian gaining popularity again on Twitter and Discord, so I decided to give it another try, only this time, I read the docs instead of videos. I soon realised the simplicity of Obsidian. It's just notes in Markdown, stored in a folder, called "Vault" in Obsidian. You can link to other notes using standard Markdown syntax and also group notes by topic using sub-folders or tags.</p> +<h3>Why I Like Obsidian</h3> +<p>Obsidian has an elegant user interface with an one of the best if not <strong>the</strong> best Markdown editors out there which make the note-taking experience smooth and natural. My favourite part is that it supports vim keybindings in the editor! It also features a nice command palette in which all the commands can be triggered by hotkeys as well. With thousands of plugins available, it gives you tools to do pretty much anything.</p> +<p>But where Obsidian really won me over is privacy. Notes are saved in a local folder and never go to a database. It also doesn't store notes in a weird Obsidian specific format, it's just standard Markdown! It allows you to own and control your data.</p> +<h3>How I Take Notes</h3> +<p>All notes live in the root of my Obsidian vault. I don't use sub-directories. Whenever I need to make a new note, I just create the file in the root. To group notes by particular topics, I use tags. For example, recently I had a very cool idea to sell canned carbonated sugarcane juice, which I'm not sure will taste good by the way. So I created a note for it and put the appropriate tags for it in the frontmatter.</p> +<p></p> +<p>It's a topic which is interesting to me and also a cool idea that I might revisit and explore in the future.</p> +<p>I also really like links in Obsidian. A few days ago, I had been diving deep into purple coloured stones because they look really cool. So I created a note titled "Purple Stones" to keep track of my research. In the "Purple Stones" note, I made a list of all the purple stones that caught my eye with a short description of each of them. But instead of cramming detailed information for each of the stones, I created a separate note dedicated to each stone with all the information I got from my research.</p> +<p>So now, when I click on any stone's name in the "Purple Stones" note, it takes me to its dedicated note where I can immerse myself in all the information about that particular stone.</p> +<p>I was also on the hunt for cool desk decorations and created a note for it. As I was researching common desk decorations I came across the idea of using beautiful rocks as decorations. So I instantly linked my note on amethyst because raw amethyst looks stunning. Obsidian also has a really cool backlinks feature, whenever I visit my amethyst note, I can also see a list of all the other notes where amethyst was mentioned. It's like having a web of interconnected knowledge!</p> +<p>Links have become a huge part of my Obsidian workflow. Each note leads to even more pathways of things I've researched, ideas I've had, or cool things I've discovered. It's as if my notes have formed a collection of interconnected nodes, guiding me through my exploration of different topics and keeping everything neatly organised.</p> +<h3>What I Take Notes Of</h3> +<p>I take notes of pretty much everything.</p> +<ul> +<li>Any idea that comes to mind</li> +<li>Anything interesting I come across</li> +<li>Videos or blog posts that make me think, I break down the key points</li> +<li>Cool thoughts and random musings</li> +<li>Research on various topics</li> +<li>Planning blog posts and events</li> +</ul> +<p>Also Obsidian is simply the best Markdown editor I have ever used so I just use it for writing anything.</p> +<h3>How I Navigate Notes</h3> +<p>As I had written in the previous section, links really help in exploring and guiding you through your notes. It's like having interconnected nodes of knowledge I had said. Well Obsidian has this really feature called "Graph View" which lets you visualise your entire vault. Each note becomes a node and these nodes are connected to each other using the links you create.</p> +<p></p> +<p>In the Graph View you can easily search for everything, including notes, tags, and also visualise how your notes are linked.</p> +<p></p> +<p>I have heard some people saying that the Graph View is not useful, but I find it to be a natural and intuitive way to navigate my notes. It's much better than the regular search experience for me.</p> +<p>To make note navigation even faster and more efficient, I use a plugin called <a href="https://github.com/scambier/obsidian-omnisearch">Omnisearch</a>. It enhances the search functionality in Obsidian with OCR and a smart weighting algorithm. Plus, it supports vim keybindings, which I love. It reminds me of the <a href="https://github.com/nvim-telescope/telescope.nvim">Telescope</a> plugin in Neovim.</p> +<h3>Syncing Notes</h3> +<p>Syncing notes across in Obsidian can be done in different ways. While Obsidian offers a paid <a href="https://obsidian.md/sync">Sync</a> service for seamless synchronisation across devices, I personally use a different approach since I cannot afford it at the moment.</p> +<p>Since Obsidian stores notes as local files in a folder, you can easily sync them using cloud storage services like <a href="https://google.com/drive">Google Drive</a> or <a href="https://dropbox.com">Dropbox</a>. Another option is using <a href="https://syncthing.net/">Syncthing</a> which is what I use. It's an open-source, encrypted file synchronisation program. I find Syncthing convenient because it allows me to sync my files locally between my Mac and Android phone without sending data over the internet. It's a simple and secure solution for keeping my notes in sync across devices. I really like it.</p> +<h3>Publishing Notes</h3> +<p>When I used to use <a href="https://notion.so">Notion</a>, I loved the publish feature that allowed me to share notes easily with a link. Obsidian also offers a similar feature through its paid <a href="https://obsidian.md/publish">Publish</a> service, but it's not within my budget. So, I decided to create my own Obsidian publish solution using <a href="https://rust-lang.org">Rust</a>. It's a command-line tool that scans my Obsidian vault for notes with <code>publish: true</code> in the metadata (similar to the official Publish plugin). It then converts the Markdown notes to HTML and deploys them to the internet. While I'm still refining the static site generator, my plan is to open-source it once it's ready for broader use. This way, others can benefit from it as well.</p> +<h3>Plugins</h3> +<p>I use just three plugins:</p> +<ul> +<li>Minimal Theme Settings, which is the plugin to configure the <a href="https://minimal.guide">Minimal Theme</a> for a clean and minimalistic UI.</li> +<li><a href="https://github.com/scambier/obsidian-omnisearch">OmniSearch</a>, which is a better and quicker search.</li> +<li><a href="https://github.com/adriandersen/obsidian-fuzzytag">FuzzyTag</a>, which provides autocomplete for tags while writing them in the frontmatter.</li> +</ul> +<p>Hopefully this shows that you don't need ten different plugins to make Obsidian functional. It's already enough for whatever you want to do.</p> +<h2>Tasks App: Todoist</h2> +<p>When it comes to managing tasks, I prefer to keep my notes and tasks separate. While some people might use Obsidian for todo-lists, I find it more comfortable to use a dedicated task app.</p> +<p>My go-to task app is <a href="https://todoist.com/">Todoist</a>. <a href="https://frantic.im/todo-for-robots/">Despite todo apps being broken</a>, Todoist <em>works fine</em>. It has a nice UI which allows for adding tasks quickly, even when on the go, thanks to its convenient widget. It has excellent natural language processing, it understands dates and times in whatever broken english I use.</p> +<p></p> +<p>I particularly enjoy the satisfying sound it plays when I complete a task. Todoist's sub-tasks feature is incredibly useful for breaking down complex tasks into smaller, more manageable steps, which also happens to be perfect for shopping lists and check lists.</p> +<p>I also use Todoist as a reminders app. A few days ago, I needed to wish a friend a safe journey for their upcoming long-distance travel, so I added a reminder in Todoist a week in advance, ensuring that I won't forget to send my well-wishes on the day.</p> +<h2>Calendar App: Cron</h2> +<p><a href="https://cron.com">Cron</a> is my preferred Calendar app. It syncs with <a href="https://calendar.google.com/calendar/u/0/r">Google Calendar</a> and features a clean and intuitive UI to for quickly creating and organising events. It offers all the features you'd expect from a standard calendar app but with the added benefits of being keyboard-friendly, visually appealing, and it feels <em>fast</em>.</p> +<p>While Cron doesn't have an official Android app yet, I find that the Google Calendar app works fine. I really like the widget it provides and use it to stay updated with my schedule at a glance.</p> +<p></p> +<h2>Conclusion</h2> +<p>Embracing simplicity has been a great approach in organising my life so far. Let me know if you integrated something from this post in your workflow on X (ex Twitter) and if you enjoyed reading it.</p> +<p>Thank you!</p> +Why I Switched From Neovim To VSCodehttps://www.nexxel.dev/blog/neovim-to-vscode/https://www.nexxel.dev/blog/neovim-to-vscode/A few weeks ago I made the switch from Neovim to VScode as my primary code editor. Here's why.Fri, 23 Jun 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>I recently switched back to VSCode from Neovim as my primary code editor. You may think this is weird because everyone seems to be going the other way around. Why would anyone want to move away from the most loved code editor? In this post, I'll explain why I made the switch and my experience so far.</p> +<h2>Why I used Neovim in the past</h2> +<p>When I first started to code, I used to use VSCode because that's what I saw most people use. But I noticed that on my old laptop, VSCode was too slow and laggy and pretty much unusable while running a side process like a Node server. My laptop used to get so hot that I couldn't even touch it! I was spending more time waiting for intellisense than actually writing code.</p> +<p>I had heard of Neovim as it was the most loved editor on the Stack Overflow survey and also from YouTubers like <a href="https://www.youtube.com/@ThePrimeagen">ThePrimeagen</a> and <a href="https://www.youtube.com/@teej_dv">TJ DeVries</a>. It seemed like a really fun community and the overall vibe was very positive. So I tried it out. I learnt vim keybindings, lua to configure Neovim, created my own config, and started using it as my primary editor.</p> +<p>I loved it, it ran on the terminal, no Electron apps, no lag, no waiting for autocomplete. Everything was as smooth as butter and I felt <em>fast</em>. Learning vim keybindings was one of the best decisions of my life. I know people like to meme about how vim enthusiasts are always trying to convince people to learn vim keybindings but I truly believe that learning it will not only make you faster but also rekindle your love for programming, it did for me.</p> +<p>Neovim had a great plugin ecosystem, almost all the things that I used in VSCode were available in Neovim. It also made me realize that some things aren't necessary at all. For example, I used the file explorer extensively in VSCode but I didn't even install the plugin for it on Neovim. I started to understand the value of minimalism and how simplifying your setup can make you more productive.</p> +<p>Configuring Neovim was also a lot of fun. It gives you full control over your editor and how it looks and behaves. It allowed to optimise my editor for <em>me</em>, tailored to my specific needs. There's also something really satsifying about using an editor you configured yourself.</p> +<p>All of this made me fall in love with Neovim and I can confidently say that it is my favourite editor of all the ones I've used.</p> +<h2>Why I Switched Back to VSCode</h2> +<p>Here are the reasons why I switched back to VSCode in no particular order.</p> +<h3>Copilot</h3> +<p><a href="https://github.com/features/copilot">Copilot</a> is an indispensable part of my workflow now. I can't imagine writing code without it. They have a Neovim plugin but my experience with it was not great. It was slow, and most of the time it didn't even work. The LSP used to keep crashing and I had to restart it every few minutes. Maybe this is just a problem with my setup but I couldn't find a solution to it.</p> +<p>On the other hand, Copilot was built for VSCode. It works flawlessly and I haven't had any issues with it. There's also the new <a href="https://github.com/features/preview/copilot-x">GitHub Copilot X</a> stuff, currently invite-only (I got an invite to test Copilot Chat) which only supports VSCode for now.</p> +<h3>Tiring Neovim Plugin Ecosystem</h3> +<p>Didn't I just say that Neovim has a great plugin ecosystem? Yes, it does. But it's also tiring to keep up with it. Running <code>:PackerSync</code> was scary because you never know what plugin introduced a breaking change that you didn't notice and suddenly you can't code as your whole config breaks down.</p> +<p></p> +<p>Oh and now there's this new plugin manager that everyone is using called <a href="https://github.com/folke/lazy.nvim">lazy.nvim</a> which is probably awesome but now I need to spend time migrating and getting used to it. It's kind of like the JavaScript ecosystem, there's always something new and shiny and you feel like you're missing out if you don't use it. It's tiring to keep up with it.</p> +<p>At first, I was keeping up with the new plugins, trying them out, and making sure my config was up to date, but soon I was tired of it. I just wanted to code.</p> +<p>VSCode's plugin ecosystem is great, installing extensions is a breeze and I don't have to worry about anything breaking. I can just focus on coding.</p> +<h3>Configuration</h3> +<p>As I mentioned earlier, configuring Neovim was fun but it was also tiring and time-consuming. As much as I loved tinkering my config everyday, I realized it was a distraction. I was spending more time configuring my editor than actually coding.</p> +<p>I did love that I had full control over my editor though, and I think VSCode is quite configurable as well, probably not as much as Neovim but it's enough for me. I'm still using vim keybindings. I have a nice theme. I choose what I want in the UI, where I want it, and how it looks. I have a few custom keybindings and snippets here and there, but overall it's pretty minimal.</p> +<p></p> +<h3>I Got a New Laptop</h3> +<p>I recently got a new laptop, a M1 MacBook Air, and it's a beast. So running VSCode is not a problem anymore. Everything feels very smooth. Apple silicon is amazing and I'm glad I switched to it.</p> +<p>It's only gotten hot once when running some <a href="https://code.visualstudio.com/docs/devcontainers/containers">Docker Dev Containers</a> along with Spotify, and my browser, which is understandable. But other than that, it's been great.</p> +<h3>VSCode Only Tools</h3> +<p>Some exceptional libraries and frameworks only support VSCode, which you could argue is a bad thing, but it makes sense, VSCode is the most popular code editor after all. For example <a href="https://unocss.dev">UnoCSS</a> only has a VSCode extension, and it's my favourite way to write CSS. <a href="https://astro.build">Astro</a> has a LSP but I've found that the experience in VSCode is much better than in Neovim.</p> +<p></p> +<p>I've also noticed that the TypeScript LSP is a bit faster in VSCode as well.</p> +<h2>Why Not Use a Neovim Distro?</h2> +<p>I don't like Neovim distributions. I've tried many, and none of them had the same feel as a vanilla Neovim setup. Most of them are bloated, hard to extend, and have a lot of things I don't need. I don't want to spend time configuring a pre-configured editor. I'd rather just configure it myself.</p> +<h2>Conclusion</h2> +<p>This doesn't mean that I'm never going to use Neovim again. It's still my favourite editor and I'll be using it for minor editing tasks, tinkering stuff here and there on the terminal, taking notes, etc. But for my main editor, I'm going to be using VSCode for now.</p> +<p>Let me know if you enjoyed this post, and thank you for reading!</p> +Everything I Installed on My New Machttps://www.nexxel.dev/blog/new-mac/https://www.nexxel.dev/blog/new-mac/I recently got a new Mac and decided to document everything I installed on it. This is a list of all the apps and tools I installed and will use on a daily basis.Fri, 02 Jun 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>I recently got a new Mac and had to install a lot of apps and tools to get it set up. I decided to document everything I installed so I can refer back to it in the future and also share it with others who might find it useful.</p> +<h2>Arc</h2> +<p>I've been recently using this pretty innovative new browser called <a href="https://arc.net">Arc</a> and I must say, it's really cool! It is built on top of <a href="https://www.chromium.org/Home/">Chromium</a> but what sets it apart is its unique features. Super customizable themes, <a href="https://resources.arc.net/en/articles/6318861-spaces-distinct-browsing-areas">Spaces</a> for separating different workspaces, <a href="https://resources.arc.net/en/articles/6808613-boosts-customize-any-website">Boosts</a> for remixing websites, and the best part is everything can be done without ever needing to touch your mouse, everything is keyboard accessible. There's still a lot for me to explore. Using Arc has been a breath of fresh air - everything feels so seamless and enjoyable, making browsing truly fun again. So if you're looking to try something different, check out Arc!</p> +<h2>Raycast</h2> +<p><a href="https://raycast.com">Raycast</a> is a productivity tool that lets you search apps and do things just with a single keystroke. It's like Spotlight on steroids. I've been using it for a while now and it's been a game-changer. I can't imagine using my Mac without it. I use it to open apps, search files, run scripts, and so much more. It has a vibrant ecosystem of extensions that you can install to do even more. I highly recommend checking it out.</p> +<h2>Alacritty</h2> +<p>Alacritty is my terminal of choice. It's super customizable and plenty fast. It doesn't get in your way and just lets you get things done. It doesn't have tabs like <a href="https://iterm2.com/">iTerm</a> or <a href="https://sw.kovidgoyal.net/kitty/">Kitty</a> but I don't mind that because I use it with <a href="https://en.wikipedia.org/wiki/Tmux">tmux</a> which I have previously written about in my <a href="/blog/wsl-workflow#persistent-terminal-sessions-with-tmux">workflow post</a>.</p> +<h2>Homebrew</h2> +<p><a href="https://brew.sh">Homebrew</a> is an excellent package manager for macOS. It made installing all the tools I needed a breeze. Need node? <code>brew install node</code>. Need neovim? <code>brew install neovim</code>. You get the idea. It's a must- have if you're using a Mac.</p> +<h2>Fish Shell</h2> +<p>Since writing my <a href="/blog/wsl-workflow">wsl workflow post</a>, I've switched from zsh to <a href="https://fishshell.com">fish</a>. It's a more modern shell that comes with autosuggestions, syntax highlighting and a lot more out of the box. It even has web-based configuration which makes it super easy to customize and preview your changes.</p> +<h2>Starship</h2> +<p>For my prompt, I still use <a href="https://starship.rs">Starship</a> although my configuration has changed a bit. I've switched the <a href="https://starship.rs/presets/pure-preset.html">pure preset</a> which is a lot more minimal and less distracting.</p> +<p></p> +<h2>GitHub CLI</h2> +<p><a href="https://cli.github.com">GitHub CLI</a> has become an essential part of my workflow. I use it for creating, cloning, and managing repositories. It also makes creating a pull request a breeze. Highly recommend using it, it'll save you a lot of time. It's just a <code>brew install gh</code> away.</p> +<h2>Other Coding Tools</h2> +<h3>fnm</h3> +<p><a href="https://fnm.vercel.app">fnm</a> is a fast and simple Node.js version manager. It's really easy to use and is much faster than nvm.</p> +<h3>exa</h3> +<p>I still use <a href="https://the.exa.website">exa</a> for listing files in the terminal. It's a modern replacement for <code>ls</code> with a lot of useful features. With icons, colors, and git integration, it makes listing files much nicer.</p> +<p>I use the same aliases that I did before.</p> +<pre><code># ~/.config/fish/config.fish + +alias ll="exa -l -g --icons --git" +alias llt="exa -1 --icons --tree --git-ignore" +</code></pre> +<h3>zoxide</h3> +<p>I also still use <a href="https://github.com/ajeetdsouza/zoxide">zoxide</a> for navigating directories. It's a smarter <code>cd</code> command that learns your habits and makes navigating directories a breeze.</p> +<p></p> +<h3>bat</h3> +<p><a href="https://github.com/sharkdp/bat">bat</a> is a modern replacement for <code>cat</code> with syntax highlighting and themes. I use it for a lot of things, but the coolest use of it that I have is to use it to preview files while fuzzy searching using <a href="https://github.com/junegunn/fzf">fzf</a> and opening that file in neovim.</p> +<p></p> +<p>Here's the alias.</p> +<pre><code>alias search="fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' | xargs nvim" +</code></pre> +<h2>Conclusion</h2> +<p>That's it! That's everything I installed on my new Mac. I hope you found this useful. Thanks for reading!</p> +Rust: Not Just Zoom Zoom Fasthttps://www.nexxel.dev/blog/rust/https://www.nexxel.dev/blog/rust/Explore the versatility of Rust beyond performance and memory safety with its well-designed language, package manager, and ecosystem.Sat, 25 Feb 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>When it comes to Rust, the first thing that usually comes to mind is its impressive performance. And while Rust certainly delivers on this front, there's so much more to the language than just raw speed. From its well-designed syntax and powerful abstractions, to its robust package manager and vibrant ecosystem, Rust is a language that truly has it all. In this post, we'll take a closer look at some of the key features that make Rust such a versatile and compelling language.</p> +<p>While the language features discussed in this post may not be exclusive to Rust, it is the way in which they are carefully designed and integrated that sets Rust apart. Rust is the only language where these features converge seamlessly to create a coherent system, which is why it is such a captivating language.</p> +<h2>Practical Immutability</h2> +<p>In Rust, variables can be declared as either immutable or mutable using the <code>mut</code> keyword. Rust embraces immutability as a default by making variables immutable by default. This means that we must explicitly declare variables as mutable if we need to change their value later. This approach makes it easier to reason about the behavior of programs and helps prevent accidental mutations.</p> +<pre><code>let x = 5; // immutable +let mut y = 5; // mutable + +y = 6; // ok +x = 6; // error: cannot assign twice to immutable variable `x` +</code></pre> +<p>In addition to mutable variables, Rust supports passing mutable references to functions. Functions must declare whether they intend to mutate their arguments or not, which further helps prevent accidental mutations. This allows us to use mutable variables in a controlled, explicit way.</p> +<pre><code>fn increment(num: &amp;mut i32) { + *num += 1; // dereference the pointer to mutate the value +} + +fn main() { + let mut x = 10; // x is mutable + increment(&amp;mut x); // pass a mutable reference to x + + println!("x: {}", x); // prints "x: 11" +} +</code></pre> +<p>By embracing immutability as a default and using mutable variables only when necessary, Rust code becomes more robust and predictable.</p> +<h2>Algrebraic Data Types (ADTs) and Pattern Matching</h2> +<p>Algebraic Data Types (ADTs) are a fundamental concept in functional programming that allow for the creation of complex data types by combining simpler types. ADTs can be of two types: Sum types and Product types. Sum types combine multiple types into a single type that can hold one of the constituent types at any given time. Rust provides a powerful implementation of Sum types in the form of enums or enumerated types. Structs, on the other hand, are used to represent Product types. You've probably already used Product types in other languages (interfaces in TypeScript, classes in Java, etc.).</p> +<p>For example, consider a program that represents the types of shapes. We can use an enum to represent the different types of shapes:</p> +<pre><code>enum Shape { + Circle(f64), + Rectangle(f64, f64), + Triangle(f64, f64, f64), +} +</code></pre> +<p>Here, we have defined an enum <code>Shape</code> that has three variants: <code>Circle</code> that takes a single <code>f64</code> argument representing the radius, <code>Rectangle</code> that takes two <code>f64</code> arguments representing the length and width, and <code>Triangle</code> that takes three f64 arguments representing the lengths of its three sides. This allows us to represent any possible shape in a single data type.</p> +<p>Now we can use pattern matching to easily and safely parse the data of a shape. If you don't know what pattern matching is, think of it as a <code>switch</code> statement on steroids. It allows us to match a value against a pattern and execute code based on the pattern that matches. I have a <a href="/blog/pattern-matching">whole blog post on pattern matching btw</a>.</p> +<pre><code>fn area(shape: Shape) -&gt; f64 { + match shape { + // pi * radius^2 + Shape::Circle(radius) =&gt; std::f64::consts::PI * radius * radius, + + // length * width + Shape::Rectangle(length, width) =&gt; length * width, + + // Heron's formula: sqrt(s * (s - a) * (s - b) * (s - c)) where s = (a + b + c) / 2 + Shape::Triangle(side1, side2, side3) =&gt; { + let s = (side1 + side2 + side3) / 2.0; + (s * (s - side1) * (s - side2) * (s - side3)).sqrt() + } + } +} +</code></pre> +<p>Rust's compiler also ensures that our pattern matching is exhaustive, meaning that we must handle all possible cases. This prevents us from accidentally forgetting to handle a case and causing a runtime error.</p> +<p></p> +<p>ADTs along with pattern matching make it trivial to create and handle complex data types in a safe and concise way.</p> +<h2>Built-In Abstractions</h2> +<p>Rust provides powerful built-in abstractions that help in writing correct and safe code easily. Two of the most important abstractions in Rust are <code>Option</code> and <code>Result</code>. These types are essential for working with Rust's null-safety and error-handling systems, which help prevent bugs and improve the reliability of Rust programs. In this section, we'll explore <code>Option</code> and <code>Result</code> in detail, and see how they can be used to write more reliable and error-free Rust code.</p> +<h3>No Null, No Problem (Option)</h3> +<p>Rust replaces the concept of null with the <code>Option</code> type, providing a safer alternative that eliminates the risks associated with null values. <code>Option</code> is an enum that can be either <code>Some</code> with a value or <code>None</code> to represent absence of a value. This type-safe approach allows us to handle absence of a value without resorting to null. Here's how the <code>Option</code> type is defined in Rust:</p> +<pre><code>enum Option&lt;T&gt; { + Some(T), + None, +} +</code></pre> +<p>By using <code>Option</code>, we can ensure that our code is free from null-related bugs and errors, making it easier to reason about program behavior. You may be familiar with this pattern from other languages like Haskell's <code>Maybe</code> monad or OCaml's <code>option</code> type.</p> +<p>Let's look at <code>Option</code> in practice. Consider a function that takes a vector of integers and returns the largest integer in the vector. If the vector is empty, we want to return <code>None</code>. Otherwise, we want to return <code>Some</code> with the largest integer. Here's how we can implement this function in Rust:</p> +<pre><code>fn largest(numbers: Vec&lt;i32&gt;) -&gt; Option&lt;i32&gt; { + if numbers.is_empty() { + return None; + } + + let mut largest = numbers[0]; + + for num in numbers { + if num &gt; largest { + largest = num; + } + } + + Some(largest) +} +</code></pre> +<p>Now we can use this function and use pattern matching to handle the both cases:</p> +<pre><code>fn main() { + let numbers = vec![1, 2, 3]; + + match largest(numbers) { + Some(num) =&gt; println!("Largest number: {}", num), + None =&gt; println!("No largest number"), + } +} +</code></pre> +<p>And this works!</p> +<p></p> +<p>But we can do better. Rust provides an extensive standard library that includes a number of useful functions. Here we can create an iterator from our <code>Option</code> and use the <code>max</code> function to get the largest number:</p> +<pre><code>fn largest(numbers: Vec&lt;i32&gt;) -&gt; Option&lt;i32&gt; { + numbers.into_iter().max() +} +</code></pre> +<p>This also automatically handles the case where the vector is empty, returning <code>None</code> for us. Rust's standard library is full of useful functions like this.</p> +<p>Want to return the double of the largest of the even numbers but only if it's less than 100? No problem!</p> +<pre><code>fn largest_even_less_than_100(numbers: Vec&lt;i32&gt;) -&gt; Option&lt;i32&gt; { + numbers + .into_iter() // create an iterator from the vector + .filter(|num| num % 2 == 0) // filter out only even numbers + .max() // get the largest number - returns an Option&lt;i32&gt; + .map(|num| num * 2) // double the Some value inside the Option, leaves None unchanged + .filter(|num| num &lt; &amp;100) // only return Some if the value is less than 100 +} +</code></pre> +<p>I think you get the point.</p> +<h3>When Things Don't Go As Planned (Result)</h3> +<p>Rust's <code>Result</code> type is another built-in abstraction that is often used to handle errors in Rust programs. It represents the success or failure of an operation. <code>Result</code> is an enum with two possible variants - <code>Ok</code> and <code>Err</code>. <code>Ok</code> represents the successful result of an operation, while <code>Err</code> represents an error that occurred during the operation. Here's how the <code>Result</code> type is defined in Rust:</p> +<pre><code>enum Result&lt;T, E&gt; { + Ok(T), + Err(E), +} +</code></pre> +<p>You might be familiar with this pattern from other languages like Haskell's <code>Either</code> monad or OCaml's <code>result</code> type.</p> +<p>Let's look at an example of how <code>Result</code> can be used to handle errors. Let's say we have a function that takes two integers as arguments and returns the result of dividing the first integer by the second. However, division by zero is not allowed and will result in an error. We can use the <code>Result</code> type to handle the possible error case:</p> +<pre><code>fn divide(x: i32, y: i32) -&gt; Result&lt;i32, &amp;'static str&gt; { + if y == 0 { + return Err("Cannot divide by zero"); + } + Ok(x / y) +} +</code></pre> +<p>Now we can use this function and handle the success and error cases:</p> +<pre><code>fn main() { + match divide(10, 2) { + Ok(result) =&gt; println!("Result: {}", result), + Err(error) =&gt; println!("Error: {}", error), + } +} +</code></pre> +<p>Pretty simple, right? Let's look at some functions Rust provides to make working with <code>Result</code> a breeze.</p> +<p>Say we wanted to add 10 to the result of a chained division operation. We could use nested <code>match</code> statements but that's a bit ugly and verbose. Rust has us covered with the <code>and_then</code> and <code>map</code> functions:</p> +<pre><code>fn main() { + let result = divide(10, 2) + .and_then(|x| divide(x, 2)) + .map(|x| x + 10); + + match result { + Ok(result) =&gt; println!("Result: {}", result), + Err(error) =&gt; println!("Error: {}", error), + } +} +</code></pre> +<p>This is a lot more concise than using nested <code>match</code> statements. Rust's standard library provides a lot more functions for working with <code>Result</code> and <code>Option</code>, so be sure to check them out.</p> +<h2>Vibrant Community and Ecosystem</h2> +<p>Rust is more than just a language; it has a thriving ecosystem and community. This community is supported by a robust ecosystem of libraries, tools, and resources that make it easy to build, test, and deploy Rust applications.</p> +<p>Here are some key aspects of Rust's ecosystem and community:</p> +<ul> +<li> +<p><strong>Rustup</strong> - Rustup is the official tool for installing and managing Rust. It makes it easy to install and update Rust and its associated tools. It also makes it easy to install and manage multiple versions of Rust on the same system.</p> +</li> +<li> +<p><strong>Cargo</strong> - Cargo is Rust's package manager. It's used to build, test, and run Rust applications. It also makes it easy to manage dependencies and avoid dependency hell. It also allows publishing libraries and binaries to <a href="https://crates.io">crates.io</a>, Rust's official package registry. It can also do benchmarks, and even manage multiple projects in the same repository using workspaces.</p> +</li> +<li> +<p><strong>Libraries</strong> - Rust has a large and growing collection of open-source libraries and frameworks that can be easily integrated into your projects. This includes everything from low-level system libraries to high-level web frameworks and game engines.</p> +</li> +<li> +<p><strong>Tooling</strong> - Rust has a strong focus on developer tools. Tools like Rustfmt, Clippy, and Rust Analyzer that help with code formatting, linting, and analysis.</p> +</li> +<li> +<p><strong>Community</strong> - The Rust community is known for being welcoming and supportive, with many resources available to help new users get started with the language. This includes online forums, chat rooms, and meetups, as well as a growing collection of Rust books and tutorials. I particurlarly love <a href="https://discord.gg/rust-lang-community">Rust's community discord server</a>. It's a great place to get help with Rust and meet other Rustaceans.</p> +</li> +</ul> +<blockquote> +<p>These are some of my favourite features of Rust. If I go on, this article will be too long, so I'm linking some resources for Rust coolness below. I highly recommend checking them out.</p> +</blockquote> +<h2>Some Other Cool Resources</h2> +<ul> +<li><a href="https://stephencoakley.com/2019/04/24/how-rust-solved-dependency-hell">How Cargo solved dependency hell</a></li> +<li><a href="https://youtu.be/MWRPYBoCEaY">Rust Macros</a></li> +<li><a href="https://youtu.be/CJtvnepMVAU">Rust's insanely helpful compiler</a></li> +<li><a href="https://blog.rust-lang.org/2015/05/11/traits.html">Rust traits</a></li> +</ul> +Implementing the Pipe Operator in TypeScripthttps://www.nexxel.dev/blog/pipe/https://www.nexxel.dev/blog/pipe/The pipe operator is one of my favourite features in functional languages like Elixir and OCaml. Let's implement it in TypeScript!Sat, 21 Jan 2023 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<h2>What is the pipe operator?</h2> +<p>The pipe operator is used to chain function calls together in a more readable and concise way. The operator takes the output of one function as the input for the next function in the chain. Here's an example of pipes in <a href="https://elixir-lang.org/">Elixir</a>.</p> +<pre><code>"hello" +|&gt; String.upcase() # turn string into uppercase +|&gt; String.reverse() # reverse the string returned from `String.upcase()` +|&gt; IO.puts() # print the output from `String.reverse()` + +# "OLLEH" +</code></pre> +<p>In the example above, the pipe operator <code>|&gt;</code> takes the output of the previous function and passes it as the input for the next function. Here's a more complex example. It's my solution to <a href="https://adventofcode.com/2022/">Advent of Code 2022</a> <a href="https://adventofcode.com/2022/day/1">day 1 pt.2</a>.</p> +<pre><code>File.read!("./input.txt") +|&gt; String.split("\n\n") +|&gt; Enum.map(fn elf -&gt; + elf + |&gt; String.split("\n") + |&gt; Enum.map(fn e -&gt; e |&gt; String.to_integer() end) + |&gt; Enum.sum() +end) +|&gt; Enum.sort(:desc) +|&gt; Enum.slice(0..2) +|&gt; Enum.sum() +|&gt; IO.inspect() +</code></pre> +<p>You can see how the pipe operator really helps in improving the readability of the code. The code reads like a sentence. Pipes also eliminate the need to create temporary variables to store the output of each function call or using nested function calls. As a result developers also don't have to worry about naming variables which is my least liked part of programming.</p> +<h2>Implementing the pipe operator in TypeScript</h2> +<p>After watching <a href="https://youtu.be/h1FvtIJ6ecE">Theo's video on the proposal for adding pipes in JavaScript</a>, I was inspired to implement the pipe operator as a function that composes functions together. Here is what I set out to achieve.</p> +<pre><code>const len = (s: string): number =&gt; s.length; +const double = (n: number): number =&gt; n * 2; +const square = (n: number): number =&gt; n ** 2; + +console.log(pipe("hi", len, double, square)); // 16 +</code></pre> +<h3>Initial implementation</h3> +<p>This was my first iteration of the <code>pipe</code> function.</p> +<pre><code>const pipe = (value: any, ...fns: Function[]) =&gt; + fns.reduce((acc, fn) =&gt; fn(acc), value); +</code></pre> +<p>Here's what this code is doing:</p> +<ul> +<li>The function takes two arguments: <code>value</code> of any type, and <code>fns</code> which is an array of functions. The spread operator <code>...</code> allows for any number of functions to be passed in.</li> +<li>The <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce"><code>reduce</code></a> function is used to iterate over the array of functions and pass the output of the previous function as the input for the next function.</li> +<li>The callback function passed to <code>reduce</code> takes two arguments: <code>acc</code> which is the accumulator, and <code>fn</code> which is the current function in the array. The first function in the array is applied to the initial value, which is the <code>value</code> argument passed to the function. Each subsequent function is applied to the output of the previous function, chaining them together.</li> +<li>It then returns the output of the last function in the array.</li> +</ul> +<p>And this works!</p> +<p></p> +<h3>Problems with the initial implementation</h3> +<p>There are a few problems with this implementation. The first problem that I immediately noticed is that the type of the returned value from the function is <code>any</code>.</p> +<p></p> +<p>Obviously this is not good. Ideally this type should be inferred by the TypeScript compiler. I got some help from Reddit and a user there suggested this:</p> +<pre><code>type Fn = (...args: any[]) =&gt; any; + +type LastReturnType&lt;L extends Fn[]&gt; = L extends [...any, infer Last extends Fn] + ? ReturnType&lt;Last&gt; + : never; + +const pipe = &lt;Funcs extends Fn[]&gt;(value: any, ...fns: Funcs) =&gt; + fns.reduce((acc, fn) =&gt; fn(acc), value) as LastReturnType&lt;Funcs&gt;; +</code></pre> +<p>This is definitely some crazy TypeScript. Let's break it down.</p> +<ul> +<li><code>Fn</code> is a type alias for a function that takes any number of arguments of <code>any</code> type and returns <code>any</code> type.</li> +<li><code>LastReturnType</code> is a generic type that takes an array of functions and returns the return type of the last function in the array. The <code>infer</code> keyword is used to infer the type of the last function in the array.</li> +<li>It uses <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types">variadic tuple types</a> to know what the last function in the tuple is and then uses the <code>ReturnType</code> type utility to get the return type of the last function.</li> +<li>Then the <code>pipe</code> function is defined as a generic function that takes an initial value of any type and an arbitrary number of functions of the <code>Fn</code> type. It then casts the return value of the function to the return type of the last function in the array.</li> +</ul> +<p>So now the type of the returned value is inferred correctly.</p> +<p></p> +<p>But there's still a problem. Let me demonstrate it with an example.</p> +<pre><code>// does not show an error +const result = pipe("hi", double, len, square); + +// Argument of type 'number' is not assignable to parameter of type 'string'. +const result2 = square(len(double("hi"))); +</code></pre> +<p>Here we're trying to double the string "hi", which is impossible as we're passing a string to a function that expects a number. You can see we get the appropriate error when we try to do this by nesting the function calls. But our <code>pipe</code> function does not show any errors.</p> +<p></p> +<p>This is a perfect use case for <a href="https://en.m.wikipedia.org/wiki/Kind_(type_theory)">Higher Kinded Types</a>. Unfortunately, TypeScript does not support Higher Kinded Types yet. There isn't a way to say "for all these functions, the input type is <a href="https://en.m.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)">contravariant</a> to the output type of the previous function".</p> +<h3>So what's the solution?</h3> +<p>Turns out, the easiest and most straightforward solution is to set an upper bound on the number of functions that can be passed to the <code>pipe</code> function and use <a href="https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads">function overloading</a> to define the type of the returned value.</p> +<pre><code>function pipe&lt;A&gt;(value: A): A; +function pipe&lt;A, B&gt;(value: A, fn1: (input: A) =&gt; B): B; +function pipe&lt;A, B, C&gt;(value: A, fn1: (input: A) =&gt; B, fn2: (input: B) =&gt; C): C; +function pipe&lt;A, B, C, D&gt;( + value: A, + fn1: (input: A) =&gt; B, + fn2: (input: B) =&gt; C, + fn3: (input: C) =&gt; D, +): D; +function pipe&lt;A, B, C, D, E&gt;( + value: A, + fn1: (input: A) =&gt; B, + fn2: (input: B) =&gt; C, + fn3: (input: C) =&gt; D, + fn4: (input: D) =&gt; E, +): E; +// ... and so on + +function pipe(value: any, ...fns: Function[]): unknown { + return fns.reduce((acc, fn) =&gt; fn(acc), value); +} +</code></pre> +<p>This might seem very manual but it's definitely the best way to do this. It works very well and also gives fairly easy to understand type errors for the user. Let's see how it works.</p> +<p>The first five function declarations are overloads of the <code>pipe</code> function, each one of them has a different set of parameters, each overload corresponds to a different number of functions that can be passed to the <code>pipe</code> function.</p> +<ul> +<li>The first overload takes a single argument of generic type <code>A</code> and returns the same value without applying any function to it.</li> +<li>The second overload takes two arguments, value of type <code>A</code>, and <code>fn1</code> a function that takes an argument of type <code>A</code> and returns a value of type <code>B</code>.</li> +<li>The third overload takes three arguments, value of type <code>A</code>, <code>fn1</code> a function that takes an argument of type <code>A</code> and returns a value of type <code>B</code>, and <code>fn2</code> a function that takes an argument of type <code>B</code> and returns a value of type <code>C</code>.</li> +<li>There can be any number of overloads, but I've only defined five for demonstration purposes.</li> +</ul> +<p>Each overload corresponds to a different number of functions, and each function's input type is the output of the previous function, this way the <code>pipe</code> function will not only return the output type of the last function passed but also type check the input and output types of each function in the pipeline.</p> +<p>The last function declaration is the actual implementation of the <code>pipe</code> function. It takes an initial value of any type and an arbitrary number of functions and applies them to the initial value in the order they are passed. The logic is the same as before.</p> +<p>The advantage of this implementation is that it allows the <code>pipe</code> function to be more type-safe as it ensures that the input and output types of each function in the pipeline are consistent and match the type of the initial value, and it also ensures that the functions passed to the <code>pipe</code> function have the correct signature.</p> +<p></p> +<h3>Overloading without using the function keyword</h3> +<p>I love my arrow functions and almost never use the <code>fuction</code> keyword. Unfortunately, we can't use arrow functions for overloading. We can only use the <code>function</code> keyword for overloading. But what we can do is implement the overloads in an interface and then implement the actual function as a function of that interface.</p> +<pre><code>interface Pipe { + &lt;A&gt;(value: A): A; + &lt;A, B&gt;(value: A, fn1: (input: A) =&gt; B): B; + &lt;A, B, C&gt;(value: A, fn1: (input: A) =&gt; B, fn2: (input: B) =&gt; C): C; + &lt;A, B, C, D&gt;( + value: A, + fn1: (input: A) =&gt; B, + fn2: (input: B) =&gt; C, + fn3: (input: C) =&gt; D, + ): D; + &lt;A, B, C, D, E&gt;( + value: A, + fn1: (input: A) =&gt; B, + fn2: (input: B) =&gt; C, + fn3: (input: C) =&gt; D, + fn4: (input: D) =&gt; E, + ): E; + // ... and so on +} + +const pipe: Pipe = (value: any, ...fns: Function[]): unknown =&gt; { + return fns.reduce((acc, fn) =&gt; fn(acc), value); +}; +</code></pre> +<p>This is same as the previous implementation, but we're using an interface to implement the overloads instead of using the <code>function</code> keyword. This way we can use arrow functions for the actual implementation. Pretty neat, right? Everything still works!</p> +<p></p> +<h2>Conclusion</h2> +<p>I hope you enjoyed this article. I've learned a lot while writing it, and I hope you did too. Thanks for reading!</p> +<h2>References</h2> +<ul> +<li><a href="https://www.typescriptlang.org/docs/handbook/intro.html">TypeScript Handbook</a></li> +<li><a href="https://www.typescriptlang.org/play?#code/PTAECcFMBcFdwHamgTwA6VAewGagDYCGAztKDrAgMbQCWWStSh44hKAUKhqAGJOF8AJRjwEANUGxIAHl6hIAD2iQEAE2J9KNeggDaAXQB8AXj4LlqjaD0A6e0xyRwoAKoAaUI+egAMgdAAfj8LFXVNAAp7WxYAc2IALlBCBBQASlATIy8EJxchINACpIRIADcfEvLnDi50TABBTL4BYVFESXxpGT0IjKzQAEYAJgBmY1qqBlJQNFoeMzkETSUw615tOgZDIwiyqUgklJRPaJxlpN5ltMvWkTgOg6XibIGOUA-yZdsoNVgqSARCKEKhUTznfrZc7A0FpTz7LqQNIAbg+k2mZHwqmaEUSoFI4CYsRuoAQsAAtgAjHwDYi2LEIWLQAAWyI4U2WZDUWFglKxOIQJQp1PAJLJVJp2SQACpQMNUeyMfiAI6wFiYMwRQWk4XOMW6lwDGWy+WgdGciCQYiwfBkMxzDARABEzNoTvcDM83N5WM8xFV6pRoBAluttq8mmOHBDnwAeoFFcssFj6VhYhEoGHoBkQ4MAGwcIA"><code>LastReturnType</code> implementation</a> by u/i_fucking_hate_money</li> +<li><a href="https://github.com/remeda/remeda/blob/master/src/pipe.ts">Remeda's <code>pipe</code> implementation</a></li> +<li><a href="https://github.com/bluesky-llc/open-source/blob/main/packages/utils/src/pipe.ts">u/GoodnessManifest's <code>pipe</code> implementation</a> with overloads in an interface</li> +<li><a href="https://github.com/tc39/proposal-pipeline-operator">Proposal</a> for adding the pipe operator to JavaScript</li> +</ul> +Expressive Code with Pattern Matchinghttps://www.nexxel.dev/blog/pattern-matching/https://www.nexxel.dev/blog/pattern-matching/Elevate your code by writing declarative, and easy-to-read code with pattern matching.Thu, 29 Dec 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>Have you ever found yourself writing long, cumbersome if-else chains in your code, just to handle a few different cases? If so, you'll want to learn about pattern matching. In this post, we'll explore the basics of pattern matching and how it can help you write cleaner, more concise code. We'll also look at some examples of how pattern matching can be used to solve common problems in programming.</p> +<h2>What is Pattern Matching?</h2> +<p>Pattern matching is a mechanism for checking a value against a pattern and, based on the match, performing some kind of action. It is a fundamental feature of many programming languages, such as Haskell, Rust and ML languages including OCaml.</p> +<p>The basic idea behind pattern matching is simple: you define a pattern and provide some code to be executed if the pattern matches. All of the code examples in this post are in OCaml syntax because it is very readable and easy to understand. Consider the following example:</p> +<pre><code>(* basic.ml *) + +let greet name = + match name with + | "nexxel" -&gt; print_string "Hi, nexxel!" + | "Ludwig" -&gt; print_string "Crazy how you look exactly like Mogul Mail" + | _ -&gt; print_string "Who are you?" +</code></pre> +<p>Here we have defined a function called <code>greet</code> that takes a single argument<code>name</code>. The <code>match</code> keyword is used to define a pattern match, and the <code>with</code> keyword is used to specify the different patterns to be matched.</p> +<p>The first pattern is <code>"nexxel" -&gt; print_string "Hi, nexxel!"</code>, which means that if <code>name</code> is equal to <code>"nexxel"</code>, it will execute the print statement. Similarly, if <code>name</code> is equal to <code>"Ludwig"</code> it will execute the respective print statement. The last pattern is <code>_ -&gt; print_string "Who are you?"</code>, which means that if <code>name</code> is anything other than "nexxel" or "Ludwig", it will print "Who are you?".</p> +<p>This is a very basic example of pattern matching, but it illustrates the core concept: you define a pattern and provide some code to be executed if the pattern matches. You might think how is this better than using an if-else statement? We'll see how pattern matching helps in simplifying complex conditional logic with less mental effort.</p> +<h2>Why Use Pattern Matching?</h2> +<p>Pattern matching allows you to express complex conditionals in a concise and declarative way. Let's look at another example which is a function to calculate the <a href="https://en.wikipedia.org/wiki/Factorial">factorial</a> of a number.</p> +<pre><code>(* factorial.ml *) + +let rec factorial n = + match n with + | 0 -&gt; 1 + | n -&gt; n * factorial (n - 1) +</code></pre> +<p>This code uses a recursive function (<code>rec</code> is used to define recursive functions) and pattern matching to calculate the factorial of a given number. The pattern <code>0</code> is matched if <code>n</code> is equal to <code>0</code>, in which case the function returns <code>1</code>. Otherwise, the pattern <code>n</code> is matched, and the function calls itself with <code>n - 1</code> as the argument.</p> +<p>This code is much simpler and easier to understand than an equivalent implementation using an imperative loop. In addition, it is more declarative, as it specifies what should be done rather than how it should be done. Here's an imperative implementation of the same function in Python:</p> +<pre><code># factorial.py + +def factorial(n): + def loop(i, acc): + if i &gt; n: + return acc + else: + return loop(i + 1, acc * i) + return loop(1, 1) +</code></pre> +<p>The declarative way of doing things is much more concise and easier to reason. Let's explore some more examples to see how pattern matching is used in practice.</p> +<h2>Pattern Matching in Practice</h2> +<h3>Conditionals</h3> +<p>We already saw the factorial example, but let's take another example to calculate the nth term of the <a href="https://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci sequence</a>.</p> +<pre><code>(* fibonacci.ml *) + +let rec fib n = + match n with + | 0 -&gt; 0 + | 1 -&gt; 1 + | n -&gt; fib (n - 1) + fib (n - 2) +</code></pre> +<p>Here, the <code>fib</code> function uses pattern matching to define three cases:</p> +<ul> +<li>If <code>n</code> is equal to <code>0</code>, it returns <code>0</code>.</li> +<li>If <code>n</code> is equal to <code>1</code>, it returns <code>1</code>.</li> +<li>If <code>n</code> is neither <code>0</code> nor <code>1</code>, the function calls itself with <code>n - 1</code> and <code>n - 2</code> as arguments and returns the sum of the two results.</li> +</ul> +<p>Here's an imperative implementation of the same function in TypeScript:</p> +<pre><code>// fibonacci.ts + +const fib = (n: number): number =&gt; { + if (n === 0) { + return 0; + } else if (n === 1) { + return 1; + } else { + let a = 0; + let b = 1; + + for (let i = 2; i &lt;= n; i++) { + [a, b] = [b, a + b]; + } + + return b; + } +}; +</code></pre> +<p>If you look at the code, you'll see that it is much more verbose than the declarative version. It also uses mutable variables, which can be error-prone. Moreover, it is not very easy to understand what the code is doing. Although this can be improved and be written in a declarative way using recursion.</p> +<pre><code>// fibonacci.ts + +const fib = (n: number): number =&gt; { + if (n === 0) { + return 0; + } else if (n === 1) { + return 1; + } else { + return fib(n - 1) + fib(n - 2); + } +}; +</code></pre> +<p>This version is much more readable and concise, but it is still not as concise and satisfying to read and write as the pattern matching version.</p> +<h3>Usage with Algebraic Data Types</h3> +<p>Pattern matching is also used with <a href="https://en.wikipedia.org/wiki/Algebraic_data_type">algebraic data types</a>, which are composite data types that are built up from simpler data types using a set of constructors.. Consider the following example to represent a <a href="https://en.wikipedia.org/wiki/Binary_tree">binary tree</a>:</p> +<pre><code>(* binary_tree.ml *) + +type tree = + | Leaf + | Node of int * tree * tree + + +let binary_tree = Node(1, Node(2, Leaf, Leaf), Node(3, Leaf, Leaf)) +</code></pre> +<p>The <code>tree</code> type is an ADT, where the value of type <code>tree</code> can either be a <code>Leaf</code> or <code>Node</code>. This ADT has two constructors: <code>Leaf</code> and <code>Node</code>. The <code>Leaf</code> constructor takes no arguments and represents a leaf node, i.e. a node with no subtrees. The <code>Node</code> constructor takes three arguments: an integer value, and two subtrees.</p> +<p>Now that we have defined the <code>tree</code> ADT, we can use it to create a binary tree. The <code>binary_tree</code> variable is a <code>tree</code> value that represents the following binary tree:</p> +<pre><code> 1 + / \ + 2 3 + / \ / \ +</code></pre> +<p>Now we can use pattern matching to deconstruct the <code>tree</code> value and perform different actions based on its structure. For example, we can write a function that sums the values of all leaf nodes in a tree:</p> +<pre><code>(* binary_tree.ml *) + +let rec sum_tree tree = + match tree with + | Leaf -&gt; 0 + | Node(value, left, right) -&gt; value + sum_tree left + sum_tree right + +(* let () = print_int (sum_tree binary_tree) *) +(* 6 *) +</code></pre> +<p>The <code>sum_tree</code> function takes a <code>tree</code> value as an argument and uses pattern matching to deconstruct it. If the tree is a <code>Leaf</code>, it returns <code>0</code>. Otherwise, it returns the value of the node plus the sum of the values of the left and right subtrees.</p> +<p>You can see the benefits of using pattern matching here. The code is very concise and much easier to understand because it reads like what you would say in plain English.</p> +<h3>Navigating Complex Data Structures</h3> +<p>Pattern matching allows us to navigate complex data structures in a very flexbile and concise way without a lot of mental overhead. Consider the following <a href="https://en.wikipedia.org/wiki/Tagged_union">variant type</a> to represent a <a href="https://en.wikipedia.org/wiki/Polynomial">polynomial</a>:</p> +<pre><code>(* polynomial.ml *) + +type 'a polynomial = + | Zero + | Const of 'a + | Var + | Sum of 'a polynomial * 'a polynomial + | Prod of 'a polynomial * 'a polynomial + | Power of 'a polynomial * int +</code></pre> +<p>The <code>polynomial</code> type is a generic type that takes in a type parameter <code>'a</code>. It is a placeholder for a type that will be specified later when the type is used. <code>polynomial</code> and has six variants. The <code>Zero</code> variant represents the polynomial <code>0</code>, the <code>Const</code> variant represents a constant polynomia, the <code>Var</code> variant represents the polynomial <code>x</code>. The <code>Sum</code> variant represents the sum of two polynomials. The <code>Prod</code> variant represents the product of two polynomials. The <code>Power</code> variant represents the polynomial raised to a power.</p> +<p>We can now use pattern matching to define a function that evaluates a polynomial at a given value of <code>x</code>:</p> +<pre><code>(* polynomial.ml *) + +(* `function` is just syntatic sugar for `match x with` *) +let rec eval x = function + | Zero -&gt; 0 + | Const c -&gt; c + | Var -&gt; x + | Sum (p1, p2) -&gt; eval x p1 + eval x p2 + | Prod (p1, p2) -&gt; eval x p1 * eval x p2 + | Power (p, n) -&gt; int_of_float (float_of_int (eval x p) ** float_of_int n) +</code></pre> +<p>Here, <code>eval</code> is a recursive function which uses pattern matching to define the cases for the different variants of the <code>polynomial</code> type.</p> +<ul> +<li>If the polynomial is <code>Zero</code>, the function returns <code>0</code>.</li> +<li>If the polynomial is <code>Const</code>, the function returns the constant value.</li> +<li>If the polynomial is <code>Var</code>, the function returns the value of <code>x</code>.</li> +<li>If the polynomial is an <code>Sum</code>, the function deconstructs the polynomial into its two operands and evaluates them using the <code>eval</code> function. It then returns the sum of the two results.</li> +<li>If the polynomial is a <code>Prod</code>, the function again deconstructs the polynomial, evaluates them and returns the product of the two results.</li> +<li>If the polynomial is a <code>Power</code>, the function deconstructs the polynomial into its base and exponent, evaluates the base and returns the base raised to the power of the exponent.</li> +</ul> +<p>This allows us to easily calculate the value of a polynomial of any complexity at a given value of x by destructuring it into its constituent parts and recursively evaluating each part. For example, here's how we can use the <code>eval</code> function to evaluate the polynomial <code>x^2 + 2x + 1</code> at <code>x = 2</code>:</p> +<pre><code>(* x^2 + 2x + 1 *) +let p = Sum(Power(Var, 2), Sum(Prod(Const 2, Var), Const 1)) + +let result = eval 2 p + +(* let () = print_int result *) +(* 9 *) +</code></pre> +<p>Another benefit to use pattern matching in complex structures like this is that the compiler will make sure your pattern matching is exhaustive so you won't ever miss a case.</p> +<p></p> +<h3>Handling Errors</h3> +<p>Pattern matching can also be a useful technique for error handling. Consider the following to divide two integers:</p> +<pre><code>let div x y = + if y = 0 then Error "Division by zero" + else Ok (x / y) +</code></pre> +<p>The <code>div</code> function takes two integers as arguments and returns an <code>int</code> value wrapped in an result type. If the second argument is <code>0</code>, the function returns an <code>Error</code>. Otherwise, it returns <code>Ok (x / y)</code>. Now we can use pattern matching to handle the result of the <code>div</code> function:</p> +<pre><code>let () = + let result = div 10 0 in + match result with + | Ok x -&gt; print_endline (string_of_int x) + | Error msg -&gt; print_endline msg +</code></pre> +<p>This is a pretty simple example. In OCaml there are also option types which have two variants: <code>Some</code> and <code>None</code>. The <code>Some</code> variant is used to wrap a value and the <code>None</code> variant is used to represent the absence of a values.</p> +<h2>Conclusion</h2> +<p>In conclusion, pattern matching is a versatile and useful technique that can simplify and improve many aspects of your code. Whether its a simple script or a complex application, pattern matching can help you write code that is more correct, concise, expressive, and maintainable.</p> +<p>Thanks for reading!</p> +<h2>Credits</h2> +<p>Thank you to the following people for proofreading and giving ideas for this article:</p> +<ul> +<li><a href="https://twitter.com/Zain_Wania">Zain Wania</a></li> +<li><a href="https://www.brendonovich.dev/">Brendan Allan</a></li> +<li><a href="https://github.com/yxshv">Yash</a></li> +<li><a href="https://github.com/nsttt">Néstor</a></li> +</ul> +<h2>Resources</h2> +<ul> +<li><a href="https://en.wikipedia.org/wiki/Pattern_matching">Pattern Matching - Wikipedia</a></li> +<li><a href="https://en.wikipedia.org/wiki/Algebraic_data_type">Algebraic Data Types - Wikipedia</a></li> +</ul> +Typesafe Database Queries on the Edgehttps://www.nexxel.dev/blog/typesafe-database/https://www.nexxel.dev/blog/typesafe-database/Edge computing is all the rage. Learn how to get typesafe access to data on the edge using Kysely, Prisma and PlanetScale.Sat, 12 Nov 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<h2>What is the Edge?</h2> +<p>Edge computing is the new hottest thing in the web dev ecosystem, and rightfully so. If you don't know what the edge computing is, it's a way to run your code as close to your users as possible through globally distributed edge servers. This results in really low latency and no cold starts. But to stay performant, they have a limited runtime and code size limitations (1 MB on <a href="https://developers.cloudflare.com/workers/platform/limits/#worker-size">Workers</a>).</p> +<h2>Prisma</h2> +<p><a href="https://prisma.io">Prisma</a> is an ORM that lets you write your database schema in it's special <code>.prisma</code> syntax.</p> +<p>It has first-class support for PostgreSQL, MySQL, SQLite, SQL Server, CockroachDB and even MongoDB. Prisma then generates TypeScript types based on the schema, which lets your query your database using the <a href="https://prisma.io/client">Prisma Client</a> in a typesafe manner. It's fantastic.</p> +<p><a href="https://prisma.io/migrate">Prisma Migrate</a> is another great tool from the Prisma team to run database migrations without hassle.</p> +<p>But it also has a lot of problems. The <a href="https://rust-lang.org">Rust</a> based core of Prisma is approximately a 13 MB binary. Which means in serverless environments, the cold start times are awful because it takes a lot of time to spin up the Prisma binary. And you can pretty much forget running Prisma on the edge.</p> +<h2>PlanetScale</h2> +<p><a href="https://planetscale.com">PlanetScale</a> is a serverless MySQL database provider which is based on <a href="https://vitess.io">Vitess</a>. You get the scaling benefits of Vitess without the need to manage it yourself.</p> +<p>The PlanetScale team recently released their <a href="https://github.com/planetscale/database-js">database driver</a> which lets your query your PlanetScale database using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/fetch">Fetch API</a>. This means you can use this library to query your database in edge environments which is HUGE.</p> +<p>Although it's a great library, it doesn't provide an typesafety.</p> +<h2>Kysely</h2> +<p>Enter <a href="https://github.com/koskimas/kysely">Kysely</a>. It's a typesafe SQL query builder. You give it your schema as a TypeScript type and you can get wonderful typesafety and autocomplete while using the query builder. Take a look at this GIF from the Kysely Readme.</p> +<p></p> +<p>It works in serverless and edge environments, even on <a href="https://deno.land">Deno</a>! It also has support for using the PlanetScale database driver using <a href="https://github.com/depot/kysely-planetscale">kysely-planetscale</a>. This is perfect.</p> +<p>The only problem is that defining schemas in TypeScript is rough. It also doesn't have anything like <a href="https://prisma.io/migrate">Prisma Migrate</a> to manage database migrations.</p> +<h2>The Idea</h2> +<p>Prisma is good at defining schemas, generating TypeScript types, and handling database migrations.</p> +<p>Kysely along with the PlanetScale database driver are good for writing SQL in a typesafe manner on the edge.</p> +<p>What if we combine both of these?</p> +<h2>Implementing the Idea</h2> +<p>Enough talking let's get to some actual code.</p> +<h3>Setting Up a Database on PlanetScale</h3> +<p>First create an account on PlanetScale and create a database. You can just sign in with your GitHub account and you're good to go.</p> +<h3>Setting Up Prisma</h3> +<p>I'll be using the newly released <a href="https://start.solidjs.com">SolidStart</a> but this should work in all frameworks that support edge environments such as <a href="https://nextjs.org">Next.js</a>, <a href="https://remix.run">Remix</a>, <a href="https://kit.svelte.dev/">SvelteKit</a>, etc.</p> +<p>Install Prisma and the Prisma Client.</p> +<pre><code>npm install -D prisma &amp;&amp; npm install @prisma/client +</code></pre> +<p>Now generate a <code>.env</code> file and a starter schema using <code>prisma init</code>.</p> +<pre><code>npx prisma init --datasouce-provider mysql +</code></pre> +<p>This command will create a <code>schema.prisma</code> file inside a <code>prisma</code> folder. It will also create a <code>.env</code> file. Add your connection string from PlanetScale in the <code>DATABASE_URL</code> variable.</p> +<pre><code>// prisma/schema.prisma + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} +</code></pre> +<p>Since PlanetScale, rather <a href="https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/">Vitess doesn't support foreign key constraints</a>, we need to set the <code>referentialIntegrity</code> property in prisma.</p> +<pre><code>// prisma/schema.prisma + +generator client { + provider = "prisma-client-js" + previewFeatures = ["referentialIntegrity"] +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + relationMode = "prisma" +} +</code></pre> +<p>Now make an <code>Example</code> model. Models in Prisma represent the tables in a SQL database.</p> +<pre><code>// prisma/schema.prisma + +generator client { + provider = "prisma-client-js" + previewFeatures = ["referentialIntegrity"] +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") + relationMode = "prisma" +} + +model Example { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + text String +} +</code></pre> +<p>Push this schema to PlanetScale using <code>prisma db push</code>.</p> +<pre><code>npx prisma db push +</code></pre> +<p>This command will also run <code>prisma generate</code> which generates the TypeScript types based on your schema. It is also recommended to add <code>prisma generate</code> as a <code>postinstall</code> in <code>package.json</code> so that whenever you install the dependencies, it will generate the types for you.</p> +<pre><code>// package.json + +"scripts": { + "postinstall": "prisma generate" +} +</code></pre> +<p>That is it for the Prisma setup.</p> +<h3>Setting Up Kysely</h3> +<p>Make sure you add the <code>DATABASE_USERNAME</code> and <code>DATABASE_PASSWORD</code> environment variables from PlanetScale.</p> +<p>Install Kysely, the Kysely PlanetScale Dialect, and the PlanetScale databse driver.</p> +<pre><code>npm install kysely kysely-planetscale @planetscale/database +</code></pre> +<p>Create a <code>src/server/db.ts</code> or whatever file makes sense to you and add the following code.</p> +<pre><code>// src/server/db.ts + +import type { Example } from "@prisma/client/edge"; +import { Kysely } from "kysely"; +import { PlanetScaleDialect } from "kysely-planetscale"; + +interface Database { + Example: Example; +} + +export const db = new Kysely&lt;Database&gt;({ + dialect: new PlanetScaleDialect({ + host: "aws.connect.psdb.cloud", + username: process.env.DATABASE_USERNAME, + password: process.env.DATABASE_PASSWORD, + }), +}); +</code></pre> +<p>Here we're importing the <code>Example</code> type that we had defined in our schema. If you go to definition of that type, you will see that that type has all the fields we had defined in our schema correctly typed.</p> +<pre><code>export type Example = { + id: string; + createdAt: Date; + updatedAt: Date; + text: string; +}; +</code></pre> +<p>The <code>Database</code> interface will contain all our types. So let's say we also have a <code>SecondExample</code> field in our database, we will have to import that type and add it in the <code>Database</code> interface. This is one of the limitations of this approach, it requires you to add new types manually.</p> +<p>Then we're exporting a Kysely instance that takes the <code>Database</code> interface as a generic. The <code>PlanetScaleDialect</code> tells Kysely to use the PlanetScale database driver to run the SQL queries.</p> +<h3>Using Kysely</h3> +<p>Note: This might look different in your framework but the Kysely code will be the same.</p> +<pre><code>// src/routes/index.tsx + +import { db } from "~/server/db"; + +export const routeData = () =&gt; { + return createServerData$(async () =&gt; { + const examples = await db + .selectFrom("Example") + .selectAll() + .orderBy("createdAt", "desc") + .execute(); + + console.log(examples); + + return examples; + }); +}; +</code></pre> +<p>You will notice which typing this is that it's all beautifully autocompleted for you. Everything is fully typesafe.</p> +<p>SolidStart also has end-to-end typesafety, so even in the UI code, the typesafety is maintained. This is similar to Remix patterns. I'm also using <a href="https://github.com/unocss/unocss">UnoCSS</a> in this example.</p> +<pre><code>// src/routes/index.tsx + +export default function Home() { + const examples = useRouteData&lt;typeof routeData&gt;(); + + return ( + &lt;main class="flex flex-col items-center h-screen bg-#050505 font-sans"&gt; + &lt;div class="flex flex-col gap-y-2"&gt; + &lt;For each={examples()}&gt; + {(example) =&gt; { + return &lt;p class="text-white"&gt;{example.text}&lt;/p&gt;; + }} + &lt;/For&gt; + &lt;/div&gt; + &lt;/main&gt; + ); +} +</code></pre> +<p>You will notice that we didn't have to write any types ourselves for this. Everything is typesafe and we didn't even write any TypeScript. It's all inferred.</p> +<h3>Limitations</h3> +<p>This way of doing things can break when using <a href="https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#map"><code>@map</code></a> because the casing is different in the types. It also doesn't support <a href="https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields#working-with-decimal"><code>Prisma.Decimal</code></a> because you have to use the special Prisma object to use it. <a href="https://github.com/marklawlor">Mark Lawlor</a> has some insane TypeScript code to work around this problem but it's still very "hacky". You can see his gist <a href="https://gist.github.com/marklawlor/b1c26eefba43539c6611a508e67ee02f">here</a>.</p> +<p>Update: A wonderful package called <a href="https://github.com/valtyr/prisma-kysely"><code>prisma-kysely</code></a> created by <a href="https://valtyr.is/">Valtýr</a> does all of this for you. You should probably use it instead of the approach I've shown here.</p> +<h2>Conclusion</h2> +<p>Hopefully that all made sense. I think it is pretty cool. That's it really. Thanks for reading!</p> +My Developer Workflow Using WSL, tmux and Neovimhttps://www.nexxel.dev/blog/wsl-workflow/https://www.nexxel.dev/blog/wsl-workflow/I live on the terminal now. Learn about the tools I use set up a productive developer environment.Tue, 16 Aug 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p></p> +<p>Hi! Today I'm gonna talk about my daily developer workflow and all the tools I use to set up a productive enviroment for coding. I think having a nice looking terminal and some tools to save time are really helpful to keep you productive in daily coding sessions.</p> +<h2>Operating System</h2> +<p>I use Windows and it's pretty much unusable for programming. Thankfully Microsoft understood that and made <a href="https://docs.microsoft.com/en-us/windows/wsl/">Windows Subsystem for Linux</a> also known as <code>WSL</code> in short. It lets you run a Linux distribution inside of Windows.</p> +<p>I use <a href="https://ubuntu.com/">Ubuntu</a>, it's the default distribution that is installed with <code>WSL</code>. Ubuntu is really simple to use and has a huge community so getting support is very easy. I highly recommend it for anyone who wants to start using Linux and get familiar with basic Linux commands.</p> +<h2>Shell</h2> +<p>Ubuntu by default comes with the bash shell. Bash is great but I personally find it harder to customize. That is why I use <a href="https://zsh.org/">Z shell</a>, more commonly known as <code>zsh</code>. To manage my <code>zsh</code> configuration, I use <a href="https://ohmyz.sh/">Oh My Zsh</a>. It has a huge community and makes it trivial to install and use plugins.</p> +<p>I used to use <a href="https://fishshell.com/">fish</a> which is also a great shell. It has very sensible defaults and comes with a lot of cool features like autosuggestions, tab completions, etc. out of the box without the need to set up anything. The only problem with fish is that it is not <code>POSIX-compliant</code>. <a href="https://en.wikipedia.org/wiki/POSIX">POSIX</a> is a set of standards that define how to develop programs for UNIX based operating systems. So in fish, things like bash scripts do not work. They have their own scripting language.</p> +<p><code>zsh</code> on the other hand is fully POSIX-compliant. This is why I switched to <code>zsh</code> and I'm quite happy with it so far.</p> +<h2>Prompt</h2> +<p>I use <a href="https://starship.rs/">Starship</a> for my prompt and it is AMAZING. Written in <a href="https://rust-lang.org/">Rust</a>, Starship is a minimal, highly customizable and super fast prompt. The default look of it is really good but literally every little detail is customizable to your liking. To install Starship refer to these <a href="https://starship.rs/guide/#%F0%9F%9A%80-installation">docs</a>.</p> +<p>The configuration file for Starship lives in <code>~/.config/starship.toml</code>. Here's my <code>starship.toml</code>.</p> +<pre><code># ~/.config/starship.toml + +[aws] +symbol = " " + +[conda] +symbol = " " + +[dart] +symbol = " " +format = "via [$symbol]($style)" + +[directory] +read_only = " " +truncation_length = 1 + +[docker_context] +symbol = " " + +[elixir] +symbol = " " +format = 'via [$symbol]($style)' + +[elm] +symbol = " " + +[git_branch] +symbol = " " + +[golang] +symbol = " " +format = 'via [$symbol]($style)' + +[hg_branch] +symbol = " " + +[java] +symbol = " " +format = 'via [$symbol]($style)' + +[julia] +symbol = " " + +[memory_usage] +symbol = " " + +[nim] +symbol = " " + +[nix_shell] +symbol = " " + +[nodejs] +symbol = " " +format = 'via [$symbol]($style)' + +[package] +symbol = " " + +[perl] +symbol = " " + +[php] +symbol = " " + +[python] +symbol = " " +format = 'via [$symbol]($style)' + +[ruby] +symbol = " " + +[rust] +format = 'via [$symbol]($style)' + +[scala] +symbol = " " + +[shlvl] +symbol = " " + +[swift] +symbol = "ﯣ " +format = 'via [$symbol]($style)' + +[git_status] +disabled = true +</code></pre> +<p>The icons aren't showing up here because you need a <a href="https://github.com/ryanoasis/nerd-fonts">nerd font</a> for that. If you set up a Nerd Font (I recommend <a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/Hack">Hack</a>), and copy this configuration, you'll get a very minimal looking prompt like this. For more information on configuring Starship, you can look at the docs <a href="https://starship.rs/config/">here</a>.</p> +<p></p> +<p>Having a nice looking terminal always helps!</p> +<h2>Persistent Terminal Sessions with tmux</h2> +<p><a href="https://en.wikipedia.org/wiki/Tmux">tmux</a> is a terminal multiplexer. It lets you have multiple persistent terminal sessions and come back to them without terminating the existing running processes. So you can return to a workspace, exactly where you left it. It also allows you to manage multiple windows and panes inside a session.</p> +<p>For example, to go to my website's workspace, I just have to type <code>website</code> and I'm there.</p> +<p></p> +<p>Here <code>website</code> is an alias I've set up to open the <code>website</code> tmux session.</p> +<pre><code># .zshrc + +alias website="tmux attach-session -t website" +</code></pre> +<p>This way I can jump into any one of my workspaces really quickly and start coding. It also helps that I'm exactly where I left off. I highly recommend tmux for local development, it has changed how I work and increased my productivity by a massive amount.</p> +<h2>Neovim</h2> +<p>I had been using <a href="https://code.visualstudio.com/">VSCode</a> as my code editor since the first day I started learning programming, but recently I have switched to <a href="https://neovim.io/">Neovim</a>. It is a modern version of <a href="https://www.vim.org/">Vim</a>.</p> +<p>Neovim is the best code editor for me because of its speed and ease of customization. All the configuration is written in <a href="https://www.lua.org/">Lua</a>, which is very easy to learn and write. It helps me be really fast and productive because I never have to take my hands off of my keyboard.</p> +<p>You can find my Neovim configuration <a href="https://github.com/nexxeln/nvim">here</a>. It's just a fork of <a href="https://github.com/craftzdog/dotfiles-public">craftzdog's configuration</a>.</p> +<p></p> +<p></p> +<h2>zoxide</h2> +<p>You might have seen in some of the screenshots that I just have to run <code>z license-generator</code> to jump to that directory. That is <a href="https://github.com/ajeetdsouza/zoxide"><code>zoxide</code></a>. Also written in <a href="https://rust-lang.org/">Rust</a>, it's a smarted <code>cd</code> command that remembers which directories you visit frequently, so you can jump to those directories with just one command.</p> +<p></p> +<p>The above GIF is from the <a href="https://github.com/ajeetdsouza/zoxide">zoxide GitHub repository</a>. Use <code>zoxide</code> to never go back to <code>cd</code> hell again.</p> +<h2>exa</h2> +<p><a href="https://github.com/ogham/exa"><code>exa</code></a> is a modern replacement of the <code>ls</code> command. I always find myself using <code>exa</code> to get familiar with the files in a new codebase.</p> +<p></p> +<p></p> +<p>As you can see in the screenshot, <code>exa</code> has a more readable output with colors and icons which you can look at and instantly know the filetypes of different files. It is also noticeably faster than <code>ls</code>.</p> +<p>It also has a <a href="https://github.com/ogham/exa#command-line-options">lot of flags</a> which display the data is different formats. Here are the aliases I've set up for <code>exa</code>.</p> +<pre><code># .zshrc + +alias ll="exa -l -g --icons --git" +alias llt="exa -1 --icons --tree --git-ignore" +</code></pre> +<h2>Conclusion</h2> +<p>That was a quick overview of all the tools I use on a day-to-day basis for coding. I think it's really important to spend some time working on your workflow and coding setup, it will make you faster over time. I hope you found the tools I listed useful and will incorporate them in your workflow too!</p> +<p>Thanks for reading!</p> +T3 Stack and My Most Popular Open Source Project Everhttps://www.nexxel.dev/blog/ct3a/https://www.nexxel.dev/blog/ct3a/create-t3-app recently reached 100 stars on GitHub and is my most popular open source project. Learn more about it!Mon, 27 Jun 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p><a href="https://github.com/nexxeln/create-t3-app">create-t3-app</a> recently reached 90 stars on GitHub and is my most popular open source project with a lot of people contributing. Now you may be wondering, what the hell is it? Let's take a look at the t3 stack and how you can use create-t3-app.</p> +<h2>T3 stack</h2> +<p>The T3 stack was made by <a href="https://www.youtube.com/c/TheoBrowne1017">Theo</a> who is a really cool dev and makes awesome content on YouTube. The stack consists of:</p> +<ul> +<li><a href="https://nextjs.org">Next.js</a></li> +<li><a href="https://trpc.io">tRPC</a></li> +<li><a href="https://tailwindcss.com">TailwindCSS</a></li> +<li><a href="https://typescriptlang.org">TypeScript</a></li> +<li><a href="https://prisma.io">Prisma</a></li> +</ul> +<p>I love this stack, if you want to know more about them checkout <a href="https://init.tips">init.tips</a> and <a href="https://twitter.com/DhravyaShah/status/1540589276810711040">this twitter thread</a> from @dhravya.</p> +<p>The only downside of this stack is the boilerplate, I had to open the docs, install all the packages, create a bunch of files just to set it up.</p> +<p>Theo had also mentioned on stream how it would be very convenient to set up a project just by running <code>npx create-t3-app</code>. So I did just that!</p> +<h2>create-t3-app</h2> +<p><code>create-t3-app</code> makes it really convenient to scaffold a starter project using the T3 stack.</p> +<h3>Usage</h3> +<pre><code>npx create-t3-app@latest +# or +yarn create t3-app +# or +pnpm create t3-app@latest +</code></pre> +<p>It will let you select the packages you want and install them and create all the files those packages need.</p> +<p>I started working on the CLI in May and back then I had no experience with Node CLIs, but it was definitely a great learning experience for me.</p> +<p>Now the project has matured a lot and it's amazing to see Theo's community opening issues and contributing everyday, it's really great.</p> +<h2>Maintaining Open Source</h2> +<p>I have a lot of respect for OSS maintainers now because honestly, it is a really hard job. Looking at issues, reviewing and discussing PRs, it's definitely a bit tiring.</p> +<p>I recently had burnout from this and took a 2 day break and just built a bunch of static sites. Theo's community is awesome though, we agree on most things and I rarely write code for the CLI now, people just open issues and make PRs, I just have to review and merge them.</p> +<p>Overall this project has been a really great experience, I learnt so many things, from node CLIs to maintaining open source. Please do try the CLI out and open issues if you find bugs.</p> +<ul> +<li>Github: <a href="https://github.com/nexxeln/create-t3-app">nexxeln/create-t3-app</a></li> +<li>Website: <a href="https://create.t3.gg">create.t3.gg</a></li> +<li>T3 Stack: <a href="https://init.tips">init.tips</a></li> +<li>Theo: <a href="https://twitter.com/t3dotgg">twitter.com/t3dotgg</a></li> +</ul> +<p>Thank you for reading!</p> +Create Licenses for Your Projects Right from the Terminalhttps://www.nexxel.dev/blog/gen-license/https://www.nexxel.dev/blog/gen-license/I made a CLI in Rust to generate licenses for open source projects.Fri, 25 Mar 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue"; +import { createHeading } from "../../components/Heading";</p> +<p>export const components = { +a: Link, +code: Code, +h1: createHeading("h1"), +h2: createHeading("h2"), +h3: createHeading("h3"), +};</p> +<p>I'm the type of person who is constantly working on open source projects. But whenever I create a new repository, I haven't yet decided what license I should put the code under. So, I always had to add it at the end when I have pushed all the code. But it was just too much work: go to GitHub, click <code>Create File</code>, type <code>LICENSE</code>, choose the license and then push it and finally pull the changes locally. So I decided to make a CLI License Generator, in Rust.</p> +<p>This was a nice project to build since I hadn't written Rust code in a while, so it was a good refresher.</p> +<h2>Introducing gen-license</h2> +<p></p> +<p>It's as simple as that, it even automatically gets your username from your global git config file!</p> +<p>Here's the source code: <a href="https://github.com/nexxeln/license-generator">nexxeln/license-generator</a>.</p> +<h2>Installation</h2> +<pre><code>cargo install gen-license +</code></pre> +<p>If you don't have cargo installed, you can download the executable from the <a href="https://github.com/nexxeln/license-generator/releases">releases</a> section of the GitHub repository.</p> +<h2>Usage</h2> +<pre><code>gen-license +</code></pre> +<p>That's pretty much it! Thank you for reading this far. If you want me to explain some of the code behind this, feel free to ask in the comment section.</p> +<p>Please do give your feedback and leave a star on <a href="https://github.com/nexxeln/license-generator">GitHub</a> if you liked it!</p> +I Made a Wordle Clonehttps://www.nexxel.dev/blog/nexdle/https://www.nexxel.dev/blog/nexdle/Nexdle is a wordle clone made with React, TypeScript, TailwindCSS, Vite, Zustand and tested with Vitest.Mon, 21 Mar 2022 00:00:00 GMT<p>import Link from "../../components/Link.vue"; +import Code from "../../components/Code.vue";</p> +<p>export const components = { a: Link, code: Code };</p> +<p>Yes that's right, another wordle clone. You can play it <a href="https://nexdle.nexxel.dev/">here</a>.</p> +<p><a href="https://nexdle.nexxel.dev/">nexdle</a> is a <a href="https://www.nytimes.com/games/wordle/index.html">wordle</a> clone made with <a href="https://reactjs.org/">React</a>, <a href="https://www.typescriptlang.org/">TypeScript</a>, <a href="https://tailwindcss.com/">TailwindCSS</a>, <a href="https://vitejs.dev/">Vite</a>, <a href="https://github.com/pmndrs/zustand">Zustand</a> and tested with <a href="https://vitest.dev/">Vitest</a>.</p> +<p>This project was a great learning experience for me. Things I learnt while making nexdle:</p> +<ul> +<li>CSS Grids</li> +<li>Using state management libraries (<a href="https://github.com/pmndrs/zustand">Zustand</a> in this case)</li> +<li>Using testing tools like Jest (<a href="https://vitest.dev/">Vitest</a> in this case)</li> +</ul> +<p>Before this I had made a simple <a href="https://github.com/nexxeln/todo-app">todo-app</a> to get comfortable with using TypeScript in React projects. Now after using it for 2 projects, I'm absolutely in love with it. TypeScript is just so good for catching errors before shipping the app to production, and the autocomplete you get is just crazy. It takes the developer experience to a whole another level.</p> +<p>I used TailwindCSS for all the styling because lets face it, CSS is really +fricking hard. Tailwind just makes it really simple and quick to make a stunning +ui. Just add pre-built CSS utility classes and you're good to go!</p> +<p>I didn't use <code>create-react-app</code> for this project. Instead I used Vite. +Vite is a module bundler, just like webpack. Since I've come across Vite, I +haven't gone back to <code>create-react-app</code>. It's just faster, has less dependencies +so the build size is less. If you haven't tried it yet, I highly recommend you +do!</p> +<p>I finally learnt how to use state management libraries. In this project I used Zustand, +which is like a bare bones version of <a href="https://redux.js.org/">Redux</a>. It's better +than using the Context API as its less boilerplatey. I figured for a small project +I don't really need to use a heavy library like Redux.</p> +<p>A few weeks ago I learnt how to use <a href="https://jestjs.io/">Jest</a> and I was really excited to try it out here. But I found out that it wasn't compatible with Vite. So I found this really awesome library called Vitest. Honestly, testing was the most fun part of the whole project. It helps you catch bugs before production and is just really fun to do.</p> +<p></p> +<p>Vitest also has this crazy ui testing option, I haven't explored it a lot but it's just insane. Check this out:</p> +<p> +I also uploaded this gif to <a href="https://youtu.be/2GLYNV5cQ-Y">YouTube</a> since it's kind +of long. You can watch it there if you prefer that.</p> +<p>So that's it for this blog. All the code for nexdle can be found <a href="https://github.com/nexxeln/nexdle/">here</a>.</p> +<p>If you made it this far thanks for reading!</p> + \ No newline at end of file diff --git a/cached-feeds/taylor.xml b/cached-feeds/taylor.xml index b405706..b2917d7 100644 --- a/cached-feeds/taylor.xml +++ b/cached-feeds/taylor.xml @@ -11,7 +11,7 @@ https://taylor.town/ taylor.town - 2023-09-01T15:38:54.070031Z + 2023-12-26T16:44:47.941101Z email me.

    @@ -3019,9 +3095,379 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le +★★★★ +review + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +★★★ +review - + +★★★★ +review +★★★★ +review +★ +review +★★ +review - + +★★ +review +★ +review +★★★ +review +★★ +review +★★★ +review +★ +review +★★ +review +★★ +review +★★★ +review +★★★★ +review +★★ +review +★★★★ +review +★★★★ +review + +review - + +★★★★ +review +★★ +review +★★ +review +★★★ +review +★★★★ +review +★★★★ +review - + +★★★★ +review +★★★ +review +★★ +review +★★★★ +review - + +★★★★ +review - + +★★★ +review +★★ +review - + - + +★★ +review +★★ +review - + +★★ +review +★★ +review +★★★ +review +★★★ +review +★★★ +review +★★ +review - + +★★★ +review +★★★ +review +★★★ +review +★★★★ +review +★★★ +review +★★★★ +review +★★★★ +review - + +★★★★ +review - + +★★★★ +review +★★★★ +review +★★★★ +review +★★★ +review - + +★★ +review +★★★★ +review +★★★★ +review +★★★ +review +★★★★ +review - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -review -★★☆☆☆ +2023-12-24 +We Have Always Lived In The Castle :: Shirley Jackson
    +★★★ +review +2023-12-21 +Radical Acceptance :: Tara Brach
    +★★ +review +2023-12-19 +Turn of the Screw :: Henry James
    +★★★★ +review +2023-12-12 +Train Dreams :: Denis Johnson
    +★★★★★ +review +2023-12-09 +White Teeth :: Zadie Smith
    +★★★ +review +2023-11-26 +The Trial :: Franz Kafka
    +★★ +review +2023-11-25 +Lucky Jim :: Kingsley Amis
    +★ +review +2023-11-25 +High Rise :: J.G. Ballard
    +★★★ +review +2023-11-25 +Things Fall Apart :: Chinua Achebe
    +★★★★ +review +2023-11-23 +How to Win Friends and Influence People :: Dale Carnegie
    +★★★ +review +2023-11-10 +Jonathan Strange & Mr. Norrell :: Susanna Clarke
    +★★★★ +review +2023-11-07 +Piranesi :: Susanna Clarke
    +★★★★ +review +2023-10-26 +All The Birds In The Sky :: Charlie Jane Anders
    +★★★★ +review +2023-10-23 +No One Is Talking About This :: Patricia Lockwood
    +★★★★★ +review +2023-10-20 +East of Eden :: John Steinbeck
    +★★★ +review +2023-10-12 +The Structure of Scientific Revolutions :: Thomas S. Kuhn
    +★★ +review +2023-10-10 +The Body :: Bill Bryson
    +★★★★ +review +2023-10-03 +Storm Front :: Jim Butcher
    +★★★★★ +review +2023-10-01 +Men, Machines, and Modern Times :: Elting E. Morison
    +★★★ +review +2023-09-16 +Breath :: James Nestor
    +★★ +review +2023-09-18 +The Nature of Oaks :: Douglas W. Tallamy
    +★★ +review +2023-09-18 +Writing Down the Bones :: Natalie Goldberg
    +★★ +review +2023-09-19 +The Moon is a Harsh Mistress :: Robert A. Heinlein
    +★★★★★ +review +2023-09-20 +The Timeless Way of Building :: Christopher Alexander
    +★★★ +review +2023-09-25 +Accelerando :: Charles Stross
    +★★★ +review +2023-09-28 +Permutation City :: Greg Egan
    +★★★ +review +2023-09-29 +On Having No Head :: Douglas Edison Harding
    +★★★★ +review +2023-09-15 +When Things Fall Apart :: Pema Chödrön
    +★★★ +review +2023-09-14 +A Walk in the Woods :: Bill Bryson
    +★★★ +review +2023-09-12 +Adult Children of Emotionally Immature Parents :: Lindsay Gibson
    +★ +review +2023-09-11 +If You Could See The Sun :: Ann Liang
    +★★ +review +2023-09-10 +Extra Virginity :: Tom Mueller
    +★★★★★ +review +2023-09-09 +Player Piano :: Kurt Vonnegut
    +★★★★ +review +2023-09-05 +Restoration Agriculture :: Mark Shepard
    +★★★ +review +2023-09-04 +No Logo :: Naomi Klein
    +★★ +review +2023-09-02 +The Shadow of What Was Lost :: James Islington
    +★★ +review +2023-09-01 +Orbiting the Giant Hairball :: Gordon MacKenzie
    +★★ +review 2023-08-23 @@ -3029,9 +3475,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-08-22 @@ -3039,19 +3485,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-08-21 The Omnivore's Dilemma :: Michael Pollan
    -review -★★★★☆ 2023-08-18 @@ -3059,9 +3505,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-08-12 @@ -3069,9 +3515,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★☆☆☆☆ 2023-08-09 @@ -3079,9 +3525,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-08-08 @@ -3089,19 +3535,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-08-08 The Diamond Age :: Neal Stephenson
    -review -★★☆☆☆ 2023-08-02 @@ -3109,9 +3555,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★☆☆☆☆ 2023-08-01 @@ -3119,9 +3565,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-07-29 @@ -3129,9 +3575,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-07-24 @@ -3139,9 +3585,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-07-23 @@ -3149,9 +3595,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★☆☆☆☆ 2023-07-21 @@ -3159,9 +3605,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-07-21 @@ -3169,9 +3615,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-07-19 @@ -3179,9 +3625,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-07-17 @@ -3189,9 +3635,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-07-15 @@ -3199,9 +3645,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-07-11 @@ -3209,9 +3655,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-06-29 @@ -3219,9 +3665,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-06-25 @@ -3229,9 +3675,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -☆☆☆☆☆ 2023-06-11 @@ -3239,19 +3685,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-06-09 The Grapes of Wrath :: John Steinbeck
    -review -★★★★☆ 2023-06-08 @@ -3259,9 +3705,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-05-25 @@ -3269,9 +3715,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-05-22 @@ -3279,9 +3725,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-05-17 @@ -3289,9 +3735,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-05-15 @@ -3299,9 +3745,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-05-13 @@ -3309,19 +3755,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-05-11 Breakfast of Champions :: Kurt Vonnegut
    -review -★★★★☆ 2023-05-10 @@ -3329,9 +3775,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-05-09 @@ -3339,9 +3785,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-05-09 @@ -3349,9 +3795,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-05-09 @@ -3359,19 +3805,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-05-01 Exhalation: Stories :: Ted Chiang
    -review -★★★★☆ 2023-04-26 @@ -3379,19 +3825,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-04-05 How We Got To Now :: Steven Johnson
    -review -★★★☆☆ 2023-04-03 @@ -3399,9 +3845,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-04-03 @@ -3409,29 +3855,29 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-04-01 Tomorrow, and Tomorrow, and Tomorrow :: Gabrielle Zevin
    -review ★★★★★ +review 2023-03-27 A Confederacy of Dunces :: John Kennedy Toole
    -review -★★☆☆☆ 2023-03-26 @@ -3439,9 +3885,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-03-23 @@ -3449,19 +3895,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-03-16 Anything You Want :: Derek Sivers
    -review -★★☆☆☆ 2023-03-12 @@ -3469,9 +3915,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-03-12 @@ -3479,9 +3925,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-03-07 @@ -3489,9 +3935,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-03-02 @@ -3499,9 +3945,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-03-02 @@ -3509,9 +3955,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★☆☆☆ 2023-02-22 @@ -3519,19 +3965,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-02-13 The Anthropocene Reviewed :: John Green
    -review -★★★☆☆ 2023-02-13 @@ -3539,9 +3985,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-02-09 @@ -3549,9 +3995,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-02-05 @@ -3559,9 +4005,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-02-02 @@ -3569,9 +4015,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2023-01-27 @@ -3579,9 +4025,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-01-26 @@ -3589,9 +4035,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2023-01-24 @@ -3599,19 +4045,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2023-01-21 Norwegian Wood :: Haruki Murakami
    -review -★★★★☆ 2023-01-18 @@ -3619,19 +4065,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2022-12-25 The Handmaid's Tale :: Margaret Atwood
    -review -★★★★☆ 2022-12-19 @@ -3639,9 +4085,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2022-12-04 @@ -3649,9 +4095,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2022-11-27 @@ -3659,9 +4105,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2022-11-19 @@ -3669,19 +4115,19 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2022-11-13 Metamorphosis :: Franz Kafka
    -review -★★☆☆☆ 2022-10-30 @@ -3689,9 +4135,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2022-10-16 @@ -3699,9 +4145,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2022-10-09 @@ -3709,9 +4155,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★☆☆ 2022-10-02 @@ -3719,9 +4165,9 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review -★★★★☆ 2022-09-02 @@ -3729,2137 +4175,439 @@ https://audiobookbay.is/abss/ursulab-k-le-guin-audio-book-collection-ursula-k-le
    -review ★★★★★ +review 2022-08-18 The Good Earth :: Pearl S. Buck
    - -★★★☆☆ -2022 -Cryptonomicon :: Neal Stephenson
    - -★★★☆☆ -2022 -Neverwhere :: Neil Gaiman
    - -☆☆☆☆☆ -2022 -Anything You Want :: Derek Sivers
    - -☆☆☆☆☆ -2022 -How to Live :: Derek Sivers
    - -☆☆☆☆☆ -2022 -Sum: Tales from the Afterlives :: David Eagleman
    - -☆☆☆☆☆ -2022 -Let It Rot! :: Stu Campbell
    - -☆☆☆☆☆ -2022 -The Resilient Farm and Homestead :: Falk
    - -☆☆☆☆☆ -2022 -Gardening Under Lights :: Halleck
    - -☆☆☆☆☆ -2022 -Digital Minimalism :: Cal Newport
    - -☆☆☆☆☆ -2022 -So Good They Can't Ignore You :: Cal Newport
    - -☆☆☆☆☆ -2022 -Discovering Japanese Handplanes :: Scott Wynn
    - -☆☆☆☆☆ -2022 -Japanese Woodworking Tools :: Toshio Odate
    - -☆☆☆☆☆ -2022 -The Care And Use Of Japanese Woodworking Tools :: Kip Mesirow and Ron Herman
    - -☆☆☆☆☆ -2022 -Hand Tools :: Aldren A. Watson
    - -☆☆☆☆☆ -2022 -The Minimalist Woodworker :: Vic Tessolin
    - -☆☆☆☆☆ -2022 -Furnitechture :: Anna Yudina
    - -★★★☆☆ -2022 -Anathem :: Neal Stephenson
    - -★☆☆☆☆ -2022 -How To Talk About Books You Haven't Read :: Pierre Bayard
    - -★★★☆☆ -2021 -Name of the Wind :: Patrick Rothfuss
    - -☆☆☆☆☆ -2020 -Mistborn: The Hero of Ages :: Brandon Sanderson
    - -☆☆☆☆☆ -2020 -Mistborn: The Well of Ascension :: Brandon Sanderson
    - -☆☆☆☆☆ -2020 -Mistborn: The Final Empire :: Brandon Sanderson
    - -★★★★☆ - -Sapiens :: Yuval Noah Harari
    - -★★★☆☆ - -Zero to One :: Peter Tiel
    - -★★★☆☆ - -How to Stop Worrying and Start Living :: Dale Carnegie
    - -★★☆☆☆ - -Talking to Strangers :: Malcolm Gladwell
    - -★★★★★ - -Catch-22 :: Joseph Heller
    - -★★★☆☆ - -The Tao is Silent :: Raymond Smullyan
    - -★★★★☆ - -Seveneves :: Neal Stephenson
    - -☆☆☆☆☆ - -The Rise of Theodore Roosevelt :: Edmund Morriss
    - -☆☆☆☆☆ - -Distrust That Particular Flavor :: William Gibson
    - -★★★☆☆ - -The Circle :: Dave Eggers
    - -★★★★☆ - -Hell Yeah or No :: Derek Sivers
    - -★★☆☆☆ - -12 Rules for Life :: Jordan Peterson
    - -★★☆☆☆ -2020 -Ready, Player One :: Ernest Cline
    - -★★★★★ -2019 -Snowcrash :: Neal Stephenson
    - -☆☆☆☆☆ -2019 -Dirk Gentley's Holistic Detective Agency :: Douglas Adams
    - -☆☆☆☆☆ -2019 -Annihilation :: Jeff VanderMeer
    - -★★☆☆☆ -2019 -The Curious Incident of the Dog in the Night Time :: Mark Haddon
    - -★★★☆☆ -2019 -Daemon :: Daniel Suarez
    - -☆☆☆☆☆ -2019 -High-Tech Heretic :: Cliff Stoll
    - -☆☆☆☆☆ -2019 -Smalltalk-80
    - -★★★☆☆ -2018 -The Broom of the System :: David Foster Wallace
    - -☆☆☆☆☆ -2018 -Consider the Lobster :: David Foster Wallace
    - -☆☆☆☆☆ -2018 -A Supposedly Fun Thing I'll Never Do Again :: David Foster Wallace
    - -☆☆☆☆☆ -2018 -Starting Strength: Basic barbell Training :: Mark Rippetoe
    - -★★★☆☆ - -Dune :: Frank Herbert
    - -☆☆☆☆☆ - -Trigger Warning :: Neil Gaiman
    - -☆☆☆☆☆ - -The Lies of Loch Lamorah :: Scott Lynch
    - -☆☆☆☆☆ - -The Information :: James Gleick
    - -☆☆☆☆☆ - -Benjamin Franklin :: Walter Isaacson
    - -☆☆☆☆☆ - -Awaken the Giant Within :: Tony Robbins
    - -☆☆☆☆☆ - -The Mythical Man Month :: Fred Brooks
    - -☆☆☆☆☆ -2017 -The Graveyard Book :: Neil Gaiman
    - -☆☆☆☆☆ -2017 -To Mock a Mockingbird :: Raymond Smullyan
    - -☆☆☆☆☆ - -On the Shortness of Life :: Seneca
    - -☆☆☆☆☆ - -To Mock a Mockingbird :: Raymond Smullyan
    - -☆☆☆☆☆ - -Antifragile :: Nassim Taleb
    - -☆☆☆☆☆ - -V for Vendetta :: Alan Moore
    - -☆☆☆☆☆ - -Watchmen :: Alan Moore
    - -★★★☆☆ - -Rise & Fall of Dinosaurs :: Steve Brusatte
    - -★★★★☆ - -The Tao of Poo :: Benjamin Hoff
    - -☆☆☆☆☆ - -Thinking, Fast and Slow :: Kahneman
    - -★★★★★ - -Tao Te Ching :: Lao Tzu
    - -★★★★★ - -How to Win Friends and Influence People :: Dale Carnegie
    - -☆☆☆☆☆ -2015 -Let's Explore Diabetes with Owls :: David Sedaris
    - -☆☆☆☆☆ -2015 -Musashi :: Yoshikawa
    - -☆☆☆☆☆ -2015 -Faster :: Gleick
    - -★★★★★ -2015 -Guns, Germs, and Steel :: Jared Diamond
    - -☆☆☆☆☆ -2015 -Metamagical Themas :: Douglas Hofstadter
    - -☆☆☆☆☆ -2015 -Spark Joy :: Marie Kondo
    - -☆☆☆☆☆ -2014 -Contagious :: Jonah Berger
    - -☆☆☆☆☆ -2014 -Love Does :: Goff
    - -☆☆☆☆☆ -2014 -Sex Drugs and Cocoa Puffs :: Klosterman
    - -☆☆☆☆☆ -2014 -The Tao is Silent :: Smullyan
    - -☆☆☆☆☆ -2014 -American Gods :: Gaiman
    - -☆☆☆☆☆ -2014 -Business Adventures :: Brooks
    - -☆☆☆☆☆ -2014 -A Supposedly Fun Thing I'll Never Do Again :: David Foster Wallace
    - -☆☆☆☆☆ -2014 -The Power of Habit :: Charles Duhigg
    - -☆☆☆☆☆ -2014 -I am a Strange Loop :: Douglas Hofstadter
    - -☆☆☆☆☆ -2014 -The Paradox of Choice :: Schwartz
    - -☆☆☆☆☆ -2014 -The Black Swan :: Nassim Taleb
    - -☆☆☆☆☆ -2014 -The 4-Hour Body :: Ferriss
    - -☆☆☆☆☆ -2014 -The Innovators :: Isaacson
    - -☆☆☆☆☆ -2014 -The Life-Changing Magic of Tidying Up :: Kondo
    - -☆☆☆☆☆ -2014 -What Do You Care What Other People Think? :: Richard Feynmann
    - -☆☆☆☆☆ -2014 -Surely You're Joking, Mr. Feynmann! :: Richard Feynmann
    - -☆☆☆☆☆ -2014 -Being Taoist :: Wong
    - -☆☆☆☆☆ -2014 -Antifragile :: Taleb
    - -☆☆☆☆☆ -2014 -How We Got to Now :: Johnson
    - -☆☆☆☆☆ -2014 -Waking Up :: Harris
    - -☆☆☆☆☆ -2014 -The Martian :: Weir
    - -☆☆☆☆☆ -2014 -Learning to Silence the Mind :: Osho
    - -☆☆☆☆☆ -2014 -Managing Oneself :: Drucker
    - -☆☆☆☆☆ -2014 -Smartcuts :: Snow
    - -☆☆☆☆☆ -2014 -Ignore Everybody :: MacLeod
    - -☆☆☆☆☆ -2014 -What If? :: Munroe
    - -☆☆☆☆☆ -2014 -The Fountainhead :: Rand
    - -☆☆☆☆☆ -2014 -Dropping Ashes on the Buddha :: Sahn
    - -☆☆☆☆☆ -2014 -The Alchemist :: Cohelo
    - -★☆☆☆☆ -2013 -Gifted Hands :: Ben Carson
    - -☆☆☆☆☆ -2013 -Oedipus Rex :: Sophocles
    - -☆☆☆☆☆ -2013 -Zhuangzi
    - -☆☆☆☆☆ -2013 -Agricola :: Tacitus
    - -☆☆☆☆☆ -2013 -David and Goliath :: Gladwell
    - -☆☆☆☆☆ -2013 -Theodore Roosevelt: His Essential Wisdom :: Gangi
    - -☆☆☆☆☆ -2013 -Without their Permission :: Ohanian
    - -☆☆☆☆☆ -2013 -The Bad Beginning :: Snicket
    - -★☆☆☆☆ -2013 -Think Big and Kick Ass :: Trump
    - -☆☆☆☆☆ -2013 -Oedipus Rex :: Sophocles
    - -☆☆☆☆☆ -2013 -Foundation :: Asimov
    - -☆☆☆☆☆ -2013 -Second Foundation :: Asimov
    - -☆☆☆☆☆ -2013 -Foundation's Edge :: Asimov
    - -☆☆☆☆☆ -2013 -Ender's Game :: Card
    - -☆☆☆☆☆ -2013 -Speaker for the Dead :: Card
    - -☆☆☆☆☆ -2013 -Think Like a Freak :: Levitt & Dubner
    - -☆☆☆☆☆ -2012 -Moonwalking with Einstein :: Foer
    - -☆☆☆☆☆ -2012 -Siddhartha :: Hesse
    - -☆☆☆☆☆ -2012 -A Visual Dictionary of Architecture :: Ching
    - -☆☆☆☆☆ -2012 -The Republic :: Plato
    - -☆☆☆☆☆ -2012 -This is a Book :: Martin
    - -☆☆☆☆☆ -2012 -In Pursuit of Elegance :: May
    - -☆☆☆☆☆ -2012 -Divine Comedy, Part 1: Inferno :: Alighieri
    - -☆☆☆☆☆ -2012 -The Virtue of Selfishness :: Rand
    - -☆☆☆☆☆ -2012 -The Selfish Gene :: Dawkins
    - -☆☆☆☆☆ -2012 -HTML5/CSS3 :: Castro and Hyslop
    - -★★★★★ -2012 -Gödel, Escher, Bach: An Eternal Golden Braid :: Hofstadter
    - -☆☆☆☆☆ -2012 -Zen and the Art of Motorcycle Maintenance :: Pirsing
    - -☆☆☆☆☆ -2012 -Fermat's Enigma :: Singh
    - -☆☆☆☆☆ -2012 -The People Code :: Hartman
    - -☆☆☆☆☆ -2012 -Te-Tao Ching :: Lao-Tzu
    - -☆☆☆☆☆ -2012 -The Catcher in the Rye :: Salinger
    - -☆☆☆☆☆ -2012 -The Great Gatsby :: Fitzgerald
    - -☆☆☆☆☆ -2012 -Cat's Cradle :: Vonnegut
    - -☆☆☆☆☆ -2012 -5000BC :: Smullyan
    - -☆☆☆☆☆ -2012 -Walden :: Thoreau
    - -☆☆☆☆☆ -2012 -Instant: The Story of Polaroid :: Bonanos
    - -☆☆☆☆☆ -2012 -The Snowball :: Schroeder
    - -☆☆☆☆☆ -2012 -Musicophilia :: Sacks
    - -☆☆☆☆☆ -2012 -Second Nature :: Edelman
    - -☆☆☆☆☆ -2012 -Gödel's Proof :: Nagel and Newman
    - -☆☆☆☆☆ -2012 -Emergence :: Johnson
    - -☆☆☆☆☆ -2012 -Two Great Truths :: Griffin
    - -☆☆☆☆☆ -2012 -The Executive Mind :: Goldberg
    - -☆☆☆☆☆ -2012 -How to Build a Mind :: Aleksandern
    - -☆☆☆☆☆ -2012 -How to Become a Straight-A Student :: Newport
    - -☆☆☆☆☆ -2012 -The Hitchhiker's Guide to the Galaxy :: Adams
    - -★☆☆☆☆ -2012 -Halftime :: Buford
    - -☆☆☆☆☆ -2012 -Mastery :: Greene
    - -☆☆☆☆☆ -2012 -Taoism :: Oldstone-Moore
    - -☆☆☆☆☆ -2012 -Artificial Intelligence: The Basics :: Warwick
    - -☆☆☆☆☆ -2012 -Big Data :: Schonberger and Cukier
    - -☆☆☆☆☆ -2012 -Show Me How :: Fagerstrom and Smith
    - -☆☆☆☆☆ -2012 -The Tao of Pooh :: Hoff
    - -☆☆☆☆☆ -2012 -The Autobiography of Mark Twain :: Mark Twain
    - -☆☆☆☆☆ -2012 -Hackers and Painters :: Graham
    - -☆☆☆☆☆ -2011 -iWoz :: Wozniak
    - -☆☆☆☆☆ -2011 -Steve Jobs :: Isaacson
    - -☆☆☆☆☆ -2011 -The Age of Reason :: Paine
    - -★☆☆☆☆ -2011 -Your God is Too Small :: Phillips
    - -☆☆☆☆☆ -2011 -The Way to Wealth :: Franklin
    - -☆☆☆☆☆ -2011 -Stuff Every Man Should Know :: Cohen
    - -☆☆☆☆☆ -2011 -The Economics of Public Issues :: Miller, Benjamin, and North
    - -☆☆☆☆☆ -2011 -Cannery Row :: Steinbeck
    - -☆☆☆☆☆ -2011 -The Communist Manifesto :: Marx
    - -★☆☆☆☆ -2011 -The Renaissance Soul :: Lobenstine
    - -☆☆☆☆☆ -2011 -Flatland :: Abbott
    - -★★☆☆☆ -2011 -Atlas Shrugged :: Rand
    - -☆☆☆☆☆ -2011 -The Mentor :: Ayres
    - -☆☆☆☆☆ -2011 -Alice in Quantumland :: Gilmore
    - -☆☆☆☆☆ -2011 -The Prince :: Machiavelli
    - -☆☆☆☆☆ -2011 -A Study in Scarlet & Hound of the Baskervilles :: Doyle
    - -☆☆☆☆☆ -2011 -A Clockwork Orange :: Burgess
    - -★★★★★ -2011 -Catch-22 :: Heller
    - -☆☆☆☆☆ -2011 -Mythology: Timeless Tales of Gods and Heroes :: Hamilton
    - -☆☆☆☆☆ -2011 -Fight Club :: Palahnluk
    - -☆☆☆☆☆ -2011 -Slaughterhouse Five :: Vonnegurt
    - -☆☆☆☆☆ -2011 -The Young Man's Guide :: Alcott
    - -☆☆☆☆☆ -2011 -A Brave New World :: Huxley
    - -☆☆☆☆☆ -2011 -Blink :: Gladwell
    - -☆☆☆☆☆ -2011 -The Rise of Theodore Roosevelt :: Morris
    - -☆☆☆☆☆ -2011 -A Brief History of Time :: Hawking
    - -★☆☆☆☆ -2011 -Steps to Christ :: White
    - -★★☆☆☆ -2011 -Batman: The Killing Joke :: Moore
    - -☆☆☆☆☆ -2011 -The God Delusion :: Dawkins
    - -☆☆☆☆☆ -2011 -Rules of Civility :: Washington
    - -☆☆☆☆☆ -2011 -The Perks of Being a Wall Flawer :: Chbosky
    - -☆☆☆☆☆ -2011 -The Art of War :: Sun Tzu
    - -★★★☆☆ -2011 -Twilight :: Meyers
    - -★★☆☆☆ -2011 -Harry Potter and the Sorcerer's Stone :: Rowling
    - -☆☆☆☆☆ -2011 -King, Warrior, Magician, Lover :: Moore and Gillette
    - -★☆☆☆☆ -2011 -There is a God :: Flew
    - -☆☆☆☆☆ -2011 -Drive :: Pink
    - -☆☆☆☆☆ -2011 -The Book of Five Rings :: Musashi
    - -☆☆☆☆☆ -2011 -The Problems of Philosophy :: Russell
    - -☆☆☆☆☆ -2011 -The Tao of Jeet Kune Do :: Lee
    - -☆☆☆☆☆ -2011 -Outliers :: Gladwell
    - -☆☆☆☆☆ -2011 -Reasons for God :: Keller
    - -☆☆☆☆☆ -2011 -The Art of Getting Things Done :: David Allen
    - -☆☆☆☆☆ -2011 -The Shape of Design :: Chimero
    - -☆☆☆☆☆ -2011 -Increasing Personal Efficiency :: Conwell
    - -☆☆☆☆☆ -2011 -Chaos :: Gleick
    - -☆☆☆☆☆ -2011 -Anthem :: Rand
    - -☆☆☆☆☆ -2011 -Consider the Lobster :: Wallace
    - -★☆☆☆☆ -2011 -The Alpha Male Guide :: Beck
    - -☆☆☆☆☆ -2011 -What the Dog Saw :: Gladwell
    - -☆☆☆☆☆ -2011 -Freakonomics :: Levitt and Dubner
    - -☆☆☆☆☆ -2011 -The Hunger Games :: Suzanne Collins
    - -☆☆☆☆☆ - -Flowers for Algernon :: Daniel Keys
    - -☆☆☆☆☆ - -Uzumaki :: Junji Ito
    - -☆☆☆☆☆ - -Only Revolutions :: Mark Z. Danielewski
    - -☆☆☆☆☆ - -House of Leaves :: Mark Z. Danielewski
    +
    +

    +We Have Always Lived In The Castle

    +

    +Sometimes slow and annoying, but overall very clever. The story overflows with +crucial details that are easy to overlook.

    +

    +Radical Acceptance

    +

    +Solid spiritual advice with good storytelling.

    +

    +Turn of the Screw

    +

    +Lackluster gothic horror with plenty of mystery but no fright or feeling.

    +

    +Train Dreams

    +

    +Phrenetic, short, and somber.

    +

    +White Teeth

    +

    +Well, the Zadie Smith hype is justified. White Teeth is excellent. Solid +dialogue. Integrates multiple cultures into one narrative without obvious +tokenism. Everything feels extremely +intentional (in a good way). Slow beginning, but worthwhile payoffs.

    +

    +The Trial

    +

    +A scattered plot with decent depth but generally dislikable characters. Funny at +many parts, but no stakes provided.

    +

    +Lucky Jim

    +

    +A book whose sole purpose seems to tarnish academia. Somewhat funny, but felt +hollow and unconstructive.

    +

    +High Rise

    +

    +An almost-interesting story premise embedded in shallow writing.

    +

    +Things Fall Apart

    +

    +Solid fiction about tribal Africa. I liked most when underlying motivations for +cultural practices were hinted at or explored.

    +

    +How to Win Friends and Influence People

    +

    +All the advice about human interaction that you should've learned (but didn't) +and need to be reminded of (but don't).

    +

    +Jonathan Strange & Mr. Norrell

    +

    +An enthralling and epic story, although sometimes a bit too British for my small +brain. I suspect this book would actually be much better as a television series.

    +

    +Piranesi

    +

    +A beautiful and unique labyrinth story.

    +

    +All the Birds in the Sky

    +

    +Heartwarming apocalyptic story about love, nature, magic, technology, growing +up, generational trauma, etc. Some of the romance felt forced. Wouldn't be +surprised to see it on the silver screen one day.

    +

    +No One Is Talking About This

    +

    +This book was painful. Normally books about internet addiction don't feel +applicable to me because I never got sucked into Facebook or Twitter.

    +

    +But this book felt like a personal attack. The author created a creepy +caricature of the habits and values I once espoused. And her takes were +completely reasonable.

    +

    +I am impressed with how the author painted her political counterparts in a +reasonable light. The US's alt-left and alt-right seem to be equal products of +meme culture.

    +

    +I didn't care much for the plot. There were quite a few things that felt forced, +but they were easy to ignore amidst the excellent writing. All the story beats +are relatively predictable, but it doesn't lessen the blow.

    +

    +East of Eden

    +

    +Deeply human. Possibly the greatest book ever written.

    +

    +The Structure of Scientific Revolutions

    +

    +Dry but incredibly deep work on how paradigm shifts work in the +academic/scientific community.

    +

    +The Body

    +

    +Excellent writing (as usual) from Bryson, but content felt both too broad and +too narrow at the same time. Recommended for middle-school students and adults +unfamiliar with human biology.

    +

    +Storm Front

    +

    +My new favorite soft-magic fantasy world... embedded in a horny detective +thriller. Imagine if Harry Potter was actually a relatively good story; instead +of a student, he was a detective trapped in a softcore smut novel. The story +would've been a masterpiece if the author swapped the ecchi stuff with some +actual character development.

    +

    +Men, Machines, and Modern Times

    +

    +The definitive essay collection covering technology/innovation/society. Filled +with lovely prose, accurate prophecies, great examples, and useful mental +models.

    +

    +On Having No Head

    +

    +Entertaining booklet on the difference between your head and other people's +heads. Great companion to any meditation or spiritual practice.

    +

    +Permutation City

    +

    +Reads like a "consciousness and computers are cool" story written by an +engineer. A few incredible ideas padded by weak storytelling and philosophical +exposition. Probably would've been better as a short story.

    +

    +Accelerando

    +

    +Probably the definitive sci-fi on post-human acceleration possibilities.

    +

    +The Timeless Way of Building

    +

    +This book provides a wonderful fractal-like framework for thinking about design. +Its focus on objective/falsifiable "patterns" is surprisingly pragmatic. The +book is filled with delightful writing and great examples.

    +

    +The Moon is a Harsh Mistres

    +

    +Reads like "classic" sci-fi. Explores cool ideas on superintelligence and human +organization structures.

    +

    +Writing Down the Bones

    +

    +Reflections on zen and writing. Very personable, but didn't feel applicable to +me.

    +

    +The Nature of Oaks

    +

    +More than you ever wanted to know about oak trees. Excellent demonstration of +complex and fragile ecosystem interdependencies.

    +

    +Breath

    +

    +This book had lots of bold claims worth investigating.

    +

    +When Things Fall Apart

    +

    +Her essays feel like an incredible mix of Alan Watts and Brené Brown. This stuff +is life-changing. I'm in love!

    +

    +A Walk in the Woods

    +

    +An imperfect-yet-hilarious account of an ambitious hike up the Appalachian +Trail. Besides being charming and incredibly well-written, the ecological +tangents hit super hard. Species of all kinds are going extinct at unfathomable +rates. I've heard the stats before and was unmoved, but his anecdotes somehow +seared Nature's impending peril into my arteries.

    +

    +Adult Children of Emotionally Immature Parents

    +

    +This book should be required reading for anybody with strained family relations. +Although not very dense or academic, there are tons of gems to be found.

    +

    +If You Could See The Sun

    +

    +Interesting premise for young-adult-gets-superpower book, but with a cringey +execution.

    +

    +Extra Virginity

    +

    +And suddenly I'm an olive oil snob.

    +

    +Player Piano

    +

    +It's not Vonnegut's funniest nor best-written work, but it's a parable of +technology/automation that will have a lasting impact on me.

    +

    +Restoration Agriculture

    +

    +One of the most practical takes on permaculture, but somehow integrates a +long-view of how biomes develop on Earth. Very convincing arguments for +switching to perennial-oriented farming. Strong and reasonable opinions that I +haven't heard via other permaculture channels.

    + +

    +Thorough dissection of corporations, branding, and activism.

    +

    +The Shadow of What Was Lost

    +

    +Unoriginal young adult "chosen one" power fantasy with cool takes on time and +fate.

    +

    +Orbiting the Giant Hairball

    +

    +Whimsical take on corporate creativity. Seems useful for people trapped in +certain types of large organizations.

    So You've Been Publicly Shamed

    @@ -7212,7 +5960,7 @@ TODO: https://www.goodreads.com/review/list/11004626-gwern?order=d&shelf=to-read https://taylor.town/books My Book Reviews - 2023-06-29T00:30:33.00Z + 2023-11-26T00:30:33.00Z @@ -7393,6 +6141,23 @@ Mats Gustafsson - "The Trespassers" FKA Twigs - "Magdalene" Tim Hecker - "Harmony in Ultraviolet" Julia Holter - "Have You in My Wilderness" + +Art Pop - Music genre - Rate Your Music: https://rateyourmusic.com/genre/art-pop/ + +Novelty - Music genre - Rate Your Music: https://rateyourmusic.com/genre/novelty/ + +healing breakcore mix: https://www.youtube.com/watch?v=xp14flv0Ht0 + +https://psytranceguide.com + +Stream Rameses B music | Listen to songs, albums, playlists for free on SoundCloud: https://soundcloud.com/ramesesb +Rameses B | creating music | Patreon: https://www.patreon.com/RamesesB +Stream MrSuicideSheep music | Listen to songs, albums, playlists for free on SoundCloud: https://soundcloud.com/mrsuicidesheep +MrSuicideSheep: https://www.mrsuicidesheep.com/ + +spiritbox + +★ ---> ]]> @@ -23014,15 +22118,16 @@ In other words, successful plunges require you to remove dirty obstacles coming

    Read more about my rating system here.

    -Podcasts are great! Except when they're not.

    +Podcasts are great! +Except when they're not.

    I highly recommend overcast.fm for listening to podcasts.

    - - +

    +My Current Rotation

    - @@ -23030,233 +22135,433 @@ I highly recommend overcast.fm for listening t - +99% Invisible - +Articles of Interest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + ★★★★★ -99% Invisible
    + ★★★★★ -Articles of Interest
    +★★★★ +Conversations with Tyler
    +★★★★ +Derek Sivers
    +★★★★ +Radiolab
    +★★★★ +The Memory Palace
    +★★★ +Cortex
    +★★★ +What's Your Problem?
    +★★★ +Software Unscripted
    +

    +Bingeworthy series that are completed or on indefinite hiatus:

    + + + + + + + + + + +S-Town - +The Anthropocene Reviewed + +On the Metal + + + + + + + + + + + + + + + + + + +
    + +
    ★★★★★ -S-Town
    + ★★★★★ -The Anthropocene Reviewed
    +★★★★ -★★★★☆
    +★★★ +Björk: Sonic Symbolism
    +★★★ +My Year in Mensa
    +★★★ +The Trojan Horse Affair
    +★★★ +Hello Internet
    +

    +Support these cool tech podcasts produced by my friends:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +♥ +devtools.fm
    +♥ +The Changelog
    +♥ +Elm Town
    +♥ +Future of Coding
    +♥ +Hest
    +♥ +Software Unscripted
    +♥ +TODEPOND PODCAST
    +

    +Honorable Mentions

    +

    +Series that I enjoyed at some point in the past:

    + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +Akimbo: A Podcast from Seth Godin + + + + + + + + +Cautionary Tales + + + + + + + + + + + + +Dan Carlin's Hardcore History + + + + +Dear Hank & Jon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +★★ Against the Rules with Michael Lewis
    -★★★★☆ -Common Sense with Dan Carlin
    -★★★★☆ -Conversations with Tyler
    -★★★★☆ -Dan Carlin's Hardcore History
    -★★★★☆ -Deep Questions with Cal Newport
    -★★★★☆ -Derek Sivers
    -★★★★☆ -Everything Everywhere Daily
    -★★★★☆ -Nice Try!
    -★★★★☆ -Radiolab
    -★★★★☆ -The Memory Palace
    -★★★★☆ -On the Metal
    -★★★☆☆ -Cautionary Tales
    -★★★☆☆ -Chemistry For Your Life
    -★★★☆☆ -Cortex
    -★★★☆☆ -Everything is Alive
    -★★★☆☆ -Freakonomics
    -★★★☆☆ -Planet Money
    -★★★☆☆ -Quanta Science Podcast
    -★★★☆☆ -Twenty Thousand Hertz
    -★★★☆☆ -What's Your Problem?
    -★★★☆☆ -Björk: Sonic Symbolism
    -★★★☆☆ -My Year in Mensa
    -★★★☆☆ -The Trojan Horse Affair
    -★★☆☆☆ -Endless Thread
    -★★☆☆☆ -Epic Gardening
    -★★☆☆☆ -Oxide & Friends
    -★★☆☆☆ -Revisionist History
    -★★☆☆☆ -Software Unscripted
    -★★☆☆☆ -The Economics of Everyday Things
    -☆☆☆☆☆ + Ahead of its Time
    + -☆☆☆☆☆
    + +American Innovations
    + Brains
    +★★★ -☆☆☆☆☆
    +★★★ +Chemistry For Your Life
    +★★★★ +Common Sense with Dan Carlin
    + Conan O'Brien Needs A Friend
    +★★★★ -☆☆☆☆☆
    + Darknet Diaries
    + -☆☆☆☆☆
    +★★★ +Deep Questions with Cal Newport
    +★★ +Endless Thread
    +★★ +Epic Gardening
    +★★★★ +Everything Everywhere Daily
    +★★★ +Everything is Alive
    + +Experimental History
    +★★★ +Freakonomics
    + +Harmontown
    + +Hey Riddle Riddle
    + +Land by Hand
    + +Monday Morning Podcast with Bill Burr
    + +More Perfect
    +★★★★ +Nice Try!
    + Oxford University Computer Science
    +★★ +Oxide & Friends
    + +Patented: History of Inventions
    +★★★ +Planet Money
    + +Reasonably Sound
    + +Reconcilable Differences
    + +Reply All
    +★★ +Revisionist History
    + +Stuff You Should Know
    +★★ +The Economics of Everyday Things
    + +The Joy of Why
    + +The Permaculture Podcast
    + +The Peter Attia Drive
    + +The Strong Towns Podcast
    + +The Tim Ferriss Show
    + +Trailblazers with Walter Isaacson
    - - @@ -23557,62 +22866,79 @@ Recent Projects + + + + + + + + + + + + + + + + - - - - - - -
    +
    +potato.cheap +home of the "cheap" web
    +WishWell +crappy patreon
    +wigwams +directory of cool projects
    +pseudoprose +pseudocode for writers
    chexs.io play hexagonal chess online
    + blogs.hn directory of small blogs
    + WorstPress the world's worst website builder
    + scrapscript the sharable programming language
    + nowify a CLI for staying on-task
    + Outland a tech meetup for outlandish ideas
    + Dream Daddy personal coaching
    + LiveCount a generalized thing-counter
    -

    -Hire Me

    -

    -You can hire me to attempt anything. I only accept payment if -clients are completely satisfied with my work. I maintain -a diverse skillset: research, software, art, logistics, teamwork, -audio, video, automation, education, and design.

    +
    • Emulate clear writers like Steinbeck, Hemingway, Orwell.
    • -Use a sincere voice like D F Wallace or Vonnegut.
    • -
    • -Emulate designers like Don Norman and Bret Victor.
    • -
    • -Copy engineering principles from Casey Muratori and Joe Armstrong.
    • +Use a sincere voice like David Foster Wallace or Kurt Vonnegut.
    • Emulate great comedians like George Carlin.
    • @@ -26835,10 +26220,6 @@ Favor short, clear sentences.
    • Be as subtle as possible.
    • -Give short, clear responses.
    • -
    • -Avoid the word "not".
    • -
    • Avoid adverbs and adjectives.
    • Stay organized; be proactive.
    • @@ -26851,6 +26232,8 @@ Be accurate; mistakes erode my trust.
    • Offer uncommon recommendations.
    • +Avoid the word "not".
    • +
    • Value reason over authority.
    • Encourage contrarian ideas.
    • @@ -26859,12 +26242,18 @@ Allow speculation; flag when used.
    • Limit lectures on safety and morality.
    • +Be succinct.
    • +
    • +No introductions. No conclusions.
    • +
    • Respect content policies; explain when needed.
    • Cite sources; list URLs at the end.
    • Add a "further reading" section when possible.
    • +Surprise me.
    • +
    • Link directly to product pages.
    • Keep a neutral tone, but be opinionated.
    • @@ -26894,6 +26283,73 @@ Prefer academic sources when possible. +

      +OpenAI provides +a Google Form for opting out of data collection on ChatGPT. +They'll eventually send you a link to +this portal, which seems to do the same +thing.

      +
      +

      +When you use our non-API consumer services ChatGPT or DALL-E, we may use the +data you provide us to improve our models. You can switch off training in +ChatGPT settings (under Data Controls) to turn off training for any +conversations created while training is disabled or you can submit +this form. +Once you opt out, new conversations will not be used to train our models.

      +

      +— +How your data is used to improve model performance

      +
      +

      +They also provide +this form for more specific requests.

      +
      +

      +Given the technical complexity of how our models work, we may not be able to +correct the inaccuracy in every instance. In that case, you may request that +we remove your Personal Information from ChatGPT’s output by filling out +this form.

      +

      +— Privacy policy

      +
      +

      +Your new ChatGPT conversations will be adorned with a nifty badge:

      +

      + +

      +]]>
      + OpenAI provides a Google Form for opting out of data collection on ChatGPT. + + 2023-11-02T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/chatgpt-opt-out + How to opt-out of ChatGPT training without clearing conversation history + 2023-11-02T00:00:17.00Z +
      + + +potato.cheap

      +]]>
      + The "cheap" web is a solarpunk philosophy of web design. + + 2023-12-19T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://potato.cheap + The "Cheap" Web + 2023-12-19T00:06:32.00Z +
      + + +

      Related pages: Are You Serious?

      @@ -27023,6 +26479,115 @@ Play online at chexs.io.

      chexs.io 2023-07-16T00:21:24.00Z
      + + + + +

      +Within a few short years, it seemed like everybody in the world was carrying a +blowgun.

      +

      +Two decades ago, a blowgun was an unwieldy rod you hung on your wall for +recreation and emergencies. Modern blowguns are Swiss-army-flavored. A baseline +model retails for $299 and acts as a telescope, microscope, megaphone, pencil, +camera, snorkel, food thermometer, pregnancy test, and flute. For this reason, +many call it "the magic wand".

      +

      +In pursuit of profit, blowgun manufacturers battled in an +arms-race-to-the-bottom. Blowguns shrunk. Portability itself became a supreme +convenience, because a quick tranquilizer can make any waiting room less +painful.

      +

      +Blowdarts became a godsend for parents, whose kids make misery for the many. +Most children are incapable of (1) self-directed silence and (2) resisting +addiction. Every guardian now faces the same Faustian bargain: darting their +kids to buy quiet time.

      +

      +Of course it's embarassing to tranq your own child in public, but it's more +mortifying to contain a misbehaving kid in a sterile waiting room. Social +pressure is palpable. Everybody in an airplane or restaurant silently screams in +unison, "Somebody tranq that child!"

      +

      +And so blowdart addiction grows. Instant tranquility is hard to hide in one's +purse/pocket. Especially when blowdart startups compete for ultimate potency. +Especially when they hand out those darts for free. Especially when they run out +of waiting rooms and start pursuing family rooms and classrooms.

      +

      +To placate the public, they peddle educational darts. It's a valiant attempt +at compromise. "At least the kids are learning something."

      +

      +We can do better than this, folks. This hairball is not a parenting problem, nor +the fault of corporate greed. Whenever people perpetuate harm, assume +subtle/systemic causes. Nobody really wants a whole generation hooked on +blowdarts.

      +

      +Willpower is waste. Instead, design an idyllic environment for yourself. Here +are some naturally-occurring examples:

      +
        +
      • +Combine multiple families in one household. Move in with your friends! +Load everybody into a massive house and efficiently share babysitting +responsibilities. It's difficult to remain perpetually tranq'd in a bustling +megafamily.
      • +
      • +Stop darting yourself. Set a good example. Consider using +parental self-controls.
      • +
      • +Adopt multigenerational living. Older relatives are sometimes wellsprings +of wisdom and experience. Instead of shipping Great Aunt Martha to a nursing +home, ask her to be your au pair. Extra hands obviate the need for blowguns.
      • +
      • +Cut your commute. Sacrifice space to relocate around work, or sacrifice +pay to work closer to home. Commutes drain emotional resources. Exhausted +parents wield blowguns.
      • +
      • +Establish a party house. Set an example: if you want your family to +socialize, then make people a priority. Master a few easy recipes. Resist the +urge to douse every surface in Windex. Become a paragon of comfort and lazy +hospitality.
      • +
      • +Invest in neighborhood safety. Make your neighborhood walkable. Plant +signs, block traffic, establish gardens, pour sidewalks, etc. Ask for +forgiveness instead of permission. Inspire your neighbors to make a +neighborhood. Redesign your life around free-range children. If you can't bear +separation anxiety, gift your little buddy a cellular Apple Watch in Big +Brother mode.
      • +
      • +Connect with your neighbors. Host recurring neighborhood gatherings so +that everybody feels more comfortable with your free-range kids. It's much +harder for kids to roam when they're unknown.
      • +
      • +Make outside comfortable. Nobody wants to go outside when outside sucks. +Invest in outdoor furniture and games (especially for your frontyard). Avoid +purchasing a giant junky playground that will fester bidirectional resentment. +Consider potting some flowers, erecting a catapult, or making a sprinkler +obstacle course.
      • +
      +

      +It starts with you. That blowgun in your pocket can always fast-forward you +and your kids a few hours into the future. But that time-travel incurs a cost. +Tranq time rots focus -- it's empty calories for the mind. +Don't play near black holes.

      +

      +Put every ounce of creativity and listening skills into yourself and others. +Fearlessly follow your curiosity. Arm yourself with enough patience to wade +through others' discomfort. Forgive yourself and others for making mistakes. +Experiment liberally.

      +

      +Living takes a lifetime to learn. Luckily, life is heritable. Be exemplary.

      +]]>
      + Modern blowguns are Swiss-army-flavored. A baseline model retails for $299 and acts as a telescope, microscope, megaphone, pencil, camera, snorkel, food thermometer, pregnancy test, and flute. + + 2023-09-27T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/child-tranqs + "Somebody Tranq That Child!" + 2023-09-27T00:30:20.00Z +
      @@ -27106,6 +26671,51 @@ Think about your values and let yourself do the right thing.

      Choose Values over Discipline 2021-01-02T00:30:17.00Z
      + + + +

      + + +

      +To make memorable art, compress arguments/emotions into potent vehicles.

      +

      +Here's my general algorithm for making things:

      +
        +
      1. +vibes: A brilliant idea strikes, so I feverishly +record some lurking feeling or suspicion as a cryptic note.
      2. +
      3. +arguments: I split/organize the note into core theses or emotions I want +to evoke. The main goal is to connect two unrelated ideas into a "eureka!" +experience. When I'm feeling fancy, I sprinkle some +modus ponens on top. This +entire process reveals that +90% my ideas are shallow and worthless crap +.
      4. +
      5. +vehicle: For passable ideas, I find the smallest vehicle capable of +delivering my message. Any clown car will do. Parables and satirical pieces +are timeless. Comics and memes are generally underrated. Space operas and +vaudeville are begging for renaissances.
      6. +
      7. +sketch: I use pseudoprose and other bespoke systems to +build my vehicle. At some point, I get tired of making it better and publish +it as-is. To leave my readers wanting more,
      8. +
      +]]>
      + To make memorable art, compress arguments/emotions into potent vehicles. + + 2023-11-30T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/clown-car + cram those ideas into a clown car + 2023-11-30T00:27:51.00Z +
      @@ -27254,6 +26864,106 @@ Your friends and coworkers will thank you.

      +

      +A collocate is a series of words +that frequently occur together.

      +

      +Fill in the blanks:

      +
        +
      • +torrential ____
      • +
      • +excruciating ____
      • +
      • +maiden ____
      • +
      • +teeming with ____
      • +
      • +resistance is ____
      • +
      • +thunderous ____
      • +
      • +suffered a crushing ____
      • +
      • +the archives are ____
      • +
      +

      +Theoretical Information

      +

      +The following equation defines +"surprisal":

      +

      + +

      +

      +Collocates suggest improvements to a message's +average information content.

      +

      +Replacing collocates with simpler substitutes is called +"compression".

      +

      +Abstractions

      +

      +Programmers compress code via abstractions. They pull out patterns and turn them +into reusable templates.

      +

      +Bad abstractions create distracting +compression artifacts in +the codebase. Beware programming patterns that are unrelated to the movement of +data. Much of modern softare is built with useless superstitions.

      +

      +Even "good" abstractions aren't free. Templates must be designed and defined and +applied and remembered and maintained. If an abstraction isn't compressing your +code, it's mere noise in your signal.

      +

      +Carefully consider opportunity costs. Each abstraction creates artificial +boundaries where other compression strategies might fare better.

      +

      +Decompress, Recompress

      +

      +The most reliable way to escape local compression maxima is to decompress +everything and then recompress.

      +

      +In my personal experience, most codebases can easily shrink a hundredfold and +speed up a thousandfold. Sometimes +much more.

      +

      +To decompress a codebase, inline its paths of execution. For example, rewrite +each endpoint of a webserver with only standard library functions and simple +database drivers. One can repeat the decompression process all the way to +bedrock machine code, but most programs accrue diminishing returns before that +point.

      +

      +To compress a codebase, recursively replace collocates with equivalent +"zero-cost" abstractions. +Don't try to outsmart yourself -- prioritize infrastructure for the most +egregious repetition frictions of digital desire paths.

      +

      +Brevity is a good indicator of compression, but sometimes counterproductive. +When people rely on overly-specific mental models, the medicine becomes poison. +Moving structures from git to wiki scatters information rather than compressing +it. Onboarding processes are components of codebases. Secret truths are not +mutual information.

      +

      +Above all else, don't force it. Obvious improvements become invisible when +implemented well. Decompress, recompress. Breathe. Decompress, recompress. +Breathe. Decompress, recompress.

      +]]>
      + Replacing collocates with simpler substitutes is intuitively called "compression". + + 2023-11-03T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/code-collocates + Compressing Codebase Collocates + 2023-11-03T00:03:20.00Z +
      + + +

      The newest thing here is a flock of self-proclaimed “coin boys” who carry a @@ -28081,18 +27791,27 @@ Recommended Reading How to Productize Yourself< Demonstrate Evergreen Proof 2023-07-25T00:00:01.00Z + + + +

      + + + +

      +Every trail bares a statistical story about its travellers.

      +

      +Desire paths appear wherever a remarkable force wears a channel into something +via repetition.

      +

      +In many cases, desire paths are weak pieces of infrastructure doing unplanned +labor, e.g. lawn doing the work of stone.

      +

      +Good architects anticipate nature. They don't blame water for dripping. They +don't blame people for peopling.

      +

      +Patient Design

      +

      +Many college campuses lay sidewalks after routes have already been established. +Resisting a herd is futile.

      +

      +Patient designers wait for obvious improvements to introduce themselves. Obvious +improvements become invisible if implemented well.

      +

      +Finding Friction

      +

      +Every discipline has its desire paths. A few contemporary examples:

      +
        +
      • +Writing: Don't blame short attention-spans when people skim your writing. +Write succinctly. Add visual structure. Surprise your readers.
      • +
      • +UI Design: +Instagram is intuitive enough for monkeys. +Count each click. Reduce surprises. Make it snappy.
      • +
      • +API Design: Clean code is an act of compression. Remove abstraction +sidewalks and look for code collocates in the lawn.
      • +
      +

      +Fixing Friction

      +

      +Don't fault people for using your architecture "incorrectly". Thank them for +blazing a trail of lesser resistance.

      +]]> + Good architects anticipate nature. They don't blame water for dripping. They don't blame people for peopling. + + 2023-11-03T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/digital-desire-paths + Digital Desire Paths + 2023-11-03T00:27:53.00Z + @@ -28740,6 +28525,356 @@ This essay is part of How to Productize Yourself< Do Unforgettable Work 2023-07-25T00:54:07.00Z + + + +

      +Warning: many of the numbers below are probably incorrect! +Email me if you'd like to help make something more +rigorous.

      +

      +tl;dr: People pay $0.50-$2.00 for an hour of digital entertainment.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +ad-free sub. +avg. usage +
      +Xbox Live +*$10/mo +40h/mo +$0.25/h
      +NY Times +$3/mo +7h/mo +$0.46/h
      +NFL+ +$7/mo +12h/mo +$0.50/h
      +X +$3/mo +6h/mo +$0.50/h
      +Netflix +$23/mo +43h/mo +$0.53/h
      +Hulu +$18/mo +33h/mo +$0.54/h
      +YouTube +$13/mo +23h/mo +$0.56/h
      +Spotify +$11/mo +7h/mo +$1.57/h
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +est. price +duration +
      +video game (v. long) +$60 +180h +$0.33/h
      +video game (long) +$60 +60h +$1.00/h
      +book +$12 +10h +$1.20/h
      +video game (short) +$30 +20h +$1.50/h
      +film (online) +$4 +2h +$2.00/h
      +audiobook +$20 +10h +$2.00/h
      +cinema +$12 +2h +$6.00/h
      +theme park +$80 +10h +$8.00/h
      +cruise +$1500 +168h +$8.92/h
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +default min. +avg. pub. +
      +Radiolab +$5/mo +160m/mo +$2/h
      +Tech Connections +$1/mo +30m/mo +$2/h
      +Cortex +$5/mo +90m/mo +$3/h
      +hbomberguy +$2/mo +25m/mo +$5/h
      +Articles of Interest +$4/mo +40m/mo +$6/h
      +TodePond +$1/mo +10m/mo +$9/h
      +NotJustBikes +$3/mo +20m/mo +$11/h
      +The Memory Palace +$4/mo +20m/mo +$12/h
      +Escaping Flatland +$7/mo +30m/mo +$14/h
      +Experimental History +$10/mo +30m/mo +$20/h
      +CGP Grey +$7/mo +10m/mo +$70/h
      +]]> + People pay $0.50-$2.00 for an hour of digital entertainment. + + 2023-12-18T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/dollar-per-hour + Paying Netflix $0.53/h, etc. + 2023-12-18T00:00:19.00Z + @@ -29182,17 +29317,23 @@ Foods Premium Adult Cat Salmon Mix.

      -It's exhausting -- unceasing streams of series, seasons, and sequels.

      +It's exhausting -- unceasing streams of series, seasons, and sequels.

      Artists create art. Content-creators create content.

      -I don't want content. I don't want reboots or remasters or reimaginings. I don't want pandering or product-placement or pop-politics. Breaking news is broken.

      +I don't want content. I don't want reboots or remasters or reimaginings. I +don't want pandering or product-placement or pop-politics. Breaking news is +broken.

      Content corrodes. Classics last. Masterpieces matter.

      -Communities of critics scour every archive for hard art -- that stuff that makes your heart ache and your face hurt and your gut churn and your brain bend. Those mighty mavens have paved the path. They've meticulously listed lifetimes of literature and music and films. Everybody shares the bounty of their obsessions; the critics' communal catalogues are completely public.

      +Communities of critics scour every archive for hard art -- that stuff that +makes your heart ache and your face hurt and your gut churn and your brain bend. +Those mighty mavens have paved the path. They've meticulously listed lifetimes +of literature and music and films. Everybody shares the bounty of their +obsessions; the critics' communal catalogues are completely public.

      Classics are conspicuous. Worthwhile media mantains attention for many years.

      @@ -29200,14 +29341,29 @@ Classics are conspicuous. Worthwhile media mantains attention for many years.

      -Eschew the new. Pasteurize your palate with the passing of seasons. Timelessness tastes like fine wine. Never consume content created within the decade.

      +Eschew the new. Pasteurize your palate with the passing of seasons. Timelessness +tastes like fine wine. Never consume content created within the decade.


      + + + + + + + + + + + @@ -29268,6 +29424,34 @@ Eschew the new. Pasteurize your palate with the passing of seasons. Timelessness + + + + + + + + + + + + + + + + + + + + + @@ -29284,6 +29468,53 @@ Eschew the new. Pasteurize your palate with the passing of seasons. Timelessness Eschew the New2022-11-26T00:36:10.00Z + + + +

      +In a groundbreaking development, a team of renowned scientists unlocked a +revolutionary method to discuss absolutely nothing in press releases.

      +

      +This cutting-edge approach combines many of the novel techniques recently seen +in quantum gravity, faster-than-light travel, and magnetic monopoles. Many are +calling this a breakthrough in synthesizing "illusions of understanding".

      +

      +Dr. Noah Xing, the world's leading authority on nothing, explains, "The +interesting bits of science are either propietary or inscrutable, but science +journalism is written by the layman for the layman. We must continue to +exaggerate findings until everybody is an armchair expert and distrusts research +announcements. After all, universities need to stay competetive in the attention +economy."

      +

      +The lab's new approach to nothing was thoroughly tested on 3.1 mice and a dish +of E. Coli. Foreign labs have failed to reproduce these findings on a crow +named Oscar.

      +

      +If more grants are secured, the team expects to start testing on humans by +May 2344. With venture capital and extreme ethical gymnastics, this stuff could +be unleashed on the public by Thursday.

      +

      +Although this research will ultimately prove worthless, the team remains +optimistic. The lab's lead researcher remarks, "Most of science is boring, but +that shouldn't stop the flow of advertising revenue. To maintain public trust, +we must celebrate everything before it's ready."

      +

      +Famed futurist Dr. Michio Kaku predicts that this will "eliminate poverty, +aging, war, and mosquitos", which is weird because we did not even reach out to +him for comment.

      +]]>
      + In a groundbreaking development, a team of renowned scientists unlocked a revolutionary method to discuss absolutely nothing in press releases. + + 2023-12-11T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/exciting-new-way + Scientists find exciting new way to talk about nothing in press releases + 2023-12-11T00:03:10.00Z +
      How to Productize Yourself< Find Your Value 2023-07-25T00:30:49.00Z + + + illustration of a decadent palace in a desert wasteland +

      + + +

      +Most modern MVPs are +neither minimal nor viable. Some are not even products.

      +

      +Imprecise terms (e.g. "minimum") create conflicting visions. Was +Juicero an MVP? +Google Glass? +OUYA?

      +

      +The MVP philosophy plagues us with broken products made for imaginary customers.

      +

      +Talented (yet misguided) teams developed everything in the +Museum of Failure. For example, +consider mobile phones. +Amazon made a phone that nobody wanted. +Microsoft made a phone that nobody wanted. +Twitter made a phone that nobody wanted.

      +

      +Platonic products rarely work. We bemoan those overdesigned apps that slowly +accrue features that nobody wants at the expense of the few features that people +need. They yearn for Craigslist and HN, but instead receive +Facebook and Reddit.

      +

      +MVPs are products. FPCs are customers. Products aren't people.

      +

      +To make a customer happy, go make a customer happy.

      +

      +Sit down with a literal physical person and +convince them to give you money for something. Usually this means +either (1) solving problems or (2) building things that solve problems.

      +

      +Problems are easy to find, but difficult to understand. Assumptions and biases +occlude systems' true dynamics. Designers frequently miss the true sources of +friction. Engineers often misunderstand friction and relocate it elsewhere.

      +

      +Learn to listen to people and systems. Be slow to prescribe antidotes. Hone your +curiosity.

      +

      +Assumptions create hypothetical people. Curiosity guides you to real people. +Real people have real cash. Real cash is more sustainable than +hypothetical cash. It's no surprise that +hype is fabricated from the hypothetical.

      +

      +To earn your First Paying Customer, go help somebody. Help more people. Keep +helping people, and those people may pay you to continue helping them.

      +]]>
      + MVPs are for products. FPCs are for customers. Products aren't people. + + 2023-11-29T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/fpc + "MVP" is dead! Long live "FPC". + 2023-11-29T00:27:54.00Z +
      @@ -29731,6 +30026,25 @@ completed work, one can enjoy the weekend without unfinished business.

      Share Demos Every Friday 2023-08-06T00:12:02.00Z
      + + + +

      +

      +Thanks to Jonathan Blow.

      +]]>
      + ...is a computer. + + 2023-12-17T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/frustrating-thing + The most frustrating thing in your life + 2023-12-17T00:18:07.00Z +
      @@ -29998,6 +30312,23 @@ problems.

      gpt'day mate 2023-08-14T00:09:05.00Z
      + + + a screenshot of a chatgpt conversation prompt "microsoft powerpoint slide from 1999 that says 'graphic design is my passion' in red papyrus font with frog clipart" and resulting ai-generated images +

      +]]>
      + 🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸🐸 + + 2023-11-28T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/grapic-design + graphic design is my passion + 2023-11-28T00:51:33.00Z +
      Schedule a free consultation or send me an e-mail if you're interested in working together.

      +

      +I'm also available for full-time (salaried) positions for exceptional +organizations.


      Estimates

      @@ -30454,6 +30788,34 @@ setTimeout( A Tiny HTML Snippet to "Discuss on HN" 2022-11-27T00:54:07.00Z
      + + curl -s 'https://news.ycombinator.com/from?site=youtube.com' \ +| egrep -o 'https?://www.youtube.com[^"]+' \ +| mpv --playlist=- \ + --speed=1.5 \ + --ytdl-format='bestvideo[height<=?720]+bestaudio/best' +

      +This script (1) fetches recent YouTube submissions from +HackerNews, (2) extracts youtube links from the +page, and (3) plays them sequentially at 720p (1.5x).

      +

      +Remember to upvote +intellectually stimulating +links on HN, write constructive comments, and support worthwhile creators via +Patreon/merch/etc.

      +]]>
      + Play videos recently submitted to HN via the commandline. + + 2023-11-27T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/hntv + HNTV: play hn yt links locally + 2023-11-27T00:33:46.00Z +
      Master! Master! I'd like to quit smoking.

      @@ -30661,6 +31023,126 @@ The coin was heads.

      How Do Taoists Quit Smoking? 2019-04-01T00:39:50.00Z
      + + + +

      +I feel like a battery that can't keep its charge.

      +

      +Chronic fatigue is my +greatest foe. I have a lot of things I want to do, and I have to wedge it all +between uncontrollable "emergency naps".

      +

      +Narcolepsy medication is godsend when I get my dosage right, but I have a very +small habitable zone between panic-attack and asleep. To avoid stimulant +meltdowns, I err on the side of naps.

      +

      +My capabilities shrink as I tire. I need lots of brainpower to build software, +but very little to wash dishes.

      +

      +And so I prioritize my infinite queues by "amperage". +Throughout the day, I tackle the highest-amperage work that my battery will +allow.

      +

      +Here's my strategy for most days, ordered from most urgent to least urgent:

      +

      +1. "Emergencies" and Appointments

      +
        +
      • +Evade death for me, my family, and my plants.
      • +
      • +Avoid embarassing myself over missed commitments.
      • +
      +

      +2. Chores

      +
        +
      • +Clear queue of random obligations and responsibilities.
      • +
      • +Respond to all inbound messages, once per day.
      • +
      +

      +Chores eat up my mental energy faster than anything else. The quickest way to +drain myself is to do things I've been avoiding. If chores were easy, I would've +already completed them.

      +

      +I wait to do all non-urgent portable chores until I'm stuck in a car, plane, +hotel, dentist's office, etc. That's how you +scrounge for between time.

      +

      +3. Personal Projects (Implementation)

      +
        +
      • +Take an idea and bring it closer to reality.
      • +
      +

      +Like many other makers, I have a strange attraction to design/research loops. +I've found that reserving energy for actually building things is an essential +part of my process. +Write tired, edit less tired?

      +

      +4. Career

      +
        +
      • +Spin the well-oiled wheels of capitalism to sustain my standard-of-living.
      • +
      +

      +This is a difficult dance. I am committed to doing high-quality output at work, +but I also want to reserve enough time/energy for my personal projects. My +current compromise is to allocate a fixed number of hours to implementing +personal projects before starting career work. Design/architecture work is for +afternoons/evenings.

      +

      +5. Moving

      +
        +
      • +Tidy house; clear piles.
      • +
      • +Exercise for 5-20 minutes.
      • +
      +

      +Most of my work is bound to The Internet Machine™. But sitting all day makes me +slumpy. When I feel the call of the bed coming, I throw on an audiobook and make +my home habitable.

      +

      +6. Personal Projects (Design)

      +
        +
      • +Pull the next idea from my list (currently ~7,000 ideas) and prepare it for +implementation.
      • +
      +

      +Separate design and implementation phases force me to consider how I want a +personal project to come to fruition. Should I skip the work and publish the +blueprints? Should I try to assemble a team? Should I give it away for free? +Kickstarter? Apprentice? And so on.

      +

      +7. Consumption

      +
        +
      • +Pull from RSS.
      • +
      • +Read books.
      • +
      +

      +Via an RSS reader, I follow myriad +tiny blogs and YouTube channels and +HackerNews. I sometimes walk while I read to avoid +accidental slumber. In the past 2-3 years, I accidentally abandoned all +streaming services.

      +]]>
      + I feel like a battery that can't keep its charge. + + 2023-10-31T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/how-i-do-things-cf + How I Do Things: Chronic Fatigue Edition + 2023-10-31T00:36:37.00Z +
      cthulu cake @@ -30850,6 +31332,54 @@ chickens cost?

      How I Eat 2023-08-29T00:21:51.00Z
      + + + gravestone inscribed "taylor, 1992-2023, husband, father, obligation" +

      + + +

      +I'm puzzled by people who coddle their ancestors.

      +

      +For some folks, family is a debt to be paid. They dole out love-shaped deeds in +hope of karmic justice. They oblige to stave off guilt.

      +

      +These people tolerate abuse from parents/grandparents because "they're getting +old" and "nobody deserves to die alone".

      +

      +I don't get it.

      +

      +If nobody is eager to hang out with me as I age, maybe I deserve it. Maybe I +spent my century making misery for others.

      +

      +If all my stories bore, maybe I slept through life. Maybe I forgot to take +risks, get hurt, and live to tell about it.

      +

      +If I have no wisdom to impart to the fledgling generation, maybe I should've +listened more. Maybe I should've learned something or cared about anything.

      +

      +My body will betray me. My joints and skin and brain and viscera are openly +plotting a coup.

      +

      +When my time comes, I want love, not pity.

      +

      +But the golden rule can be cruel. +Kindness to me is not kindness to thee.

      +

      +Is it possible to balance compassion, honesty, and justice?

      +]]>
      + For some folks, family is a debt to be paid. They dole out love-shaped deeds in hope of karmic justice. They oblige to stave off guilt. + + 2023-11-25T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/husband-father-obligation + husband, father, obligation + 2023-11-25T00:06:35.00Z +
      @@ -31125,6 +31655,140 @@ Anyway, I think miss the loneliness sometimes 😎

      “I’m lonely 😎” 2021-02-13T00:18:40.00Z
      + + + + +

      +"It never ends," you say.

      +

      +Chores choose to camp on your todo-lists without invitation. "We'll just be here +for a day or two," they say. Fifty months later, you still haven't replaced that +lightbulb.

      +

      +Common Queues

      +

      +Most people encounter garden-variety infinite queues:

      +
        +
      • +emails, messages, calls, etc.
      • +
      • +personal projects/ambitions
      • +
      • +eating, grooming, sleeping, exercise, etc.
      • +
      • +commitments; obligations
      • +
      • +caretaking
      • +
      • +books, films, etc.
      • +
      • +career; money; bills
      • +
      • +repairs
      • +
      +

      +Queues flow at inconsistent rates. Some days are trickles; others are torrents.

      +

      +Those queues also oscillate in importance. Emergencies +preempt.

      +

      +Tools to Fight the Infinite

      +

      +You have ~16 waking hours per day to chip away at your infinite +queues.

      +

      +But your bandwidth is mostly fixed. Fools burn themselves out in pursuit of +perpetual overclocking. Unsustainable output is waste.

      +

      +Strategy is your best weapon against the infinite. Bad algorithms invite +anxiety, overwhelmedness, and frustration. Good algorithms create pride, peace, +and accomplishment.

      +

      +Unfortunately, you've got scant strategic tools for your algorithms:

      +
        +
      • +drop packets: ignore optional +work, lower your standards, or tame your desires
      • +
      • +parallelize: convince +another human to do your work
      • +
      • +buffer, sort, and process: +prioritize work and make progress in chunks
      • +
      +

      +Using Your Tools

      +

      +Drop unnecessary packets first. You've got a limited life -- don't waste it on +side-quests. Pick a plotline and stick to it.

      +

      +Of the non-optional stuff, delegate as much as possible. Most people fail to +delegate because they're afraid to choose their core competencies. To cede +control, you must decide who you want to become.

      +

      +After you've rejected the nonsense and delegated your trifles, it's time to +divide-and-conquer. Design a daily system that consistently allows you to keep +up with your queues. If you frequently feel "behind", your current system is +not working. To fix your routine, write down how many hours you want to spend +on things, and then observe/measure/compare how many hours you actually spend on +things.

      +

      +Chunking and Sorting

      +

      +Many productivity systems are secretly +buffering methods.

      +

      +Chunking models:

      + +

      +Proritization models:

      + +

      +Starter kits:

      + +]]>
      + Strategy is the best weapon you wield against the infinite. Bad algorithms invite anxiety, overwhelmedness, and frustration. Good algorithms create pride, peace, and accomplishment. + + 2023-10-30T00:00:00.00Z + + Taylor Troesh + https://taylor.town/ + hello@taylor.town + + https://taylor.town/infinite-queues + Taming Your Infinite Queues + 2023-10-30T00:15:28.00Z +

      @@ -31280,7 +31944,24 @@ soon/project: internet gems create script that pulls open links with timer and prompts for notes/ratings make a custom terminal viewer! figure out how to integrate history of reddit saved and youtube-likes and pocket - + +buff star wars: https://www.reddit.com/r/midjourney/comments/1496mc6/swole_wars_a_buff_new_hope/ + +whiterun has a 9.4% unemployment rate: so so so good: https://www.youtube.com/watch?v=fyQd7TEOwK8 +folding ideas "this is financial advice": https://www.youtube.com/watch?v=5pYeoZaoWrA + +Thumb Wars - 4K Remastered - YouTube: https://www.youtube.com/watch?v=MyDehO1IuG4 + +Visitors from the Galaxy (1981) - a Yugoslav/Czechoslovak SF with an amazing soundtrack (w/ English subtitles) : ObscureMedia: https://www.reddit.com/r/ObscureMedia/comments/16sz2xq/visitors_from_the_galaxy_1981_a/ +Inside a Breathtaking Modern Home Positioned on the Edge of a Canyon (House Tour) - YouTube: https://www.youtube.com/watch?v=mfLcSuOpNDU + +edible plant database: https://pfaf.org/user/Default.aspx + +Thrown for a Loop: a Carnival of Consciousness on Vimeo | https://vimeo.com/76886746 + +Everything I learned about concurrency and reliability I learned at the Waffle House - YouTube: https://www.youtube.com/watch?v=Xty-gzzIkBc + +[1703.10987] On the Impossibility of Supersized Machines: https://arxiv.org/abs/1703.10987 ---> @@ -31474,22 +32155,22 @@ soon/project: internet gems

      +
      +Johnny Webber's List of Useful Book Lists
      +Johnny Webber's List of Interesting Movie Lists
      Wikipedia: List of top book lists
      +Acclaimed Music
      +Goodreads: The Greatest Books.org Top 100 Books of All Time
      +Wikipedia: List of films with a 100% rating on Rotten Tomatoes
      +MyAnimeList: Top Manga
      +IMDB: Top Rated TV Shows
      +Harvard Classics - 90 Day Challenge
      +Penguin Great Ideas (Books)
      Acclaimed Music
      - @@ -33864,123 +34761,69 @@ things" puts you into perspective.

      +2023.09.16 +updated my battlestation +2023.09.21 +attended the final Strange Loop +2023.09.25 +scrapscript ecosystem designs +2023.10.02 +started making apple vinegar +2023.10.02 +dusted off my guitars +2023.10.11 +binged todepond videos +2023.10.12 +made dehydrated apple chips +2023.10.17 +built a working scrapscript interpreter +2023.11.22 +published wigwam.directory +2023.12.13 +launched WishWell +2023.12.18 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +wrote a manifesto for the "cheap" web
      -2023.06.18 -☆ open-sourced nowify
      -2023.06.11 -☆ downsized Outland
      -2023.06.28 -☆ scrapscript guide
      -2023.06.28 -☆ launched scrapscript community
      -2023.06.28 -☆ interviewed on Changelog
      -2023.06.29 -launched healthcare mvp for client
      -2023.06.29 -sprouted some corn stalks from seed
      -2023.06.29 -seeded more produce and clover
      -2023.06.29 -☆ made WorstPress
      -2023.07.01 -☆ attended Anime Expo
      -2023.07.05 -☆ built blogs.hn
      -2023.07.16 -☆ created chexs.io
      -2023.08.06 -intake form project
      -2023.08.08 -connected with some local farms
      -2023.08.09 -fixed our stupid honey leak
      -2023.08.11 -started my "Year of Raw"
      -2023.08.16 -...giant mouse trap
      -2023.08.17 -investigating microservice mess
      -2023.08.17 -built ui for project uncruft
      -2023.08.29 -planted lots of veggies
      @@ -34001,29 +34844,29 @@ but it's better to harness boredom and frustration to finish -2023.08.07 +2023.11.10 -project markle +home-improvement -2023.08.07 +2023.12.19 -project primer +scrapscript interpreter + + + +2023.12.19 + +back on the job market

      Soon

      -I love creating things and making memories, but I'm still trying to figure out -how to optimally order projects. Email me if you -have any thoughts/advice on prioritization methods.

      - +I am uncomfortably full of ideas. This is a queue of projects that I've designed +and am ready to build/publish. Never confuse an idea with its implementation.

      @@ -34036,548 +34879,64 @@ IF IT TAKES MORE THAN 2H, BREAK IT APART +2024 +flashcasts +2024 +zines +2024 +looop, taylor.town api, gob +2024 +not youtube +2024 +scrapscript roadmap +2024 +novella +2024 +cute video game +2024 +finding looop customers +2024 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +lüften
      -2023 -finish project uncruft
      -2023 -reflections on perfectionism
      -2023 -changing water filter
      -2023 -digging tree holes
      -2023 -marking all project piles for destruction
      -2023 -cashing out coinbase
      -2023 -llm.nvim
      -2023 -trying out copilot
      -2023 -learning an acroyoga flow
      -2023 -pygmy present
      -2023 -looop api
      -2023 -taylor.town api
      -2023 -gob backend
      -2023 -gob frontend
      -2023 -taylor.town api landing
      -2023 -gob/looop soft launch
      -2023 -cracking a password
      -2023 -timetracking adventures
      -2023 -recording myself speaking
      -2023 -cleaning scrapscript notes
      -2023 -scrapscript admin and licensing
      -2023 -scrapscript help docs design
      -2023 -scrapscript smell design
      -2023 -scrapscript mark design
      -2023 -scrapscript cli design
      -2023 -scrapscript yard design
      -2023 -scrapscript store design
      -2023 -scrapscript patron design
      -2023 -scrapscript pass design
      -2023 -scrapscript flat design
      -2023 -scrapscript book design
      -2023 -scrapscript metal design
      -2023 -scrapscript scrawl design
      -2023 -scrapscript stdlib scaffolding
      -2023 -scrapscript os platform design
      -2023 -scrapscript canvas design
      -2023 -scrapscript spyglass design
      -2023 -scrapscript ebnf
      -2023 -scrapscript bootscrapper design
      -2023 -scrapscript integration tests
      -2023 -planning writing analysis and advice
      -2023 -dropping my new single
      -2023 -planning dolls & wooden toys
      -2023 -planning peanut gallery & inferior design
      -2023 -planning lüften
      -
      -

      +

      This is a now page. Check out other now pages.

      -

      - | 2023 | putting the soap in my mouth |

      ]]>
      2018-09-15T00:00:00.00Z @@ -34591,7 +34950,7 @@ This is a now page. Check out 2023-07-12T00:51:17.00Z
      - +

      +Check it out on GitHub.

      Time-management is hard. So I delegated the hard parts to a computer program.

      nowify runs my life.

      -Every morning, I up start nowify and it guides me through my day: "what am I supposed to be doing now?"

      +Every morning, I up start nowify and it guides me through my day: "what am I +supposed to be doing now?"

      nowify counts every second. If I forget about nowify, it yells at me.

      Here's the general logic:

      • -Prompt the user with the highest priority routine from the queue. Routines usually occur daily or hourly.
          +Prompt the user with the highest priority routine from the queue. Routines +usually occur daily or hourly.
          • If "skip" is selected, prompt this routine again in 40 minutes.
          • @@ -34654,7 +35017,8 @@ If "not-done" is selected, start the beep timer again in