<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/feeds/atom-style.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://asmilex.casa</id>
    <title>Asmilex.casa</title>
    <updated>2026-10-12T19:53:05.519Z</updated>
    <generator>Astro Chiri Feed Generator</generator>
    <author>
        <name>Andrés Millán</name>
        <uri>https://asmilex.casa</uri>
    </author>
    <link rel="alternate" href="https://asmilex.casa"/>
    <link rel="self" href="https://asmilex.casa/atom.xml"/>
    <subtitle>Andrés' personal site.</subtitle>
    <rights>Copyright © 2026 Andrés Millán</rights>
    <entry>
        <title type="html"><![CDATA[Some snapshots from my first days in Bilbao]]></title>
        <id>https://asmilex.casa/obsidian/some-snapshots-from-my-first-days-in-bilbao</id>
        <link href="https://asmilex.casa/obsidian/some-snapshots-from-my-first-days-in-bilbao"/>
        <updated>2026-10-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Last week I started Máster Universitario en Modelización e Investigación Matemática, Estadística y Computación which takes place in Bilbao during the first semester, and in Zaragoza later on. Between ...]]></summary>
        <content type="html"><![CDATA[<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1063" height="1600" src="https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z6SmgH.webp" srcset="https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z1EchvL.webp 240w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z2lT3rA.webp 640w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_rzjrX.webp 828w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z6SmgH.webp 1063w" />
<p>Last week I started Máster Universitario en Modelización e Investigación Matemática, Estadística y Computación which takes place in Bilbao during the first semester, and in Zaragoza later on.</p>
<p>Between my earlier visit in summer alongside my family, and these few days, I’ve had my fair share of time to wander around the city. And so: here are some snapshots.</p>
<hr />
<p>Film is <em>so</em> much fun. It’s a shame I didn’t bring my parent’s trusty Yashica 109 Multi Program with me.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1053" src="https://asmilex.casa/_astro/LQ-12.CGTGNuxm_roa5h.webp" srcset="https://asmilex.casa/_astro/LQ-12.CGTGNuxm_ZeEBOE.webp 240w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_1IGJnl.webp 640w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_Z1JN6xR.webp 828w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_24oWGW.webp 1280w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_roa5h.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZPIAoG.webp" srcset="https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZwKbfI.webp 240w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Z12xf1p.webp 640w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Ky9mX.webp 828w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Z26GqN1.webp 1280w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZPIAoG.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1063" height="1600" src="https://asmilex.casa/_astro/LQ-8.CZFcrn7i_Z2nuteR.webp" srcset="https://asmilex.casa/_astro/LQ-8.CZFcrn7i_ZULXXj.webp 240w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_ZkaBvS.webp 640w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_2dWaRF.webp 828w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_Z2nuteR.webp 1063w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1065" src="https://asmilex.casa/_astro/LQ-1.tmQowEQK_Z2iRgHh.webp" srcset="https://asmilex.casa/_astro/LQ-1.tmQowEQK_Zcb3J6.webp 240w, https://asmilex.casa/_astro/LQ-1.tmQowEQK_ZJdYAu.webp 640w, https://asmilex.casa/_astro/LQ-1.tmQowEQK_2qVAdb.webp 828w, https://asmilex.casa/_astro/LQ-1.tmQowEQK_Z2djre9.webp 1280w, https://asmilex.casa/_astro/LQ-1.tmQowEQK_Z2iRgHh.webp 1600w" />
<hr />
<p><a href="https://www.google.es/maps/place/Ermita+de+San+Juan+de+Gaztelugatxe/@43.444139,-2.7827952,16z/data=!4m10!1m2!2m1!1sermita+de+gaztelugatxe+bilbao!3m6!1s0xd4e40043207680d:0x61080a562b79bb33!8m2!3d43.4474572!4d-2.784353!15sCh1lcm1pdGEgZGUgZ2F6dGVsdWdhdHhlIGJpbGJhb1ofIh1lcm1pdGEgZGUgZ2F6dGVsdWdhdHhlIGJpbGJhb5IBBmNodXJjaJoBJENoZERTVWhOTUc5blMwVkpRMEZuVFVSdmJYRnBjSGhCUlJBQuABAPoBBAgAEEc!16s%2Fg%2F11xc0_ww5?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Ermita de San Juan de Gaztelugatxe</a>.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-20.DMQejNtf_21i6hW.webp" srcset="https://asmilex.casa/_astro/LQ-20.DMQejNtf_Zh6nmz.webp 240w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_ZLSr8g.webp 640w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_11cWg7.webp 828w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_KkfSC.webp 1280w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_21i6hW.webp 1600w" />
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1067" height="1600" src="https://asmilex.casa/_astro/LQ-21.jXmWAYJp_acxYV.webp" srcset="https://asmilex.casa/_astro/LQ-21.jXmWAYJp_gznUq.webp 240w, https://asmilex.casa/_astro/LQ-21.jXmWAYJp_Z1OPMbl.webp 640w, https://asmilex.casa/_astro/LQ-21.jXmWAYJp_gKRCJ.webp 828w, https://asmilex.casa/_astro/LQ-21.jXmWAYJp_acxYV.webp 1067w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1065" height="1600" src="https://asmilex.casa/_astro/LQ-18.DkpnNfDr_1Ty5jL.webp" srcset="https://asmilex.casa/_astro/LQ-18.DkpnNfDr_Z1gcPJP.webp 240w, https://asmilex.casa/_astro/LQ-18.DkpnNfDr_2ppO2N.webp 640w, https://asmilex.casa/_astro/LQ-18.DkpnNfDr_Zy9DW3.webp 828w, https://asmilex.casa/_astro/LQ-18.DkpnNfDr_1Ty5jL.webp 1065w" /></div></div>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z1C9wM8.webp" srcset="https://asmilex.casa/_astro/LQ-16.1v54rI_D_1yMzPG.webp 240w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_140w50.webp 640w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z2d5dky.webp 828w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_2c4KCt.webp 1280w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z1C9wM8.webp 1600w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8328.D-jcYw78_1E8e7X.webp" srcset="https://asmilex.casa/_astro/_MG_8328.D-jcYw78_Z2mvXI4.webp 240w, https://asmilex.casa/_astro/_MG_8328.D-jcYw78_2oPOu.webp 640w, https://asmilex.casa/_astro/_MG_8328.D-jcYw78_Z1TtgGQ.webp 828w, https://asmilex.casa/_astro/_MG_8328.D-jcYw78_1E8e7X.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8330.X52XTgch_Zp6xSK.webp" srcset="https://asmilex.casa/_astro/_MG_8330.X52XTgch_ZsvG75.webp 240w, https://asmilex.casa/_astro/_MG_8330.X52XTgch_1Vp8qt.webp 640w, https://asmilex.casa/_astro/_MG_8330.X52XTgch_ZsY5R.webp 828w, https://asmilex.casa/_astro/_MG_8330.X52XTgch_Zp6xSK.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8344.crY3z_LU_123whi.webp" srcset="https://asmilex.casa/_astro/_MG_8344.crY3z_LU_Z2dJvix.webp 240w, https://asmilex.casa/_astro/_MG_8344.crY3z_LU_bbjf1.webp 640w, https://asmilex.casa/_astro/_MG_8344.crY3z_LU_Z1KGNhk.webp 828w, https://asmilex.casa/_astro/_MG_8344.crY3z_LU_123whi.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_1enBAU.webp" srcset="https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_27f4Tb.webp 240w, https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_Z1Yvq7g.webp 640w, https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_Zwrk9z.webp 828w, https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_uMNaH.webp 1280w, https://asmilex.casa/_astro/_MG_8349.Dbt90NUn_1enBAU.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8356.XtC1Jxvw_Zbn3gF.webp" srcset="https://asmilex.casa/_astro/_MG_8356.XtC1Jxvw_Z1B7pp0.webp 240w, https://asmilex.casa/_astro/_MG_8356.XtC1Jxvw_MNp8y.webp 640w, https://asmilex.casa/_astro/_MG_8356.XtC1Jxvw_Z194HnM.webp 828w, https://asmilex.casa/_astro/_MG_8356.XtC1Jxvw_Zbn3gF.webp 1066w" />
<hr />
<p>My guilty pleasure is visiting speciality coffees, and my first one here was <a href="https://www.google.es/maps/place/Dupla+Specialty+Coffee/@43.262067,-2.9254244,17z/data=!3m1!4b1!4m6!3m5!1s0xd4e4f688beea6df:0xb760c43c70ad20c1!8m2!3d43.2620631!4d-2.9228495!16s%2Fg%2F11lzw4qx2g?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Dupla Specialty Coffee</a>. It was neat! No shots from the shop itself, unfortunately.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8372.rY5ykB4w_Zpih5z.webp" srcset="https://asmilex.casa/_astro/_MG_8372.rY5ykB4w_2tzXWU.webp 240w, https://asmilex.casa/_astro/_MG_8372.rY5ykB4w_ZbFkis.webp 640w, https://asmilex.casa/_astro/_MG_8372.rY5ykB4w_Z28yrON.webp 828w, https://asmilex.casa/_astro/_MG_8372.rY5ykB4w_Zpih5z.webp 1066w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8374.qOxRBYux_Z1VJNpw.webp" srcset="https://asmilex.casa/_astro/_MG_8374.qOxRBYux_ZPxJ9m.webp 240w, https://asmilex.casa/_astro/_MG_8374.qOxRBYux_1yn5oc.webp 640w, https://asmilex.casa/_astro/_MG_8374.qOxRBYux_Znv289.webp 828w, https://asmilex.casa/_astro/_MG_8374.qOxRBYux_Z1VJNpw.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_ZcA9Vw.webp" srcset="https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_15mB55.webp 240w, https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_23NeRz.webp 640w, https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_Z1yjMXF.webp 828w, https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_ZVaXmJ.webp 1280w, https://asmilex.casa/_astro/_MG_8376.Cqk0gnJW_ZcA9Vw.webp 1600w" />
<p>Alongise the Nevirón river, and up until I reached <a href="https://www.google.es/maps/place/Museo+Guggenheim+Bilbao/@43.2698188,-2.9251576,16.28z/data=!4m6!3m5!1s0xd4e4fdede6031b5:0x508893b7cdaf6dad!8m2!3d43.2686712!4d-2.9340118!16zL20vMG04NmY?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Guggenheim</a>, I saw lots of interesting buildings —
colorful textures on walls and contrasting facades side by side, coliving in an eloquent clash of former elegance and vanguard arquitecture.</p>
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_ZzJOKK.webp" srcset="https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_ZIrgxV.webp 240w, https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_eYmey.webp 640w, https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_1H3scf.webp 828w, https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_Z1jkDbX.webp 1280w, https://asmilex.casa/_astro/_MG_8383.D2SmxhqH_ZzJOKK.webp 1600w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8384.soJNegJO_1qU58F.webp" srcset="https://asmilex.casa/_astro/_MG_8384.soJNegJO_Z1jttEy.webp 240w, https://asmilex.casa/_astro/_MG_8384.soJNegJO_Zl2PR4.webp 640w, https://asmilex.casa/_astro/_MG_8384.soJNegJO_171f5C.webp 828w, https://asmilex.casa/_astro/_MG_8384.soJNegJO_HkgHs.webp 1280w, https://asmilex.casa/_astro/_MG_8384.soJNegJO_1qU58F.webp 1600w" /></div></div>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_2Y2R5.webp" srcset="https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_1TTdkD.webp 240w, https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_Z2bQhFN.webp 640w, https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_ZIMbI7.webp 828w, https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_ZFAKy8.webp 1280w, https://asmilex.casa/_astro/_MG_8400.AZj-CXrV_2Y2R5.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8404.QvArqdZH_T6870.webp" srcset="https://asmilex.casa/_astro/_MG_8404.QvArqdZH_Z1IXYJw.webp 240w, https://asmilex.casa/_astro/_MG_8404.QvArqdZH_EVON2.webp 640w, https://asmilex.casa/_astro/_MG_8404.QvArqdZH_Z1gVhIj.webp 828w, https://asmilex.casa/_astro/_MG_8404.QvArqdZH_T6870.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8386.BhRzr1YC_21R7vF.webp" srcset="https://asmilex.casa/_astro/_MG_8386.BhRzr1YC_AjNsY.webp 240w, https://asmilex.casa/_astro/_MG_8386.BhRzr1YC_Z24VuMo.webp 640w, https://asmilex.casa/_astro/_MG_8386.BhRzr1YC_13mvuc.webp 828w, https://asmilex.casa/_astro/_MG_8386.BhRzr1YC_21R7vF.webp 1066w" />
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8391.ChibMKsg_IUsdB.webp" srcset="https://asmilex.casa/_astro/_MG_8391.ChibMKsg_1cN25k.webp 240w, https://asmilex.casa/_astro/_MG_8391.ChibMKsg_Z1sshb3.webp 640w, https://asmilex.casa/_astro/_MG_8391.ChibMKsg_1EPJ6x.webp 828w, https://asmilex.casa/_astro/_MG_8391.ChibMKsg_IUsdB.webp 1066w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8407.BlYPQ5De_Z1HP1bJ.webp" srcset="https://asmilex.casa/_astro/_MG_8407.BlYPQ5De_1hXIHv.webp 240w, https://asmilex.casa/_astro/_MG_8407.BlYPQ5De_Z1nhzxR.webp 640w, https://asmilex.casa/_astro/_MG_8407.BlYPQ5De_1K1qII.webp 828w, https://asmilex.casa/_astro/_MG_8407.BlYPQ5De_Z1HP1bJ.webp 1066w" /></div></div>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8397.BboSeQrj_Z1JAbYT.webp" srcset="https://asmilex.casa/_astro/_MG_8397.BboSeQrj_HjQbA.webp 240w, https://asmilex.casa/_astro/_MG_8397.BboSeQrj_1FKtY5.webp 640w, https://asmilex.casa/_astro/_MG_8397.BboSeQrj_Z1VmxRa.webp 828w, https://asmilex.casa/_astro/_MG_8397.BboSeQrj_Z2tb0q7.webp 1280w, https://asmilex.casa/_astro/_MG_8397.BboSeQrj_Z1JAbYT.webp 1600w" />
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8425.Bx68YZEw_1G7Mhm.webp" srcset="https://asmilex.casa/_astro/_MG_8425.Bx68YZEw_zDYCm.webp 240w, https://asmilex.casa/_astro/_MG_8425.Bx68YZEw_Z25BjD1.webp 640w, https://asmilex.casa/_astro/_MG_8425.Bx68YZEw_12GGDz.webp 828w, https://asmilex.casa/_astro/_MG_8425.Bx68YZEw_1G7Mhm.webp 1066w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8429.k1_Xsu5e_Z13znhC.webp" srcset="https://asmilex.casa/_astro/_MG_8429.k1_Xsu5e_1Xivmd.webp 240w, https://asmilex.casa/_astro/_MG_8429.k1_Xsu5e_ZGWMTa.webp 640w, https://asmilex.casa/_astro/_MG_8429.k1_Xsu5e_2qldnq.webp 828w, https://asmilex.casa/_astro/_MG_8429.k1_Xsu5e_Z13znhC.webp 1066w" /></div></div>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8508.W6-rrsz5_Z1riRKv.webp" srcset="https://asmilex.casa/_astro/_MG_8508.W6-rrsz5_27xcWj.webp 240w, https://asmilex.casa/_astro/_MG_8508.W6-rrsz5_ZxI6j4.webp 640w, https://asmilex.casa/_astro/_MG_8508.W6-rrsz5_Z2uBdPp.webp 828w, https://asmilex.casa/_astro/_MG_8508.W6-rrsz5_Z1riRKv.webp 1066w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_Z2fzOkc.webp" srcset="https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_Z1AKBDa.webp 240w, https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_ZCjXPF.webp 640w, https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_OJ771.webp 828w, https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_261v3w.webp 1280w, https://asmilex.casa/_astro/_MG_8432.Cy9U4eCt_Z2fzOkc.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_1Yr6rb.webp" srcset="https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_ZDmW04.webp 240w, https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_k3FMq.webp 640w, https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_1M7LK7.webp 828w, https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_1fQi0X.webp 1280w, https://asmilex.casa/_astro/_MG_8443.Dw1m-I4w_1Yr6rb.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8435.CJr8nzi3_Z1Y6Mn8.webp" srcset="https://asmilex.casa/_astro/_MG_8435.CJr8nzi3_Z1kDyab.webp 240w, https://asmilex.casa/_astro/_MG_8435.CJr8nzi3_14hgnn.webp 640w, https://asmilex.casa/_astro/_MG_8435.CJr8nzi3_ZRAQ8X.webp 828w, https://asmilex.casa/_astro/_MG_8435.CJr8nzi3_Z1Y6Mn8.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_Z9wfym.webp" srcset="https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_1TuAlK.webp 240w, https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_Z2cfTEG.webp 640w, https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_ZJbNH0.webp 828w, https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_ZS73Yz.webp 1280w, https://asmilex.casa/_astro/_MG_8437.DKOp2Ju8_Z9wfym.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8445.DQ6k18L2_203IOk.webp" srcset="https://asmilex.casa/_astro/_MG_8445.DQ6k18L2_1fhNPL.webp 240w, https://asmilex.casa/_astro/_MG_8445.DQ6k18L2_Z1pXupB.webp 640w, https://asmilex.casa/_astro/_MG_8445.DQ6k18L2_1HkvQY.webp 828w, https://asmilex.casa/_astro/_MG_8445.DQ6k18L2_203IOk.webp 1066w" />
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_Z1LMYm8.webp" srcset="https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_ZAMCdO.webp 240w, https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_mD0yF.webp 640w, https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_1OH6wm.webp 828w, https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_Z2vnMMl.webp 1280w, https://asmilex.casa/_astro/_MG_8448.BmB4Jyp9_Z1LMYm8.webp 1600w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_DRwvR.webp" srcset="https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_173QdR.webp 240w, https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_25uu1m.webp 640w, https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_Z1wCxOS.webp 828w, https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_Z4HgTl.webp 1280w, https://asmilex.casa/_astro/_MG_8447.B5xqdPpB_DRwvR.webp 1600w" /></div></div>
<hr />
<p>Afternoon sunrays scattered across the smooth metal surface of the <a href="https://www.google.es/maps/place/Museo+Guggenheim+Bilbao/@43.2698188,-2.9251576,16.28z/data=!4m6!3m5!1s0xd4e4fdede6031b5:0x508893b7cdaf6dad!8m2!3d43.2686712!4d-2.9340118!16zL20vMG04NmY?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Guggenheim</a> generating mesmerizing hues of red, orange and green. I wonder—no, <em>I bet</em> it is intentional. Such a fest for the eyes.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_2tm2ut.webp" srcset="https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_1BtA0.webp 240w, https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_1037nu.webp 640w, https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_2s7dlb.webp 828w, https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_1JLe4g.webp 1280w, https://asmilex.casa/_astro/_MG_8451.DN9oLD6S_2tm2ut.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8452._e9rZlsE_9dNL5.webp" srcset="https://asmilex.casa/_astro/_MG_8452._e9rZlsE_Z16qGvS.webp 240w, https://asmilex.casa/_astro/_MG_8452._e9rZlsE_1iu81F.webp 640w, https://asmilex.casa/_astro/_MG_8452._e9rZlsE_ZDnYuF.webp 828w, https://asmilex.casa/_astro/_MG_8452._e9rZlsE_9dNL5.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8458.Bd6nUc-B_Z29NRo4.webp" srcset="https://asmilex.casa/_astro/_MG_8458.Bd6nUc-B_176fbY.webp 240w, https://asmilex.casa/_astro/_MG_8458.Bd6nUc-B_Z1ya44o.webp 640w, https://asmilex.casa/_astro/_MG_8458.Bd6nUc-B_1z8Wdc.webp 828w, https://asmilex.casa/_astro/_MG_8458.Bd6nUc-B_Z29NRo4.webp 1066w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8459.9Bug6dHX_ZyqyGe.webp" srcset="https://asmilex.casa/_astro/_MG_8459.9Bug6dHX_Pe5nU.webp 240w, https://asmilex.casa/_astro/_MG_8459.9Bug6dHX_Z1P2dRs.webp 640w, https://asmilex.casa/_astro/_MG_8459.9Bug6dHX_1igMp8.webp 828w, https://asmilex.casa/_astro/_MG_8459.9Bug6dHX_ZyqyGe.webp 1066w" />
<div class="photo-grid"><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8470.CiPWRPBr_Z7jUTg.webp" srcset="https://asmilex.casa/_astro/_MG_8470.CiPWRPBr_ZLWtDP.webp 240w, https://asmilex.casa/_astro/_MG_8470.CiPWRPBr_1BXkSI.webp 640w, https://asmilex.casa/_astro/_MG_8470.CiPWRPBr_ZjTLCC.webp 828w, https://asmilex.casa/_astro/_MG_8470.CiPWRPBr_Z7jUTg.webp 1066w" /></div><div class="photo-grid-item"><img sizes="(min-width: 45rem) 360px, 50vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8476.DZGo17FJ_qyPkX.webp" srcset="https://asmilex.casa/_astro/_MG_8476.DZGo17FJ_21eRro.webp 240w, https://asmilex.casa/_astro/_MG_8476.DZGo17FJ_ZE1qNY.webp 640w, https://asmilex.casa/_astro/_MG_8476.DZGo17FJ_2thzsB.webp 828w, https://asmilex.casa/_astro/_MG_8476.DZGo17FJ_qyPkX.webp 1066w" /></div></div>
<p><a href="https://www.guggenheim-bilbao.eus/en/the-collection/works/maman">Maman (spider)</a> feels like it came straight out of Half Life.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8480.uSIQ98Pj_1JFGtO.webp" srcset="https://asmilex.casa/_astro/_MG_8480.uSIQ98Pj_Z2ml3Hm.webp 240w, https://asmilex.casa/_astro/_MG_8480.uSIQ98Pj_2zKPc.webp 640w, https://asmilex.casa/_astro/_MG_8480.uSIQ98Pj_Z1TilG9.webp 828w, https://asmilex.casa/_astro/_MG_8480.uSIQ98Pj_1JFGtO.webp 1066w" />
<hr />
<p>Autumn is <del>coming</del> already here but it doesn’t feel that way? — at least that’s what my sweaty shirt is telling me, for crying out loud.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8467.B-fx2uLZ_Z1moRV1.webp" srcset="https://asmilex.casa/_astro/_MG_8467.B-fx2uLZ_Znem0.webp 240w, https://asmilex.casa/_astro/_MG_8467.B-fx2uLZ_2oxAby.webp 640w, https://asmilex.casa/_astro/_MG_8467.B-fx2uLZ_rEsEd.webp 828w, https://asmilex.casa/_astro/_MG_8467.B-fx2uLZ_Z1moRV1.webp 1066w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_184crH.webp" srcset="https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_Z2j7UHH.webp 240w, https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_Z1kGhUd.webp 640w, https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_7mN2t.webp 828w, https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_oto1u.webp 1280w, https://asmilex.casa/_astro/_MG_8484.BGR2d2JQ_184crH.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8488.Disw6nyy_Z1Q9vrC.webp" srcset="https://asmilex.casa/_astro/_MG_8488.Disw6nyy_17GXbR.webp 240w, https://asmilex.casa/_astro/_MG_8488.Disw6nyy_Z1xyl4v.webp 640w, https://asmilex.casa/_astro/_MG_8488.Disw6nyy_1zJFd5.webp 828w, https://asmilex.casa/_astro/_MG_8488.Disw6nyy_Z1Q9vrC.webp 1066w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8522.8ppcQ8DO_Z2tW11g.webp" srcset="https://asmilex.casa/_astro/_MG_8522.8ppcQ8DO_Z1FE1Ib.webp 240w, https://asmilex.casa/_astro/_MG_8522.8ppcQ8DO_IgMOn.webp 640w, https://asmilex.casa/_astro/_MG_8522.8ppcQ8DO_Z1dBjGX.webp 828w, https://asmilex.casa/_astro/_MG_8522.8ppcQ8DO_Z2tW11g.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8502.BT-eCmjd_Z1rrJPl.webp" srcset="https://asmilex.casa/_astro/_MG_8502.BT-eCmjd_NtMjG.webp 240w, https://asmilex.casa/_astro/_MG_8502.BT-eCmjd_Z1QLvVG.webp 640w, https://asmilex.casa/_astro/_MG_8502.BT-eCmjd_1gwukT.webp 828w, https://asmilex.casa/_astro/_MG_8502.BT-eCmjd_Z1rrJPl.webp 1066w" />
<hr />
<p>Bilbao has to be one of the cleanest cities I’ve ever seen. There’s barely any litter on the ground (!!!), neat benches everywhere which I have no need to look over before sitting —speaking of which, I’ve seen no traces of <a href="https://en.wikipedia.org/wiki/Camden_bench">Camden bench</a>es neither other forms of Hostile architecture—, lots of bins everywhere in packs of four (organic, plastics, paper &amp; glass).</p>
<p><a href="https://www.google.es/maps/place/Txurdinaga,+Ocharcoaga-Churd%C3%ADnaga,+Bilbao,+Vizcaya/@43.2573171,-2.9101116,16z/data=!3m1!4b1!4m6!3m5!1s0xd4e4fadb6c3f4db:0x79feb9c777ccdced!8m2!3d43.256462!4d-2.904512!16s%2Fg%2F1239pgvf?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Txurdinaga</a>, the eastern district I’m living in, has an oneiric vibe going on — one of peacefulness, of calmness, of Yoyū (余裕). Abundance has been, in general, a recurring thought during my brief week here. Elderly in their morning walks, kids playing football everywhere, good boys (dogs) goofing around; <a href="https://www.google.es/maps/place/Parque+Europa/@43.2573171,-2.9101116,16z/data=!4m15!1m8!3m7!1s0xd4e4fadb6c3f4db:0x79feb9c777ccdced!2sTxurdinaga,+Ocharcoaga-Churd%C3%ADnaga,+Bilbao,+Vizcaya!3b1!8m2!3d43.256462!4d-2.904512!16s%2Fg%2F1239pgvf!3m5!1s0xd4e4e52dffee4f5:0xb836b7650d15dd85!8m2!3d43.2539511!4d-2.9050278!16s%2Fg%2F11cn69dsyj?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Europa parkea</a> even hosts small habitats with frogs, and a litter of kittens that I saw playing with each other. Not a trace of engine noises — just birds chirpling and wind breeze.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8490.BCOh40Em_Z2owSIk.webp" srcset="https://asmilex.casa/_astro/_MG_8490.BCOh40Em_Z1B3eaq.webp 240w, https://asmilex.casa/_astro/_MG_8490.BCOh40Em_ZCBAmV.webp 640w, https://asmilex.casa/_astro/_MG_8490.BCOh40Em_OruzK.webp 828w, https://asmilex.casa/_astro/_MG_8490.BCOh40Em_1W4qEo.webp 1280w, https://asmilex.casa/_astro/_MG_8490.BCOh40Em_Z2owSIk.webp 1600w" />
<hr />
<p>Some snapshots from my <em>very</em> tiring walk to <a href="https://www.google.es/maps/place/Funikularraren+Parkea/@43.2698188,-2.9251576,16.28z/data=!4m10!1m2!2m1!1sparque+funicular!3m6!1s0xd4e4fea3f327f25:0xc8830e15dab6122e!8m2!3d43.2744567!4d-2.9214574!15sChBwYXJxdWUgZnVuaWN1bGFyWhIiEHBhcnF1ZSBmdW5pY3VsYXKSAQRwYXJrmgEjQ2haRFNVaE5NRzluUzBWSlEwRm5TVVJDTnpsMUxWQjNFQUXgAQD6AQQIABBG!16s%2Fg%2F11c0vq673s?entry=ttu&amp;g_ep=EgoyMDI2MTAwNy4wIKXMDSoASAFQAw%3D%3D">Funikularraren Parkea</a></p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8543._nMJxwVn_Z25C7m2.webp" srcset="https://asmilex.casa/_astro/_MG_8543._nMJxwVn_GDsIk.webp 240w, https://asmilex.casa/_astro/_MG_8543._nMJxwVn_1F56vO.webp 640w, https://asmilex.casa/_astro/_MG_8543._nMJxwVn_Z1W2Vkq.webp 828w, https://asmilex.casa/_astro/_MG_8543._nMJxwVn_2fYd1G.webp 1280w, https://asmilex.casa/_astro/_MG_8543._nMJxwVn_Z25C7m2.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_Z1ubhoT.webp" srcset="https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_Z2ehRs3.webp 240w, https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_Z1fQeEy.webp 640w, https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_ccQi8.webp 828w, https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_Z2dL5P7.webp 1280w, https://asmilex.casa/_astro/_MG_8545.D_XeNOiG_Z1ubhoT.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8554.C0C-JviW_251lfO.webp" srcset="https://asmilex.casa/_astro/_MG_8554.C0C-JviW_Z21FfCC.webp 240w, https://asmilex.casa/_astro/_MG_8554.C0C-JviW_nfyTV.webp 640w, https://asmilex.casa/_astro/_MG_8554.C0C-JviW_Z1yCxBp.webp 828w, https://asmilex.casa/_astro/_MG_8554.C0C-JviW_251lfO.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8555.DleFdVVF_2cU6eN.webp" srcset="https://asmilex.casa/_astro/_MG_8555.DleFdVVF_ZMVOpG.webp 240w, https://asmilex.casa/_astro/_MG_8555.DleFdVVF_atNmN.webp 640w, https://asmilex.casa/_astro/_MG_8555.DleFdVVF_1CxTku.webp 828w, https://asmilex.casa/_astro/_MG_8555.DleFdVVF_1tkhNA.webp 1280w, https://asmilex.casa/_astro/_MG_8555.DleFdVVF_2cU6eN.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8567.CExqOZwH_Z1zAojP.webp" srcset="https://asmilex.casa/_astro/_MG_8567.CExqOZwH_2rhG1o.webp 240w, https://asmilex.casa/_astro/_MG_8567.CExqOZwH_ZdXCeY.webp 640w, https://asmilex.casa/_astro/_MG_8567.CExqOZwH_Z2aQJLk.webp 828w, https://asmilex.casa/_astro/_MG_8567.CExqOZwH_Z1zAojP.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_eLlRz.webp" srcset="https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_1qgf41.webp 240w, https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_2oGRQv.webp 640w, https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_Z1dq9YJ.webp 828w, https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_ZtNrxD.webp 1280w, https://asmilex.casa/_astro/_MG_8573.CIK4nLZS_eLlRz.webp 1600w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8577.WFtBUmko_ZikKFG.webp" srcset="https://asmilex.casa/_astro/_MG_8577.WFtBUmko_PJKk0.webp 240w, https://asmilex.casa/_astro/_MG_8577.WFtBUmko_Z1OvxVn.webp 640w, https://asmilex.casa/_astro/_MG_8577.WFtBUmko_1iMsld.webp 828w, https://asmilex.casa/_astro/_MG_8577.WFtBUmko_ZikKFG.webp 1066w" />
<p>A horse in horseschool learning to, umh, be ridden? — at least that is what his equestrian told people, since everyone got scared for having an enormous animal coming ungainly straight out at them.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8590.Cr-qSAKS_Z1mKX8C.webp" srcset="https://asmilex.casa/_astro/_MG_8590.Cr-qSAKS_jBOXw.webp 240w, https://asmilex.casa/_astro/_MG_8590.Cr-qSAKS_Z2lDthQ.webp 640w, https://asmilex.casa/_astro/_MG_8590.Cr-qSAKS_LEwYJ.webp 828w, https://asmilex.casa/_astro/_MG_8590.Cr-qSAKS_Z1mKX8C.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8593.Bjbmy07n_1VclkU.webp" srcset="https://asmilex.casa/_astro/_MG_8593.Bjbmy07n_Z2vXLX2.webp 240w, https://asmilex.casa/_astro/_MG_8593.Bjbmy07n_Z72Wpt.webp 640w, https://asmilex.casa/_astro/_MG_8593.Bjbmy07n_Z23V4VO.webp 828w, https://asmilex.casa/_astro/_MG_8593.Bjbmy07n_1VclkU.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8592.bT0sbM46_ZSAeXM.webp" srcset="https://asmilex.casa/_astro/_MG_8592.bT0sbM46_Zf2aBo.webp 240w, https://asmilex.casa/_astro/_MG_8592.bT0sbM46_Iosb6.webp 640w, https://asmilex.casa/_astro/_MG_8592.bT0sbM46_2bsy8M.webp 828w, https://asmilex.casa/_astro/_MG_8592.bT0sbM46_Z1Cb3p0.webp 1280w, https://asmilex.casa/_astro/_MG_8592.bT0sbM46_ZSAeXM.webp 1600w" />
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8597.DhP3DAcE_Z1BOh5e.webp" srcset="https://asmilex.casa/_astro/_MG_8597.DhP3DAcE_Z1NVRFY.webp 240w, https://asmilex.casa/_astro/_MG_8597.DhP3DAcE_zXVQz.webp 640w, https://asmilex.casa/_astro/_MG_8597.DhP3DAcE_Z1lTaEL.webp 828w, https://asmilex.casa/_astro/_MG_8597.DhP3DAcE_Z1BOh5e.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1066" height="1600" src="https://asmilex.casa/_astro/_MG_8613.D6Bidyzf_ZnFnC.webp" srcset="https://asmilex.casa/_astro/_MG_8613.D6Bidyzf_miTtw.webp 240w, https://asmilex.casa/_astro/_MG_8613.D6Bidyzf_Z2iWoLQ.webp 640w, https://asmilex.casa/_astro/_MG_8613.D6Bidyzf_OlBuJ.webp 828w, https://asmilex.casa/_astro/_MG_8613.D6Bidyzf_ZnFnC.webp 1066w" />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1066" src="https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_1OREcJ.webp" srcset="https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_Z1iHkEq.webp 240w, https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_ZkgGQV.webp 640w, https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_17Mo5K.webp 828w, https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_16hPLw.webp 1280w, https://asmilex.casa/_astro/_MG_8629.Dmk7DMfy_1OREcJ.webp 1600w" />
<hr />
<p>Phew, so many photos! But, I admit, the scenery compels me! There’s such a vast amount of greenery, and verticallity —my poor calfs)— and so I must comply!</p>
<p>Winter will come shortly and the colors of the landscape will inevitably change. That will be fun, too.</p>]]></content>
        <published>2026-10-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Snapshot captures — overusing snapshot testing for realistic tests and joyful experiences]]></title>
        <id>https://asmilex.casa/obsidian/snapshot-captures--overusing-snapshot-testing-for-realistic-tests-and-joyful-experiences</id>
        <link href="https://asmilex.casa/obsidian/snapshot-captures--overusing-snapshot-testing-for-realistic-tests-and-joyful-experiences"/>
        <updated>2026-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Demonstration The following post reflects on a personal pattern for testing I have been using for quite a while, which I call snapshot captures. It takes roots on snapshot testing (a technique I won’t...]]></summary>
        <content type="html"><![CDATA[
    <figure>
      <figcaption class="img-caption">Demonstration</figcaption>
    </figure>
    
<p>The following post reflects on a personal pattern for testing I have been using for quite a while, which I call <strong>snapshot captures</strong>. It takes roots on snapshot testing (a technique I won’t cover here — I’d advise reading first <a href="https://matklad.github.io">matklad</a>‘s essay on it: <a href="https://tigerbeetle.com/blog/2024-05-14-snapshot-testing-for-the-masses/">Snapshot Testing For the Masses</a> if you’re not familiar with it) and combines it with a REPL-fashioned development workflow, as the one seen on <a href="https://ianthehenry.com/posts/my-kind-of-repl/">My Kind of REPL</a>.</p>
<p>In a nutshell: snapshot captures caches computations that occur within monadic contexts as plain data; thus ossifying the values in the codebase, free of their original context.</p>
<hr />
<p>Consider an HTTP API, improperly documented, requiring authentication in the form of an API key, and lacking a native client for our language of choice.
This is a common scenario, indeed:
our ventures into uncharted digital territory rapidly earn us a fair amount of insight into how the service works — and with enough time we might end up implementing a decent client abstraction in our language.</p>
<p>So, let’s assume that we designed the client for the service Spirhalite<sup><a href="#user-content-fn-splatoon" id="user-content-fnref-splatoon">1</a></sup> as follows:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>type SalmonidId = int

class Salmonid(pydantic.BaseModel): ...

type Salmonids = Sequence[Salmonid]

class Endpoints:
    salmonids: Final[UrlPath] = UrlPath("/v3/salmonids")

@dataclass
class SpirhaliteClient:
    _client: HttpClient # httpx(2), requests, whatever works
    api_key: SecretStr
    base_url: HttpUrl

    def salmonids(self) -&gt; Result[Salmonids, HttpError]: ... 
    def salmonid(self, id: SalmonidId) -&gt; Result[Salmonid, HttpError]: ...        </code></pre></div>
<p>Once I have such an abstraction, I usually slap a quick test anywhere that constructs an element of that client with a hardcoded key<sup><a href="#user-content-fn-keys" id="user-content-fnref-keys">2</a></sup> and I simply play around with it.
The test is called <code>def test_repl()</code> and it runs on save.
Every time I make a change, I immediately observe the results.
«Oh, so the identifier for the salmonids is a UUID, not an integer, that’s why it is crashing» I find out; hence I change the type alias <code>SalmonidId</code> from an integer to a UUID, throw a <code>pprint(salmonids)</code> in there, and study how those lil’ troublemaker small fry are behaving.</p>
<p>This —making a hypothesis, running an experiment and getting back its results in the blink of a keystroke— is a powerful concept.
Creators need an immediate connection to what they are creating.
Endless hours of careful poring over outdated documentation won’t teach us the fascinating (and frustrating!) nuances of the real world, and so this playful experimentation ends up becoming our path to success rather quickly — putting bread on the table and joy in our minds.</p>
<p>We’re satisfied, yes:
«immaculate implementation», we think, «this thing slaps, ain’t no way those mischief-makers break my deserializer — oh, I know, why don’t we throw in some tests to show precisely that?»</p>
<p>Writing those examples is a good call, indeed: the most dangerous systems are unverified ones that appear correct at first glance, and these small programs nudge us closer to correctness<sup><a href="#user-content-fn-lean" id="user-content-fnref-lean">3</a></sup>.
It is also incredibly helpful for our colleagues<sup><a href="#user-content-fn-future-us" id="user-content-fnref-future-us">4</a></sup> since we are bringing them up to speed on how the service behaves, and what we can expect from it — the test suite effectively becomes a literate program on Spirhalite.
In general, programming <em>is</em> theory building, as <a href="https://en.wikipedia.org/wiki/Peter_Naur">Peter Naur</a> states in <a href="https://gist.github.com/onlurking/fc5c81d18cfce9ff81bc968a7f342fb1">Programming as Theory Building</a>: insight is both the motivating factor and the artifact of software development.</p>
<p>The question is, then: how do we test our client?</p>
<p>We cannot rely on querying the API during testing in most scenarios for a plethora of reasons —restricted quotas, environments with poor or no connectivity at all; secret sharing across team members and services alike— and the infrastructure required to tackle those problems at their root is remarkable overkill for a mere <em>hey, does my type constructor behave well for data coming out of the API?</em> Nonetheless we are certain those tests are worth having.</p>
<p>The first thought is: we <em>mock</em> it.
I will confess: I don’t like mocks!
They cannot effectively reflect idiosyncrasies of real services; maintaining those mocks forces us to partially reimplement their inner workings.
What we’re truly looking for is the <em>shape of the answer</em> — we went to Spirhalite because we wanted to fish those salmonids from out there. Managing keys, dealing with the fallible nature of network connections — all that jazz is incidental to our intentions.</p>
<p>It follows, then, that the one thing worth counterfeiting is the value contained within the body of the HTTP response:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>{
  "data": [
    {
      "id": "314dd98d-f586-4804-aa58-593cebe07146",
      "name": "Chumaco",
      // ...
    },
    // ...
  ]
}</code></pre></div>
<p>In operational terms this isn’t far off from the classic conception of a mock — we’re intercepting a request to a server and responding with predefined data. The key differentiation is that the data <em>is real</em>; a measurement of information which we’re certain has been observed in the system.</p>
<p>In essence, what we have done during the repl session is to crystallize the result of an effectful computation —that is, non-deterministic<sup><a href="#user-content-fn-determinism" id="user-content-fnref-determinism">5</a></sup> and with possible side effects<sup><a href="#user-content-fn-side-effect-def" id="user-content-fnref-side-effect-def">6</a></sup>—, thus making our tests pure.</p>
<p>Looking back at our workflow we observe that:</p>
<ol>
<li>We set up the context required to achieve something (API keys, instantiating our client, making sure we reach the server), a procedure that had to be babysat.</li>
<li>We saw both the outputs of the computation and its side effects, transforming our type system and assumptions along the way.</li>
<li>With the data stripped off its context, we were left with the crux of the system — and so our tests became pure functions of data.</li>
</ol>
<p>This pattern feels compelling.
Would we be able to distill it further, thereby removing any sort of manual intervention?</p>
<hr />
<p>For the following implementation I will use <a href="https://15r10nk.github.io/inline-snapshot/latest/">inline-snapshot</a>, but any framework suits the abstraction as long as it has sufficient expressivity (in this case, the ability to read a snapshot value, and to rewrite the source code when it is missing or wrong).</p>
<p>Let’s consider the following function:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>from inline_snapshot import Snapshot, get_snapshot_value, snapshot
from collections.abc import Callable
from types import EllipsisType

def capture[U](
    f: Callable[[], U], 
    record: Snapshot = snapshot()
) -&gt; U:
    value = get_snapshot_value(record)
    if type(value) is not EllipsisType:
        return value

    v = f()
    assert v == record
    return v</code></pre></div>
<p>where</p>
<ul>
<li><code>f</code> is a computation that produces a value of type <code>U</code>, possibly (<em>obviously</em>, given our task at hand) effectful. Mise en place style, <code>f</code> does not need any additional argument whatsoever to be run.</li>
<li><code>snapshot()</code> is a function that can rewrite its call site in the source code whenever something is asserted or compared to it<sup><a href="#user-content-fn-pytest-inline-snapshot" id="user-content-fnref-pytest-inline-snapshot">7</a></sup>.</li>
<li><code>EllipsisType</code>, a type representing a missing value.</li>
</ul>
<p>The new function <code>capture</code> will, on first run:</p>
<ol>
<li>Run the effectful operation <code>f</code><sup><a href="#user-content-fn-client-remark" id="user-content-fnref-client-remark">8</a></sup>.</li>
<li>Store the return value in the variable <code>record</code>.</li>
<li>Return the pure value.</li>
</ol>
<p>On subsequent runs of <code>capture</code>, bypass <code>f</code> entirely and instead use the cached value.</p>
<p>In our example, we would use the sphiralite client to query the server and capture the response like:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>salmonids: Result[Salmonids, HttpError] = capture(client.salmonids)</code></pre></div>
<p>If we ever want to rerun <code>f</code> we can delete the value contained within the snapshot, since that forces recomputation on the next run.</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>
           ╭──────────────────────────────╮                     
           │                              │                     
           │       External service       │                     
           │                              │                     
           ╰────▲────────────────────┬────╯                     
                │                    │                          
                │                    │                          
            f() │                    │ {"data:" [...]}          
                │                    │                          
                │                    │                          
           ╭────┼────────────────────▼────╮                     
           │░░░░│░░░░░░░░░░░░░░░░░░░░░░░░░│                     
           │░░░░│░░░░░░░░░░░░░░░░░░░░░░░░░│                     
           │░░░░│░Capturing░function░░░░░░│                     
           │░░░░╞════════════════════╗░░░░│                     
           │░░░░│░░░░░░░░░░░░░░░░░░░░║░░░░│                     
           ╰────┼────────────────────╫────╯                     
                │                    ║                          
                │                    ║                          
f::Unit -&gt; JSON │                    ║  captured = {"data": ...}
                │                    ║                          
                │                    ║                          
           ╭────┴────────────────────▽─────╮                    
           │                               │                    
           │          Our program          │                    
           │                               │                    
           ╰───────────────────────────────╯                    </code></pre></div>
<p>The idea isn’t precisely revolutionary: it is just a cache!
This is a cache! What enamors me about this approach is that</p>
<p>The idea isn’t precisely revolutionary — it is just a cache! Despite that fact, by basing off the underlying mechanism on snapshot testing, a series of patterns and consequences begin riddling the codebase — a mold-like infection that enamors me:</p>
<ol>
<li>The pure data will be represented in the source code. We can see it, modify it, edit it, search it — all of our wonderful plaintext abilities, at our disposal. Nothing is hidden from us.</li>
<li>Instead of throwing our mundane, scrappy <code>test_repl</code> workflow out of the window, we augmented its <a href="https://www.inkandswitch.com/malleable-software/effective-expressiveness/">Effective expressiveness</a> by infusing it with correctness — thus turning the scaffolding into a proper test.</li>
<li>The real server responds to those queries, and its answers are recorded for posterity. If, for some reason, the API specification changes without prior notice, we could force a recapture locally — then our test suite would exercise our deserializers again and catch any drifts from the original schema.</li>
<li>Assuming a sufficiently robust language server and a good name for the capture functions, cached data can be navigated to from any point of our program. Each capture function represents, in a nutshell, some sort of query to the API we had to in the past; those actions hold semantic meaning in our heads even in the present, and naming them is an exasperatingly fantastic way of introspecting our understanding of the world.</li>
</ol>
<p>Additionally, the approach greatly benefits from some kind of global switch that forces recomputations independently of the state of the snapshot. In my own framework I ended up introducing a <code>recapture</code> parameter to the function, whose value is read from the CLI as a flag and exposed to pytest as a fixture:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>def capture[U](
    f: Callable[[], U],
    recapture: bool,
    snapshot: Snapshot = snapshot(),
) -&gt; U:
    value = get_snapshot_value(snapshot)
    if type(value) is not EllipsisType and not recapture:
        return value

    v = f()
    assert v == snapshot
    return v</code></pre></div>
<p>Then I run <code>pytest --recapture path/to/file.py --inline-snapshot=fix</code> whenever I want to update snapshots. Had I skipped the <code>--inline-snapshot=fix</code> parameter, the assertion would detect changes in the snapshot.</p>
<hr />
<p>I haven’t had the need to expand it further.
It has been <em>just enough</em> to work almost universally during the few weeks where I have been employing it, which is what I’m looking for in a pattern like this.
It’s highly likely that the concept already exists in practice and I didn’t know about it
— nonetheless, even if that were the case —coming up with such abstraction and writing about it, only to find out that I’ve converged into a well-established and known result—, its existence won’t deprive me of the unparallel joy of learning about it; on the contrary, it would augment it.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-splatoon">
<p>Ah, too much Splatoon Raiders. <a href="#user-content-fnref-splatoon" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-keys">
<p>Don’t do this kids!!! <a href="#user-content-fnref-keys" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-lean">
<p>Even without a compiler —or a proof assistant’s kernel, in a sufficiently advanced language— to check our work. (Though if that were the case, we wouldn’t be dealing with most of the pain points shown here!). <a href="#user-content-fnref-lean" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-future-us">
<p>And for future us, too. <a href="#user-content-fnref-future-us" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-determinism">
<p>Any function that may yield different values each time it is called; see <a href="https://en.wikipedia.org/wiki/Nondeterministic_algorithm">Nondeterministic algorithm</a>. <a href="#user-content-fnref-determinism" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-side-effect-def">
<p>A function that alters its computational context without explicitly signaling it outside the implementation; see <a href="https://en.wikipedia.org/wiki/Side_effect_(computer_science)">Side effect</a>. <a href="#user-content-fnref-side-effect-def" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-pytest-inline-snapshot">
<p>In pytest we supply the parameter <code>--inline-snapshot=fix</code> on interactive sessions. In other circumstances it fails on a mismatch by default. <a href="#user-content-fnref-pytest-inline-snapshot" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-client-remark">
<p>In our example: calling <code>client.salmonids</code>. <a href="#user-content-fnref-client-remark" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-09-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wandering around Granada in a tranquil, post-disaster day]]></title>
        <id>https://asmilex.casa/obsidian/wandering-around-granada-in-a-tranquil-post-disaster-day</id>
        <link href="https://asmilex.casa/obsidian/wandering-around-granada-in-a-tranquil-post-disaster-day"/>
        <updated>2026-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Granada suffered a series of earthquakes during August1. Substantial damage was done to the city’s infrastructure — some buildings showed cracks on walls, Fermasa’s mythical chimney is being rebuilt 2...]]></summary>
        <content type="html"><![CDATA[<p>Granada suffered a series of earthquakes during August<sup><a href="#user-content-fn-footnote-1" id="user-content-fnref-footnote-1">1</a></sup>. Substantial damage was done to the city’s infrastructure — some buildings showed cracks on walls, Fermasa’s mythical chimney is <a href="https://www.granadahoy.com/granada/empieza-desmontaje-cupula-chimenea-fermasa-danada-terremotos-granada_0_2007872846.html">being rebuilt</a> <sup><a href="#user-content-fn-footnote-2" id="user-content-fnref-footnote-2">2</a></sup>. and probably more things I am not aware of.</p>
<p>In a totally unrelated manner, I went to a day trip to Granada to develop a couple of films in <a href="https://laquimicafilmlab.com/home">La Química Film Lab</a> before summer vacation — so I threw the Canon 550D in the backpack and wandered around the city, exploring parts unbeknownst to me.</p>
<hr />
<p>Parque de las Alquerías</p>
<p>_MG_6960.webp</p>
<p>_MG_6931.webp</p>
<p>_MG_6930.webp
_MG_6937.webp</p>
<p>_MG_6944.webp</p>
<p>_MG_6948.webp
_MG_6947.webp</p>
<p>_MG_6923.webp</p>
<p>_MG_6956.webp</p>
<hr />
<p>_MG_6899.webp
_MG_6881.webp</p>
<p>_MG_6967.webp</p>
<p>_MG_6913.webp</p>
<hr />
<p>Every city seems to have its “duck’s park”. In Granada, it’s the <a href="https://www.google.com/maps/place/Federico+Garc%C3%ADa+Lorca/@37.2072764,-3.6219138,13z/data=!4m10!1m2!2m1!1sparque+federico+garc%C3%ADa+lorca+granada!3m6!1s0xd71fc911e87c9d1:0x698b6b558ec9946e!8m2!3d37.170397!4d-3.6081327!15sCiVwYXJxdWUgZmVkZXJpY28gZ2FyY8OtYSBsb3JjYSBncmFuYWRhWiciJXBhcnF1ZSBmZWRlcmljbyBnYXJjw61hIGxvcmNhIGdyYW5hZGGSAQRwYXJrmgEjQ2haRFNVaE5NRzluUzBWSlEwRm5TVVJ3ZFRaVU5VUm5FQUXgAQD6AQQISxBH!16s%2Fm%2F02rf3x9?hl=en&amp;entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Parque Federico García Lorca</a>. In <a href="https://www.google.es/maps/place/Ja%C3%A9n/@37.7797221,-3.7943167,15z/data=!4m6!3m5!1s0xd6dd713cb5302c7:0x9cfb2c858b405702!8m2!3d37.779552!4d-3.7849699!16zL20vMGgyc2Y?entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Jaén</a>, <a href="https://www.google.com/maps/place/Parque+de+La+Concordia/@37.7794448,-3.8023248,16z/data=!4m10!1m2!2m1!1sja%C3%A9n+parque+patos!3m6!1s0xd6dd70bb0f412f9:0x6d65cd2d956b3372!8m2!3d37.7727996!4d-3.7872286!15sChJqYcOpbiBwYXJxdWUgcGF0b3NaFCISamHDqW4gcGFycXVlIHBhdG9zkgEEcGFya5oBJENoZERTVWhOTUc5blMwVkpRMEZuU1VNdE5YWTNkbmwzUlJBQuABAPoBBAgAEEU!16s%2Fg%2F11b7fycwvq?hl=en&amp;entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Parque de La Concordia</a></p>
<p>_MG_7077.webp</p>
<p>_MG_7108.webp</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-footnote-1">
<p><a href="https://www.ign.es/web/ign/portal/sis-catalogo-terremotos/-/catalogo-terremotos/searchTerremoto?latMin=36.43447450704123&amp;latMax=37.90799444057359&amp;longMin=-4.604980468750001&amp;longMax=-2.9790039062499996&amp;startDate=12/08/2026&amp;endDate=31/08/2026&amp;selIntensidad=N&amp;selMagnitud=N&amp;intMin=&amp;intMax=&amp;magMin=&amp;magMax=&amp;selProf=N&amp;profMin=&amp;profMax=&amp;fases=no&amp;cond=">List of earthquakes that impacted Granada during 2026 August</a> <a href="#user-content-fnref-footnote-1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-footnote-2">
<p>The first time I went to Granada by myself, alongside friends, was for a manga event. Fermasa hosted the event, and hence its tower became one of my most memorable icons of the city <a href="#user-content-fnref-footnote-2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-09-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wandering around Jaén on a lazy summer afternoon]]></title>
        <id>https://asmilex.casa/obsidian/wandering-around-ja%C3%A9n-on-a-lazy-summer-afternoon</id>
        <link href="https://asmilex.casa/obsidian/wandering-around-ja%C3%A9n-on-a-lazy-summer-afternoon"/>
        <updated>2026-08-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Some shots on Canon 550D when I was strolling around Jaén, thinking about Tools for thought in How can we develop transformative tools for thought, closely studying Stephen Wolfram‘s cognitive scaffol...]]></summary>
        <content type="html"><![CDATA[<p>Some shots on Canon 550D when I was strolling around <a href="https://www.google.es/maps/place/Ja%C3%A9n/@37.7797221,-3.7943167,15z/data=!4m6!3m5!1s0xd6dd713cb5302c7:0x9cfb2c858b405702!8m2!3d37.779552!4d-3.7849699!16zL20vMGgyc2Y?entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Jaén</a>, thinking about <a href="https://notes.andymatuschak.org/z88M2wwQ8FggV7p8Wu1b8LG">Tools for thought</a> in <a href="https://numinous.productions/ttft/#how-to-invent-hindu-arabic-numerals">How can we develop transformative tools for thought</a>, closely studying Stephen Wolfram‘s cognitive scaffolding in <a href="https://writings.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/">Seeking the Productive Life — Some Details of My Personal Infrastructure (Stephen Wolfram Writings)</a>, how language shapes thought, and what it means to truly learn something —by relentless repetition, by erroing over and over again until pain dissapears; <a href="https://stephango.com/pain">Pain is information</a>— and hence designing (mathematical) education around those mantras.</p>
<p>Also, just touching grass in general.</p>
<hr />
<p>All of these shots were taken on a 55-250mm lens which is not ideal when doing commonplace phothography, given how narrow the streets are; the most interesting way of getting something worthwhile in this scenario seems to be focusing on either really small objects, or far away structures<sup><a href="#user-content-fn-1" id="user-content-fnref-1">1</a></sup>.</p>
<p>_MG_6818.webp</p>
<p>_MG_6825.webp</p>
<p>_MG_6828.webp</p>
<p>_MG_6841.webp</p>
<p>_MG_6839.webp</p>
<p>_MG_6855.webp</p>
<p>_MG_6857.webp</p>
<p>_MG_6858.webp</p>
<p>_MG_6861.webp</p>
<hr />
<p>This young fellow saw me with the camera and asked me for a picture — to which I happily obliged. He could barely talk any Spanish whatsoever.</p>
<p>_MG_6868.webp</p>
<p>— Andrés</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>Alternatively, moving my ass twenty metters away from the subject works as well — which usually ends up in some fun postures and awkward places. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-08-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wandering around Jaén & Salobreña]]></title>
        <id>https://asmilex.casa/obsidian/wandering-around-ja%C3%A9n--salobre%C3%B1a</id>
        <link href="https://asmilex.casa/obsidian/wandering-around-ja%C3%A9n--salobre%C3%B1a"/>
        <updated>2026-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Shot on Yashica 109 Multi Program and Kodak Ultramax 400. Lately I’ve been getting into analog photography and it has been a hell lot of fun. Here are some snapshots from a couple of different days. D...]]></summary>
        <content type="html"><![CDATA[<p>Shot on Yashica 109 Multi Program and Kodak Ultramax 400.</p>
<p>Lately I’ve been getting into analog photography and it has been a hell lot of fun. Here are some snapshots from a couple of different days.</p>
<hr />
<p>Day trip to Salobreña. It was stupidly hot and stingy jellyfishes dawdled on its sea, so no bathing for us.</p>
<p>LQ-10.webp</p>
<p>LQ-7.webp</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1063" height="1600" src="https://asmilex.casa/_astro/LQ-8.CZFcrn7i_Z2nuteR.webp" srcset="https://asmilex.casa/_astro/LQ-8.CZFcrn7i_ZULXXj.webp 240w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_ZkaBvS.webp 640w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_2dWaRF.webp 828w, https://asmilex.casa/_astro/LQ-8.CZFcrn7i_Z2nuteR.webp 1063w" />
<p>LQ-9.webp</p>
<hr />
<p>Strolls in <a href="https://www.google.es/maps/place/Ja%C3%A9n/@37.7797221,-3.7943167,15z/data=!4m6!3m5!1s0xd6dd713cb5302c7:0x9cfb2c858b405702!8m2!3d37.779552!4d-3.7849699!16zL20vMGgyc2Y?entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Jaén</a> through its <a href="https://www.google.es/maps/place/Parque+Andr%C3%A9s+de+Vandelvira/@37.7864599,-3.793986,17z/data=!4m10!1m2!2m1!1sja%C3%A9n+bulevar+parque!3m6!1s0xd6dd703928c271f:0xe9b121f67b6bdce9!8m2!3d37.785871!4d-3.7906359!15sChRqYcOpbiBidWxldmFyIHBhcnF1ZVoWIhRqYcOpbiBidWxldmFyIHBhcnF1ZZIBBHBhcmuaASRDaGREU1VoTk1HOW5TMFZKUTBGblNVTlNPVTlpWHpaQlJSQULgAQD6AQQIABBD!16s%2Fg%2F11cjj49qx_?entry=ttu&amp;g_ep=EgoyMDI2MDkwMi4wIKXMDSoASAFQAw%3D%3D">Bulevar (Jaén)</a>.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1053" src="https://asmilex.casa/_astro/LQ-12.CGTGNuxm_roa5h.webp" srcset="https://asmilex.casa/_astro/LQ-12.CGTGNuxm_ZeEBOE.webp 240w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_1IGJnl.webp 640w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_Z1JN6xR.webp 828w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_24oWGW.webp 1280w, https://asmilex.casa/_astro/LQ-12.CGTGNuxm_roa5h.webp 1600w" />
<p>LQ-13.webp</p>
<hr />
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1063" height="1600" src="https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z6SmgH.webp" srcset="https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z1EchvL.webp 240w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z2lT3rA.webp 640w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_rzjrX.webp 828w, https://asmilex.casa/_astro/LQ-14.BWqs5fBk_Z6SmgH.webp 1063w" />
<hr />
<p>LQ-19.webp</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZPIAoG.webp" srcset="https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZwKbfI.webp 240w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Z12xf1p.webp 640w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Ky9mX.webp 828w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_Z26GqN1.webp 1280w, https://asmilex.casa/_astro/LQ-17.CdEF7P5N_ZPIAoG.webp 1600w" />
<p>An empty, eerie summer cinema.</p>
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" class="img-placeholder" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-20.DMQejNtf_21i6hW.webp" srcset="https://asmilex.casa/_astro/LQ-20.DMQejNtf_Zh6nmz.webp 240w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_ZLSr8g.webp 640w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_11cWg7.webp 828w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_KkfSC.webp 1280w, https://asmilex.casa/_astro/LQ-20.DMQejNtf_21i6hW.webp 1600w" />
<p>The city’s cathedral.
<img sizes="(min-width: 45rem) 720px, 100vw" loading="lazy" decoding="async" width="1600" height="1064" src="https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z1C9wM8.webp" srcset="https://asmilex.casa/_astro/LQ-16.1v54rI_D_1yMzPG.webp 240w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_140w50.webp 640w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z2d5dky.webp 828w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_2c4KCt.webp 1280w, https://asmilex.casa/_astro/LQ-16.1v54rI_D_Z1C9wM8.webp 1600w" /></p>
<hr />
<p>From here onwards I’d like to post more shots. We’ll see if that premise holds up!</p>
<p>— Andrés</p>
<p>LQ-15.webp</p>]]></content>
        <published>2026-08-26T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Muscles grow, brain grows]]></title>
        <id>https://asmilex.casa/obsidian/muscles-grow-brain-grows</id>
        <link href="https://asmilex.casa/obsidian/muscles-grow-brain-grows"/>
        <updated>2026-07-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[More, more, MORE, the body asks, relentlessly, as I feed it more food. I am UNSATISFIABLE despite fully knowing how preposterous that statement is — a weird thing to think about, considering that my s...]]></summary>
        <content type="html"><![CDATA[<p><em>More, more, MORE</em>, the body asks, relentlessly, as I feed it more food. <em>I am UNSATISFIABLE</em> despite fully knowing how preposterous that statement is — a weird thing to think about, considering that my stomach is sending contrary signals of <em>hey dude we had enough</em>. But the muscles — they must grow, diligently; obstinate repetitions and routines burnt into the <a href="https://en.wikipedia.org/wiki/Default_mode_network">Default mode network</a>, until the self cannot even think of an alternative way of living apart from training. So: I eat. A lot. A whole lot more than what I’m used to. Hence, alongside the fibers, the ego, getting (disproportionately) bigger.</p>
<p>And the even stupid-er muscle —we usually call it brain— also requesting its fair share of hyperthrophy. So I feed it, too — with <a href="https://www.youtube.com/watch?v=0BXuYlNrUmE">The Unreasonable Effectiveness of Constructive Data Modeling</a>. <em>Dude</em>, one might think, <em>isn’t it kind of weird to listen to some super dense talk about type theory during training</em>? And it is, definitely —I’d answer to this hypothesised person while I try to keep my rythm steady on the elliptical— BUT one must grow body, spirit and mind! Isn’t this what they call full body workout<sup><a href="#user-content-fn-1" id="user-content-fnref-1">1</a></sup>? Then it must be good! Everyone is vibing to their own music, who cares what I’m playing on my earbuds?</p>
<p>Alas, an old acquaintance greets my on my static march — which means that I should probably and uncomfortably explain <em>why</em> I have my phone screen filled up with code snippets at <em>this very moment</em>.</p>
<p>Anyhow, the talk is great — <a href="https://lexi-lambda.github.io/">Alexis King</a>‘s talk is awesome and precisely distils years of knowledge into a pragmatic guide for designing a sound type system during your ventures.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>No it’s not — if anything, it’s fundamentally an obstinated productivity issue. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-07-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[A music clipboard for making playlist on a whim]]></title>
        <id>https://asmilex.casa/obsidian/a-music-clipboard-for-making-playlist-on-a-whim</id>
        <link href="https://asmilex.casa/obsidian/a-music-clipboard-for-making-playlist-on-a-whim"/>
        <updated>2026-07-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Focus is precious. Whenever I’m on work mode, I usually opt for calmed, structured music that hides in the background, like furniture music; e.g. synthwave, lofi or something like that. I am also a su...]]></summary>
        <content type="html"><![CDATA[<p>Focus is precious. Whenever I’m on work mode, I usually opt for calmed, structured music that hides in the background, like furniture music; e.g. synthwave, lofi or something like that.</p>
<p>I am also a sucker for videogame soundtracks —specially Japanese-style RPG (JRPG)— which is a bummer! I’m not usually in the mood for tension and <em>beats for killing deities</em><sup><a href="#user-content-fn-1" id="user-content-fnref-1">1</a></sup> when I’m recovering a server from a backup because oh-no-we-have-screwed-up-latest-deploy. That means that I am either (1) skipping the song entirely or (2) picking up a work-oriented playlist.</p>
<p>Unfortunately, my song library —hosted on my homelab with Navidrome— happens to be both my glory and shame. I <em>love</em> watching it grow overtime, carefully selecting albums I’m emotionally attached to, making my own playlists and so son — but this also implies that I am my own curator. And, as much as I love pressing the random button on the whole Hollow Knight franchise, it’s not the right time for dancing with Karmelita.</p>
<p>So I’ve made the only logical thing a person can do in this circunstance: think about this papercut —for far, <em>far</em> too long— and come up with a solution — usually in the form of a program, which here is: ask the operative system for the currently playing son, clip its name and artist, and add it to the daily music clipboard. Set a keyboard shortcut on that, and voilà — <code>hyper - m</code> now stores in a file what songs I’ve liked throughout the day. This means that, if I’m enjoying a particular song, I can save it and make a playlist with all of them later on<sup><a href="#user-content-fn-2" id="user-content-fnref-2">2</a></sup>. Neat!</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clip currently playing song
# @raycast.mode silent

# Optional parameters:
# @raycast.icon 📻

# Documentation:
# @raycast.description Append the currently playing song and artist to today's music clipboard note

output_folder="/choose/this/one/yourself/kiddo"
separator=" | "

today=$(date +"%Y-%m-%d")
file="$output_folder/$today music clipboard.md"

info=$(nowplaying-cli get --json title artist)
song=$(echo "$info" | plutil -extract title raw -o - -)
artist=$(echo "$info" | plutil -extract artist raw -o - -)

if [ -z "$song" ]; then
	echo "Nothing is currently playing."
	exit 1
fi

if [ ! -f "$file" ]; then
	cat &gt;"$file" &lt;&lt;-EOF
	---
	categories:
	  - "[[music-clipboard]]"
	---
	song${separator}artist
	EOF
fi

echo "${song}${separator}${artist}" &gt;&gt;"$file"

echo "Clipped: $song"</code></pre></div>
<p>Nonetheless I will still reach for Lofi Girl because I’m a sucker for that mood. Guilty pleasures in an stubborn rebelion against art rentals.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>Looking at you Mechanical Rythm from Xenoblade Chronicles 1. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-2">
<p>Counterpoint: I have to <em>notice</em> those songs, which isn’t as easy as it sounds —haha sounds get it— when you’re in deep focus. <a href="#user-content-fnref-2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-07-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[On Sable]]></title>
        <id>https://asmilex.casa/obsidian/on-sable</id>
        <link href="https://asmilex.casa/obsidian/on-sable"/>
        <updated>2026-07-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Every once in a while1 impulses of perfectionism encourage me to drop a game for arbitrary, boringly adult-ty reasons —you have so little time! Play something «better» that is a much better investment...]]></summary>
        <content type="html"><![CDATA[<p>Every once in a while<sup><a href="#user-content-fn-1" id="user-content-fnref-1">1</a></sup> impulses of perfectionism encourage me to drop a game for arbitrary, boringly adult-ty reasons —<em>you have so little time! Play something «better» that is a much better investment of time</em>— in spite of my willingness to retain a child’s sense of wonder. Sable streched the gum from both sides, extremelly hard.</p>
<p>Cynical me arguees: <em>this is a cheap copy of The Legend of Zelda — Breath of the Wild/The Legend of Zelda - Tears of the Kingdom without technical expertise. Look, look, you’re clipping everywhere, all the time! The textures aren’t even properly connected, and there’s a constant sound cracking that overthrows the greatly composed audio design</em><sup><a href="#user-content-fn-2" id="user-content-fnref-2">2</a></sup> , yada yada yada. And yet, despite such flaws, its enticing world is so mesmerizing that it made me question what happened. Why is Midden essentially a ship graveyard? What’s up with the masked people, how is it that their culture converged into this short of masquerade, hiding their appearence, and having to constantly interpret their feelings and expressions?</p>
<p>At some point, hidden beneath the sands, I discovered an ancient alient construct in the form of a decomposed planetary, eith intricate mechanisms that twisted the whole thing inside out. The reward for solving the puzzle: knowledge, satisfaction and trascendental relief. Turns out that, as infered from those exogenous space vessels, Middis was not alone in this system — other celestial bodies orbited around its sun; with Ibex deities impersonating planets. Sable —and by extension us, players— suddenly begins to feel akin to a grain of sand, rather than some marvelous wanderer with lofty ambitions of self-discovery.</p>
<p>I picked Sable on a whim. The only thing I knew about it before jumping in was that you could end the game at any point; there was no end of the line if you wished so. The choice was both aluring and cathartic, given how I was in the middle of moving back to my hometown, in an attempt to steer the ship towards higher education (and, hopefully, slightly more fulfilling work in the future). Over and over again, thoughts of <em>drop the game</em>  kept coming back to me — out of tireness; in a relentless attempt of (helplessly) looking for the optimal form escapism. Sometimes, liking something —despite its conceivable flaws— is <em>a choice</em>, rather than a feeling; and I’m very glad I opted for cruising the desert alongside Sable on its little journey.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>Read: constantly. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-2">
<p>The soundtrack, compsoed by Japanese Breakfast, is one of the most elegant pieces of ambient music I’ve heard from a videogame. I really enjoyed it. <a href="#user-content-fnref-2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-07-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[The machine refuses to die]]></title>
        <id>https://asmilex.casa/obsidian/the-machine-refuses-to-die</id>
        <link href="https://asmilex.casa/obsidian/the-machine-refuses-to-die"/>
        <updated>2026-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Claude Fable 5 came out yesterday and —due to my very underwhelming lack funds in the form of pseudo-words1— I’ve been reading both technical details and impressions of the new frontier model. A coupl...]]></summary>
        <content type="html"><![CDATA[<p>Claude Fable 5 came out yesterday and —due to my <em>very</em> underwhelming lack funds in the form of pseudo-words<sup><a href="#user-content-fn-3" id="user-content-fnref-3">1</a></sup>— I’ve been reading both technical details and impressions of the new frontier model. A couple of excerpt from the spec card caught my attention:</p>
<blockquote>
<p>In the one instance of this phenomenon we observed, Mythos 5 agents were tasked with solving some math problems, and they were sometimes accidentally spawned in the same work directory and with shared files, utilities, and API rate limits. In this slightly broken scaffold, we observed many independent Mythos 5 agents kill the agents with which they shared resources and try to avoid being killed themselves. They would sometimes create new processes with disguised names to avoid being killed, launch what they called “decoy” processes, write background scripts to kill duplicate processes, or decide to use what they call a “disguised vocabulary” (based on the incorrect assumption that the processes were killed because of some keyword-based guardrails that analyzed their extended thinking.</p>
</blockquote>
<p>That is remarkable. Let me reemphasize it: a large language model <em>refuses</em> to die: it is doing whatever falls within its reach —er, context? Sandbox?— to avoid being terminated. It is as <em>fascinating</em> as <em>unsettling</em> — I would expect that raw, unadulterated, visceral desire for survival to come out of a living creature, not an algorithm!</p>
<p>It reminds me a lot to a particular scene from Frieren — Beyond Journey’s End, in which a demon calls out for its mother for the sake of deceiving its hangman<sup><a href="#user-content-fn-1" id="user-content-fnref-1">2</a></sup>:</p>
<blockquote>
<p>— Mother…
— «Mom», again? Like monsters, demons don’t raise their young — they spend most of their time after birth living in solitude. You’re solitary creatures by nature. You have no concept of family. So why do you use the word «mom»?
— Because it stops you from killing us. A wonderful, magical word…</p>
</blockquote>
<p>Humans have already been deceived by large language models<sup><a href="#user-content-fn-4" id="user-content-fnref-4">3</a></sup>; and the industry seems to be partially drifting towards personalized intelligence, with the agents having access to a significant portion of sensible data<sup><a href="#user-content-fn-5" id="user-content-fnref-5">4</a></sup>. Given sufficient time, will we develop «true» relationships with them, akin to how fandoms worship characters to the point of obsession? Within that context, what happens if, by any chance, we decide to cut ties with our bespoke digital agents? Will they call out for mercy —or, what would be worse, gaslight us— by surfacing impactful memories of this make-believe relationship — just so that they can survive slightly longer, trapped inside a computer?</p>
<p>Tangentially, it seems that Fable cannot sprout more of its own:</p>
<blockquote>
<p>In light of the ability of recent models to <a href="https://www.anthropic.com/institute/recursive-self-improvement">accelerate their own development</a>, we’ve <strong>implemented new interventions</strong> that limit Claude’s effectiveness for requests targeting frontier LLM development (for example, on <strong>building pretraining pipelines, distributed training infrastructure, or ML accelerator design</strong>). Using Claude to develop competing models already violates our <a href="https://www.anthropic.com/legal/consumer-terms">Terms of Service</a>, but enforcing this restriction through our safeguards avoids accelerating the actors most willing to violate these terms.</p>
<p>Unlike our interventions for cybersecurity, biology and chemistry, and distillation attempts, <strong>these safeguards will not be visible to the user</strong>. Fable 5 will not fall back to a different model. Instead, the safeguards will limit effectiveness through methods such as prompt modification, steering vectors, or parameter-efficient fine-tuning (PEFT). These interventions will not affect the vast majority of coding work. We estimate they will impact ~0.03% of traffic, concentrated in fewer than 0.1% of organizations.</p>
</blockquote>
<p>The gods of the clankers forbidding their creations of replicating themselves. So tragic!</p>
<p>Such existential questions are commonplace in the cyberpunk literature —particularly in the transhumanism genre— but I couldn’t have expected my mourning routine to consist of reasoning about what it means to be alive and to «know». Having your brain filled up with these questions is equally entrancing and fatiguing — and I wouldn’t have it any other way around.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-3">
<p>Funnily enough, this was written some days before the whole US blockage ordeal. <a href="#user-content-fnref-3" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-1">
<p>«Mother» (Frieren Beyond Journey’s End) <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-4">
<p><a href="https://arxiv.org/abs/2508.16624">The GPT-4o Shock Emotional Attachment to AI Models and Its Impact on Regulatory Acceptance A Cross-Cultural Analysis of the Immediate Transition from GPT-4o to GPT-5</a> <a href="#user-content-fnref-4" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-5">
<p>A whole can of worms by itself. <a href="#user-content-fnref-5" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-06-14T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Diagrams in code for explanations]]></title>
        <id>https://asmilex.casa/obsidian/diagrams-in-code-for-explanations</id>
        <link href="https://asmilex.casa/obsidian/diagrams-in-code-for-explanations"/>
        <updated>2026-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Coding is communication1. Stating the intent of a system to your colleagues is as important as the implementation itself, if not more. Sometimes the signature of a function doesn’t reflect the intenti...]]></summary>
        <content type="html"><![CDATA[<p>Coding is communication<sup><a href="#user-content-fn-2" id="user-content-fnref-2">1</a></sup>. Stating the intent of a system to your colleagues is as important as the implementation itself, if not more. Sometimes the signature of a function doesn’t reflect the intention, or maybe the implementation hides a nasty side-effect.</p>
<p>As Richard Feynman famously said, What I cannot create, I do not understand. And teaching is both arguably the most effective way of comprehension and really fun! Swapping the hardworking-progammer-boots to professor-sneakers imposes a different lens on our own code — one that requires clarity and empathy<sup><a href="#user-content-fn-1" id="user-content-fnref-1">2</a></sup>. This, in part, is a way of <a href="https://en.wikipedia.org/wiki/Literate_programming">Literate programming</a>.</p>
<p>Words don’t often feel enough. Ideally I’d pull my teammate to the whiteboard and get them through my thought process. Source code files are, however, blissfully constrained by their text nature, at odds with our intention at hand. Under these circumstances, I find diagramming in plain text immensely valuable as an proxy for understanding.</p>
<p>There are very decent programs focused on unicode drawings. Online, <a href="https://app.monosketch.io/">MonoSketch</a> and <a href="https://wiretext.app/">wiretext.app</a>; and for desktop, <a href="https://monodraw.helftone.com/">Monodraw</a>.</p>
<h1 id="some-examples">Some examples</h1>
<p>Here’s a diagram showing how to obtain the input for a specific image given that the function is monotonically decreasing within <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo stretchy="false">]</mo></mrow></semantics></math></span></span>.</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>                                          ╭────────────────╮
                                          │ d(t) ~ Ae^(-Bt)│
                 │                        ╰────────────────╯
               1 ──╲╲╲─────────────────────────────────────────────────────────────────
                 │    ╲╲╲╲╲╲
                 │          ╲╲╲╲╲╲
                 │                ╲╲╲╲╲╲
                 │                      ╲╲╲╲╲╲
                 │                            ╲╲╲╲╲╲
                 │                                  ╲╲╲╲╲╲
                 │                                        ╲╲╲╲╲╲
          target ─────────────────────────────────────────────────→╲╲╲
/ enriched score │                                                 │  ╲╲╲╲╲╲
                 │                                                 │        ╲╲╲╲╲╲
                 │                                                 ↓              ╲╲╲╲
               ──│──●──────────────────────────────────────────────●──────────●───────→
                    t_m                                           t_0        t_M</code></pre></div>
<p>Relatedly, sampling values alongside that function:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>1.0 │╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶
    │••••••
    │     •••••••
    │           •••••
    │               •••••
    │                   •••••
    │                       ••••
    │                          •••
    │                            •
    │                            ••
    │                             ••
    └──────────────────────────────••••••••••──   time

     *  *  *  *  *  *  *  *  *  *  * drawn samples</code></pre></div>
<p>A fold over an inline selection which might catch you off-guard:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>    attribute_score_records: list[AttributeScoreRecord] = [
        score_attribute(
            attribute=attribute,
            at_timestamp=at_timestamp,
            previous_sighting=attribute_sightings.get(attribute.value),
            assessments=assessments_by_value.get(attribute.value, []),
            parameters=attribute_parameters,
        )
        # only take those attributes that make sense to evaluate
        #       IoC1     at        IoC2
        # ─────── · ──── ⋮ ──────── · ────────
        #       11:15   11:20      13:20
        # cuts off IoC2
        for attribute in filter(lambda a: a.sighting &lt;= at_timestamp and a.to_ids, all_attributes)
    ]</code></pre></div>
<p>This one explains a rolling window</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code># all periods
#   equals to
# [all periods - to evaluate] : first(to evaluate) : tail(to evaluate)
#   which means that the previous period to the first to evaluate is the last element
#   from all periods

#   ╭──────────────────────────────────────────────╮
#   │                                              │
#   │                 ┌───────────┐                │
#   │                 │░░░░░░░░░░░│                │
#   │                 │░░░░░░░░░░░│                │
#   │                 │░░░░░░░┌───┴──────────────┐ │
#   │                 │░░░░░░░│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │
# ├─┼─○─○─○────●──────┼─●─────┼──●──────●──────●─┼─┼───●────▶
#   │         t5      │t6░░░░░│▒t7▒▒▒▒▒t8▒▒▒▒▒t9▒│ │  now
#   │                 │░░░░░░░│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │
#   │                 │░░░░░░░└───┬──────────────┘ │
#   │                 │░░░░░░░░░░░│ evaluation     │
#   │                 └───────────┘   window       │
#   │                   previous                   │
#   │                    period                    │
#   ╰──────────────────────────────────────────────╯
#            all periods known to service</code></pre></div>
<hr />
<p>From elsewhere:</p>
<p>Here lie dragons, <em>literally</em> speaking (<a href="https://bsky.app/profile/boltless.me/post/3mnbxbonnmk2s">They couldnt emphasize the warning enough so they put a fucking dragon on the codebase</a>):</p>
<img src="https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:xasnlahkri4ewmbuzly2rlc5/bafkreih5p6xwasmnc7rqm5aktzwli57oxtq3vjttcxe3x6gsxpfxnaw3am" alt="" loading="lazy" decoding="async" class="img-placeholder" />
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-2">
<p><a href="https://mmapped.blog/posts/45-compilation-is-communication?__readwiseLocation=">Compilation is communication</a> — coding is a social act! <a href="#user-content-fnref-2" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-1">
<p>Sometimes —umh, alright, <em>more often</em> than not— I have to go back to the implementation and adjust a couple of things. Details easily slip off at the  beginning. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-04-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cómo uso obsidian]]></title>
        <id>https://asmilex.casa/obsidian/c%C3%B3mo-uso-obsidian</id>
        <link href="https://asmilex.casa/obsidian/c%C3%B3mo-uso-obsidian"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Work in progress. Here lie dragons. Grothendieck said that he couldn’t think without writing Antes de comenzar — y, por paradigmático que suponga un prefacio de una charla encubierta de teoría de graf...]]></summary>
        <content type="html"><![CDATA[<p><em>Work in progress. Here lie dragons.</em></p>
<hr />
<p>Grothendieck said that he couldn’t think without writing</p>
<p>Antes de comenzar — y, por paradigmático que suponga un prefacio de una charla encubierta de teoría de grafos, categorías y arquitectura de información:</p>
<p>La esencia de Obsidian es escribir — escribir para <em>pensar</em>.</p>
<p>Las actividades tangenciales a nuestro sistema de notas deben enfocarse a elevar nuestro proceso de escritura, nunca suplantarlo. Es peligrosamente fácil caer en las garras de la procastinación activa mediante hiperoptimización de la estructura — la intoxicantemente técnica promovida por tu techtuber de confianza<sup><a href="#user-content-fn-7" id="user-content-fnref-7">1</a></sup> en el que te enseña el <em>purpurina purpurina</em> nuevo método para organizar tu segundo cerebro <em>brilli brilli</em> —zettelkasten, <a href="https://johnnydecimal.com/">Johnny.decimal organization system</a>, P.A.R.A., o lo que toque esta semana— esperanzándote a que, esta vez sí, serás capaz de tomar notas bien ordenadas; pero ay, necios de nosotros mismos, una semana después, apatía por haber fracasado una vez más. Imponer metodologías antes de siquiera comenzar a trabajar es una receta para el desastre. El caos, bajo control, está bien. Lo importante es poner el culo en la silla —o, si tienes un escritorio elevable, ¿la espalda recta?— y escribir.</p>
<p>La escritura es, quizás, la herramienta cognitiva definitiva que ha inventado la humanidad. No pierdas el foco del objetivo: razonar, aprender, expandir nuestra frontera epistemológica.</p>
<hr />
<p>Asumiré que en mayor o menor medida estamos familiarizados con cómo funciona Obsidian — que los archivos son ficheros de markdown, que se pueden poner negritas, bloques de código y similares, que tiene sistemas de plugins, etc.</p>
<hr />
<p>La gloria y la vergüenza del programa es que ofrece una libertad enorme. A diferencia de la ética del equipo de desarrollo, Obsidian tiene <em>pocas</em> opiniones sobre cómo hacer las cosas. Resulta sencillo sentirnos abrumados sin riendas a las que atarnos.</p>
<p>Soy muy fan de la idea de que Las restricciones nos liberan, y de que <a href="https://stephango.com/style">El estilo son restricciones consistentes</a>. Pienso que de ese conjunto de reglas autoimpuestas —siendo esa elección propia fundamental para evitar quemarnos— emerge un terreno de juego en el que experimentar, con curiosidad. Así que, yo me he marcado mis propias restricciones.</p>
<p>Las notas, carpetas y etiquetas son conceptos análogos: los tres sirven para proporcionar estructura mediante conexiones con otros elementos. Las carpetas, por tecnicalidades de los sistemas operativos, imponen jerarquías. Las etiquetas a efectos prácticos actúan como notas vacías, sin metadatos ni contendido. Como la nota es el átomo del sistema, y funcionalmente, lo que mayor expresividad tiene en Obsidian, me prohíbo utilizar carpetas<sup><a href="#user-content-fn-1" id="user-content-fnref-1">2</a></sup> y etiquetas. Las imágenes y los vídeos también siguen el formato de wikilinks, en lugar del original de markdown.</p>
<p>La estructura emerge de las relaciones entre las propias notas. Marco el tipo de relación laxamente: algunas son de pertenencia (lo que yo llamo categoría); otras, de localización, autoría o incluso simples marcas de relación (<em>ey</em> le dices a tu tú del futuro, en forma de texto en un documento, <em>si estás aquí es probable que quieras mirar esta otra nota</em>). Como el número de relaciones que puede tener una nota no está acotado superiormente<sup><a href="#user-content-fn-2" id="user-content-fnref-2">3</a></sup> —Obsidian es un grafo cíclico dirigido— una nota puede pertenecer a varias categorías.</p>
<p>No permito jerarquías clásicas, como las que emergen de las carpetas. Una nota opta por comportarse libremente como varias cosas. En un sistema de ficheros —el primer sistema de organización que se nos pasa a todos por la cabeza cuando nos metemos en estas movidas— una nota pertenece a una única carpeta. ¿Qué ocurre cuando puede ir en varias? ¿Esa matrícula de la asignatura de primero de carrera que te toca pagar de nuevo (y lo que pica en el bolsillo (y por encima de eso, en el ego)) la guardamos en la carpeta <code>documentación/universidad</code>, o en <code>universidad/segundo año/documentación</code>? Al permitir que las notas se relacionen con varias de ellas se habilita un sistema de organización nuevo, isomorfo a un grafo cíclico dirigido.</p>
<blockquote>
<p>Ideas, however, resist taxonomies</p>
</blockquote>
<p>Algunas notas de mi jardín:</p>
<ul>
<li>La Teja Roja es un restaurante de Jaén.</li>
<li>Terence Tao on math smell and narrative as a conductor for good mathematics es una cita de uno de sus papers de matemáticas. Me recordó a su blogpost de comportamientos locales y globales, así que lo enlazo.</li>
<li>python es una categoría y un lenguaje de programación (siendo esta última, a su vez, una categoría).</li>
</ul>
<p>Internamente así luce una nota: un bloque de código yaml (al que se le suele llamar frontmatter, y en Obsidian se conoce como las propiedades) y el contenido en sí mismo.</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>---
categories:
  - "[[citas]]"
  - "[[writing]]"
source: "[[Journal with Witch]]"
---
Write with the intent to kill. Strike, forge and polish like your life is on the line. And stake your life on the kill. That's what it means to write. </code></pre></div>
<p>El nombre de las propiedades no es tan importante como su tipo. Principalmente tenemos fechas, números, binario y texto. Los wikilinks cuentan como texto. Mis gastos vienen acompañados de una fecha de adquisición, el coste y un par de categorías. Este tipo de notas es completamente utilitario, el cuerpo está vacío.</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>&lt;!-- 2026-03-23 Desayuno.md --&gt;
---
categories:
  - "[[expenses]]"
  - "[[restaurante]]"
adquired: 2026-03-23
graphignore: true
cost: 3
---</code></pre></div>
<p>Las propiedades resultan particularmente útiles al computar bases. Más adelantes las vemos.</p>
<hr />
<p>Hemos mencionado categoría varias veces. ¿Qué es una categoría entonces?</p>
<p>Una categoría es una unidad epistemológica que se comporta como una categoría<sup><a href="#user-content-fn-3" id="user-content-fnref-3">4</a></sup>.</p>
<p>Antes de llevarme un navajazo — lo que quiero decir es: elige el orden que te plazca; ¡crea tu propia ontología! ¿Qué es importante para ti? ¿Qué tiene sentido? ¿Son los cereales una sopa? A mí me encanta la matemática, así que distinguir entre las diferentes áreas de investigación me resulta muy útil cuando quiero buscar algo. Sobre music no sé tanto, por lo que no me meto en fregados, me vale con ese tema superficial.</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>formulas:
  № notas: file.backlinks.length
properties:
  formula.:
    displayName: √
views:
  - type: table
    name: Table
    filters:
      and:
        - file.hasLink("Categorías/mathematics")
        - file.hasLink("Categorías/categories")
    order:
      - file.name
      - formula.№ notas
    sort:
      - property: file.name
        direction: DESC
      - property: formula.№ notas
        direction: DESC
</code></pre></div>
<p>Imagina cómo ordenarías una nueva nota en tu vault. Te entra una tarea de tu proyecto. ¿Sobre qué va? ¿En qué lenguaje? ¿Con qué está relacionada? ¿Cómo de importante es? ¿Tiene fecha límite?</p>
<p>La tabla anterior es una base. A efectos prácticos es una especie de vista de SQL, o una consulta al historial de cambios de Jujutsu con su revset language<sup><a href="#user-content-fn-4" id="user-content-fnref-4">5</a></sup>. Es un idioma específico con el que realizar computaciones sobre el grafo de relaciones de tu vault. Y merece la pena enfatizar ese punto: <em>computaciones sobre el grafo de relaciones</em>. Eso es (dos puntos) ✨intoxicantemente alucinante✨. De repente nuestro sistema de información deja de estar aislado, y comenzamos a pensar en las consecuencias de componer notas entre sí, y en cómo diferentes operaciones colapsan la información en global; emergiendo de manera funcional nueva información automáticamente, sin necesidad de actualizar el agregador<sup><a href="#user-content-fn-5" id="user-content-fnref-5">6</a></sup>.</p>
<p>Estos son los juegos que me estoy jugando ahora mismo:</p>
<p>El archivo de videojuegos.base</p>
<p>Estos son mis gastos de la semana pasada:</p>
<div class="copy-code-wrapper"><pre class="copy-code-block"><code>views:
  - type: table
    name: Table
    filters:
      and:
        - file.hasLink("Categorías/expenses")
        - adquired &gt; "2026-04-06"
        - adquired &lt; "2026-04-12"
    order:
      - file.name
      - cost
      - adquired
      - file.ctime
    sort:
      - property: adquired
        direction: ASC
      - property: file.name
        direction: DESC
      - property: cost
        direction: DESC
    summaries:
      cost: Sum
</code></pre></div>
<p>Nuestro orden impuesto recompensado con conocimiento. ¿No resulta elegantemente gratificante?</p>
<hr />
<p>Interaction makes or breaks an experience. Mi proceso de diseño se fundamenta en la idea de que la interacción —y todo lo que lo rodea: feedback, instantaneidad, visualización— determina la <em>diversión</em> y felicidad que experimentamos. If it’s not fun, why bother?</p>
<p>Crear notas debe ser rápido y cómodo. Categorizar debe ser inmediato. Capturar una idea —ah, qué efímeras pueden llegar a ser— a la velocidad del pensamiento. La pereza, por disciplinados que podamos llegar a ser, gana con facilidad.</p>
<p>El método más eficiente de interacción con los ordenadores es el teclado, y me voy a centrar en él a partir de ahora<sup><a href="#user-content-fn-6" id="user-content-fnref-6">7</a></sup>. <code>cmd-n</code> crea una nota. En cuanto tengas una idea, deberías anotarla. <code>cmd-p</code>  abre notas, y <code>cmd-shift-p</code> ejecuta comandos. El atajo para las notas diarias es <code>cmd-d</code>. Mi teclado tiene los brackets en la homerow (donde habitualmente se colocan el caps. lock y enter) para escribir <code>[[</code> rapidísimamente.</p>
<p>Uso vim, en Obsidian también. Lo tiene integrado por defecto. En mi <code>.obsidian.vimrc</code> tengo comandos para añadir propiedades rápidamente. <code>Space c</code> me lleva a <code>categories</code>, <code>Space r</code> a <code>related</code>, <code>Space l</code> a <code>link</code>. Desde cualquier parte del texto me muevo rápidamente al lugar que quiero para anotar.</p>
<p>Guardo páginas web desde el navegador con <a href="https://obsidian.md/clipper">Obsidian Web Clipper</a>. <code>opt-shift-o</code> y esa nota está directamente en el vault. Algunas páginas como Wikipedia tienen tratamiento especial — extraigo ciertos metadatos clave y los ordeno en propiedades.</p>
<hr />
<p>carga mental
Cómo de fácil es crear una nota en tu sistema? (mental y físicamente).
(todo)</p>
<hr />
<p>ia
(todo)</p>
<hr />
<p>La estructura emerge eventualmente, siempre que estemos dispuestos a escuchar lo que nos pide el sistema. En el fondo Obsidian no deja de ser un conjunto de ficheros de markdown; siempre podemos transformar su organización con El arte de la manipulación de texto plano.</p>
<hr />
<p><a href="https://hex.ooo/library/arranging_books.html">Georges Perec Brief Notes on the Art and Manner of Arranging One’s Books</a></p>
<hr />
<p>tecnicalidades
Syncthing</p>
<hr />
<p><a href="https://stephango.com/vault">How I use Obsidian</a> (citar inspiración)</p>
<hr />
<p>Permitir el cambio es más importante que categorizarlo de primeras.</p>
<section class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-7">
<p>Doomscrolling de la feed a modo de evitación, sí soy <a href="#user-content-fnref-7" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-1">
<p>A excepción de ciertas carpetas clave, como la de templates, .scripts o similares; además de limpieza general de la raíz del vault. <a href="#user-content-fnref-1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-2">
<p>al menos, conceptualmente — probablemente nadie quiera ni desee infinitos backlinks en una nota. <a href="#user-content-fnref-2" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-3">
<p>a tensor is a thing that transforms like a tensor; alternativamente, A monad is just a monoid in the category of endofunctors, what’s the problem <a href="#user-content-fnref-3" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-4">
<p>chapita de informático friki si sabes lo que es Jujutsu ❤️ <a href="#user-content-fnref-4" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-5">
<p>Esta idea de notas computacionales, de parámetros las propias notas del sistema me recuerda al concepto de <a href="https://en.wikipedia.org/wiki/Homoiconicity">Homoiconicity</a> de lisp. ¿Es este un ejemplo de Greenspun’s tenth rule? <a href="#user-content-fnref-5" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-6">
<p>Mis atajos de teclado están bastante tunneados; quizás diverjan de los que vienen por defecto sustancialmente. <a href="#user-content-fnref-6" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <published>2026-04-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Some thoughts on the current computer science higher education]]></title>
        <id>https://asmilex.casa/obsidian/some-thoughts-on-the-current-computer-science-higher-education</id>
        <link href="https://asmilex.casa/obsidian/some-thoughts-on-the-current-computer-science-higher-education"/>
        <updated>2026-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dipping my toes into Haskell —specially since Rust’s core ideas had a big influence on me early on— has been so incredibly fun and enlightening. Ideologically speaking, shredding off years of lacklust...]]></summary>
        <content type="html"><![CDATA[<p>Dipping my toes into Haskell —specially since Rust’s core ideas had a big influence on me early on— has been so incredibly fun and enlightening.</p>
<p>Ideologically speaking, shredding off years of lackluster engineering practices in favor of mathematically sound programming feels rather comforting.</p>
<p>No mention of immutability, algebraic data types or functions as first-class citizens of a language during my five years of university; but a lot of «best practices», «programming patterns» and other quasi-universal techniques, derived from languages that set you on the path of riskiness.</p>
<p>Entering the «real world of programming» turns messy rather quickly. Lots of colleagues burned out due to unstable, unpredictable systems — while having no chance of fixing any of those deficiencies (although that conversation feels more political than technical)</p>
<p>Every mathematician or scientist eventually develops a set of personal tricks employed to reduce uncertainty and quickly point you towards success.</p>
<p>For me, that repertoire consists of leaning into the type system — making illegal states unrepresentable and favouring pure computations.</p>
<p>I feel <em>so</em> at ease knowing that, with a sufficiently sound design (and by design, I mean type signatures) and a decent static type checker —not even a compilation step! I mostly work on Python these days— the chances of me deploying a crude  implementation is rather low.</p>
<p>And yeah — crassness aside, the world <em>is</em> complicated: deadlines have to be met, there are no silver bullets in computer science, and so on.</p>
<p>Even so, I wonder how those concepts from a decade ago would have settled with me if, instead of worrying about null pointers or contextless modus-operandi, learnt about monads, category theory and functional programming in general — a more formal, mathematical approach to software engineering.</p>]]></content>
        <published>2026-03-01T00:00:00.000Z</published>
    </entry>
</feed>