<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
<channel>
<title>SGCG.es</title>
<description>Últimos artículos de SGCG.es: alimento para el cerebro
para lectores incautos pero exigentes.</description>
<link>http://sgcg.es/</link>
<atom:link href="http://sgcg.es/rss2.0.xml" rel="self" type="application/rss+xml" />
<language>es-es</language>
<copyright>Copyright 2009-2011 Sergio García-Cuevas González</copyright>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<managingEditor>webmaster@sgcg.es (Sergio García-Cuevas González)</managingEditor>
<webMaster>webmaster@sgcg.es (Sergio García-Cuevas González)</webMaster>
<pubDate>Sun, 09 Aug 2026 18:08:14 +0000</pubDate>
<lastBuildDate>Sun, 09 Aug 2026 18:15:56 +0000</lastBuildDate>


<item>
<title>Desmontando nu despropósito sobre la (no) deflactación del IRPF (2)</title>
<link>http://sgcg.es/articulos/2026/08/09/desmontando-un-desproposito-sobre-la-no-deflactacion-del-irpf-2/</link>
<guid>http://sgcg.es/articulos/2026/08/09/desmontando-un-desproposito-sobre-la-no-deflactacion-del-irpf-2/</guid>
<pubDate>Sun, 09 Aug 2026 18:08:14 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Ayer echamos un vistazo inicial a una paparrucha sobre la (no)
deflactación del IRPF con la inflación: alguien afirmaba que, aunque
le han subido el salario en compensación de la inflación desde 2020,
está perdiendo 400 € al mes frente a lo que ganaría si los impuestos y
las cotizaciones se hubieran deflactado con la inflación.  Es difícil
explicar en un solo artículo lo atroz de semejante pamplina, así que
vamos a calcular con más precisión un ejemplo de cúanto podríamos
acercarnos a esa pérdida de poder adquisitivo.
</description>
<content:encoded><![CDATA[<p>Ayer echamos un vistazo inicial
a <a href="http://sgcg.es/articulos/2026/08/08/desmontando-un-desproposito-sobre-la-no-deflactacion-del-irpf/">una
paparrucha sobre la (no) deflactación del IRPF con la inflación</a>:
alguien afirmaba que, aunque le han subido el salario en compensación
de la inflación desde 2020, está perdiendo 400 € al mes frente a lo
que ganaría si los impuestos y las cotizaciones se hubieran deflactado
con la inflación.  Es difícil explicar en un solo artículo lo atroz de
semejante pamplina, así que vamos a calcular con más precisión un
ejemplo de cúanto podríamos acercarnos a esa pérdida de poder
adquisitivo.

<p>Hay que adelantar que, naturalmente, con impuestos progresivos, si
aumenta el salario para compensar exactamente la inflación y los
impuestos no se modifican, el tipo efectivo aumenta y el contribuyente
pierde poder adquisitivo.  Lo que es absurdo es asumir una pérdida de
400 € al mes como algo representativo del contribuyente español
actual.


<h3>Hipótesis</h3>

<ul>
<li>Nuestro sujeto es trabajador por cuenta ajena.

<li>Reside en Madrid (las mejores mentiras, las de Madrid).

<li>Cotizaba en 2020 según la base máxima de entonces, que era de
4070,10 € al mes.

<li>Cotiza hoy según la base máxima actual, que es de 5101,20 € al
mes.

<li>No tiene derecho a ningún descuento más allá del de otros gastos
deducibles de 2000 € que se aplica a todos los contribuyentes.

<li>La inflación en estos años ha sido del 25 % y, por lo tanto, el
salario ha subido un 25 % para compensar la inflación.

</ul>


<h3>Unos pocos números</h3>

<li>Con un 4,70 % en concepto de contingencias comunes, un 1,55 % en
concepto de desempleo y un 0,10 % en concepto de formación
profesional, el sujeto cotizaba originalmente 258,45 € al mes, es
decir, 3101,40 € al año.

<li>Con un 4,70 % en concepto de contingencias comunes, un 1,55 % en
concepto de desempleo, un 0,10 % en concepto de formación profesional
y un 0,15 % en concepto de Mecanismo de Equidad Intergeneracional, el
sujeto cotiza hoy 331,58 € al mes, es decir, 3978,96 € al año.

<p>El salario de nuestro sujeto ha de ser alto, muy alto, para que
salgan las cuentas.  Tan alto que se encuentra en el tramo más alto
del IRPF, de hecho: por encima de los 300000 € anuales.  A partir de
esta cantidad, el tipo marginal es del 24,50 % (estatal) más el
20,50 % (autonómico), es decir, del 45,00 %.  Por los primeros
300000 € de base liquidable, el trabajador ha pagado 120351,23 €.

<p>Digamos que el trabajador cobraba originalmente una
cantidad <span class="math">𝑥</span> (el resultado final será
independiente de esta cantidad exacta).  Entre IRPF y cotizaciones
sociales, este trabajador pagó el siguiente tipo efectivo:

<p class="displaymath">𝑇₁ = [120351,23 € + 3101,40 € +
0,45×(𝑥−3101,40 €−2000 €−300000 €)] ⁄ 𝑥.

<p>Tras estos años, el trabajador
cobra <span class="math">1,25𝑥</span>.  Entre IRPF y cotizaciones
sociales, este trabajador pagará este ejercicio el siguiente tipo
efectivo:

<p class="displaymath">𝑇₂ = [120351,23 € + 3978,96 € +
0,45×(1,25𝑥−3978,96 €−2000 €−300000 €)] ⁄ 1,25𝑥.

<p>La diferencia entre lo que va a pagar y lo que pagaría con el tipo
efectivo original será:

<p class="displaymath">(𝑇₂−𝑇₁) × 1,25𝑥 = −0,25×120351,23 € +
1,25×(0,45−1)×3101,40 € + (1−0,45)×3978,95 € + 0,25×0,45×2000 € +
0,25×0,45×300000 € = 3943,41 €.

<p>Mensualmente, eso sale a 328,62 €, todavía por debajo de los 400 €.
En Madrid, por ejemplo, la diferencia de 400 € al mes sería imposible
con una inflación del 25 %.  En otros lugares de España, quizá sería
posible, pero siempre con salarios elevadísimos.
]]></content:encoded>
</item>


<item>
<title>Desmontando un despropósito sobre la (no) deflactación del IRPF</title>
<link>http://sgcg.es/articulos/2026/08/08/desmontando-un-desproposito-sobre-la-no-deflactacion-del-irpf/</link>
<guid>http://sgcg.es/articulos/2026/08/08/desmontando-un-desproposito-sobre-la-no-deflactacion-del-irpf/</guid>
<pubDate>Sat, 08 Aug 2026 11:38:10 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Sobre un comentario relacionado con la (no) deflactación del IRPF
con la inflación que no tiene pies ni cabeza.
</description>
<content:encoded><![CDATA[<p>Lo de la (no) deflactación del IRPF con la inflación es un caballo
de batalla machacadísimo del que alguna gente no se cansa.  ¡Nadie
pone en duda la perogrullada de que el efecto inmediato de una rebaja
del IRPF es que se paga menos IRPF!  La cuestión es cuánto, y eso
dependerá de las circunstancias de cada contribuyente.  Ahora bien, el
debate está intoxicado por afirmaciones calamitosas.  Voy a citar un
comentario atroz publicado hace menos de veinticuatro horas:

<blockquote>
<p>Mi empresa, por una vez en la vida, me ha subido desde el COVID el
salario con la inflacion (incluso por encima en algún caso).  Pero por
la no deflactación del IRPF (y el MEI y demás mierdas) pierdo 400 € al
mes netos.
</blockquote>

<p>Esta persona concreta después que no es que cobre menos dinero en
términos nominales, sino que dispondría de 400 € mensuales adicionales
si se hubiera deflactado el IRPF (<q>y el MEI y demás mierdas</q>, y
hay que recordar que el MEI ha sido desde su creación inferior al 1 %
de la base de cotización, además de que la parte a cargo del
trabajador es una pequeña fracción de esa cantidad).


<h3>Desmontando los números escandalosos sin perder demasiado tiempo
en ello</h3>

<p>¿Tiene sentido lo de pagar 400 € de más?  La cantidad exacta de
impuestos que paga un contribuyente depende de sus ingresos, de su
lugar de residencia y de otras circunstancias personales, así que no
tiene mucho sentido hacer un cálculo detallado y preciso.

<p>Centrémonos en el IRPF, porque complicar las cosas con la Seguridad
Social no cambia la conclusión, y, para simplificar, asumamos que el
tipo autonómico es igual al estatal.  Los tipos totales en función de
la base liquidable que nos interesan son los siguientes:

<ul>
<li>19 % hasta los 12500 €.
<li>24 % desde los 12500 € hasta los 20200 €.
<li>30 % desde los 20200 € hasta los 35200 €.
</ul>

<p>Con estos tramos, habría que pasar de la nada hasta los 22000 €
anuales para tener unas retenciones de unos 400 € mensuales.  Estos
22000 € de subida son una cota inferior, porque el trabajador tendría
que haber cobrado <em>algo</em> inicialmente.  ¡No hay manera de
deflactar el IRPF con la inflación de estos años para compensar esto!

<p>También podría ser que el salario hubiera siempre de 22000 €.  Si
asumiéramos una inflación infinita, deflactar el IRPF y las
cotizaciones con ella (es decir, bajarlos a 0) supondría el ahorro de
esos 400 € mensuales para el trabajador.  Tendríamos que irnos a una
inflación como la de Zimbabue en 2008 (tan alta que podemos
considerarla casi infinita) para que los números cuadraran.

<p>O el autor del comentario miente, o no se entera de nada, o se
explica catastróficamente mal.
]]></content:encoded>
</item>


<item>
<title>El robo de Coldcard</title>
<link>http://sgcg.es/articulos/2026/08/04/el-robo-de-coldcard/</link>
<guid>http://sgcg.es/articulos/2026/08/04/el-robo-de-coldcard/</guid>
<pubDate>Tue, 04 Aug 2026 20:17:57 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Estos días está produciéndose la sustracción de una gran cantidad
de bitcoin (más de mil en el momento de escribir estas líneas:
más de medio centenar de millones de euros al cambio actual) desde
direcciones asociadas a monederos de hardware de la marca Coldcard.
</description>
<content:encoded><![CDATA[<p>Estos días está
produciéndose <a href="https://www.coindesk.com/tech/2026/08/01/how-bitcoin-cold-wallets-lost-usd70-million-in-an-attack-that-never-touched-the-devices">la
sustracción de una gran cantidad de bitcoin</a> (más de mil en el
momento de escribir estas líneas: más de medio centenar de millones de
euros al cambio actual) desde direcciones asociadas a monederos
de <i>hardware</i> de la marca Coldcard.

<p>Lo interesante de este ataque es
que <a href="https://blog.coinkite.com/entropy-technical-backgrounder/">el
error de programación que lo ha hecho posible</a>: los monederos
afectados empleaban desde hace más de cuatro años un generador de
números aleatorios de tan baja calidad que las claves generadas tenían
apenas unos cuarenta bits de entropía en algunos de los modelos
afectados.  Con un espacio tan reducido, parece viable tanto
técnicamente como económicamente generar todas las claves posibles y
comprobar si corresponden a direcciones públicas; cada vez que hay una
correspondencia, es posible operar con la dirección afectada y dejarla
sin fondos.  El movimiento se demuestra andando: más de mil bitcoin
nos indican que, en efecto, el ataque era viable.  Ante una situación
así, el único remedio consiste en transferir los fondos a una
dirección segura.
]]></content:encoded>
</item>


<item>
<title>Más práctica con secuenciador: On Off 2</title>
<link>http://sgcg.es/articulos/2026/07/31/mas-practica-con-un-secuenciador-on-off-2/</link>
<guid>http://sgcg.es/articulos/2026/07/31/mas-practica-con-un-secuenciador-on-off-2/</guid>
<pubDate>Fri, 31 Jul 2026 18:40:45 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Otra pieza producida practicando con un secuenciador.
</description>
<content:encoded><![CDATA[<p>He aquí otra pieza que produje con un secuenciador con el que
estoy
practicando: <a href="http://sgcg.es/articulos/2026/07/31/mas-practica-con-un-secuenciador-on-off-2/on-off-2.ogg"><i>On Off 2</i></a>.

<p>Aquí traté de producir algo muy, muy deprisa, partiendo del
principio de habilitar y silenciar pistas, así como transponer los
patrones melódicos de un compás según una rueda de acordes de ocho
compases de duración.
]]></content:encoded>
</item>


<item>
<title>Gnucash 5, Guile Scheme y los menús</title>
<link>http://sgcg.es/articulos/2026/07/30/gnucash-5-guile-scheme-y-los-menus/</link>
<guid>http://sgcg.es/articulos/2026/07/30/gnucash-5-guile-scheme-y-los-menus/</guid>
<pubDate>Thu, 30 Jul 2026 20:39:28 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Traté de añadir un menú de usuario al programa de contabilidad
Gnucash usando Guile Scheme, que es el lenguaje principal para que
los usuarios puedan extender Gnucash, modificando mi
~/.config/gnucash/config-user.scm.  En el momento de escribir
estas líneas, la documentación es muy escasa y los buscadores más
populares devuelven resultados entre pobres, obsoletos o, cuando
imponen el uso de modelos de lenguaje para inventarse la respuesta
a mis consultas, atrozmente incorrectos.  La conclusión a la que
llego es que parece que, actualmente, no hay una forma «oficial»
de añadir menús cualesquiera desde el fichero de configuración.
</description>
<content:encoded><![CDATA[<p>Traté de añadir un menú de usuario al programa de
contabilidad <a href="https://gnucash.org/">Gnucash</a>
usando <a href="https://gnucash.org/">Guile Scheme</a>, que es el
lenguaje principal para que los usuarios puedan extender Gnucash,
modificando mi <code>~/.config/gnucash/config-user.scm</code>.  En el
momento de escribir estas líneas, la documentación es muy escasa y los
buscadores más populares devuelven resultados entre pobres, obsoletos
o, cuando imponen el uso de modelos de lenguaje para inventarse la
respuesta a mis consultas, atrozmente incorrectos.  <strong>La
conclusión a la que llego es que parece que, actualmente, no hay una
forma «oficial» de añadir menús cualesquiera desde el fichero de
configuración</strong>.

<p>He aquí lo que averigüé averiguaciones aplicables al menos a las
versiones de Gnucash que van de la 5.0 a la 5.16.  Puedo tratar de
añadir un menú con <code>(gnc-add-scm-extension (gnc:make-menu name
path))</code>, donde <var>name</var> es el nombre del menú
y <var>path</var> es una lista con la ruta al menú (por ejemplo, si
tuviéramos el menú <kbd>A</kbd> con un submenú <kbd>B</kbd> y
quisiéramos añadir nuestro nuevo menú dentro
de <kbd>B</kbd>, <var>path</var> sería <code>(list "A" "B")</code>).
<strong>Esto no hace lo esperado normalmente, no obstante: solamente
añade submenúes dentro del menú de informes</strong>.  Probablemente,
no se trata de funciones pensadas para su consumo por parte del
usuario final.

<p>Añadir nuevos informes al menú de informes, por otro lado, es
relativamente fácil.  La entrada en el menú se añade de forma
declarativa y la <i>wiki</i> de Gnucash
contiene <a href="https://code.gnucash.org/wiki/Custom_Reports">un
artículo bastante útil</a> que explica cómo hacerlo.
]]></content:encoded>
</item>


<item>
<title>Ejemplos de uso de los bindings de Python de Gnucash (2): movimiento masivo de asientos</title>
<link>http://sgcg.es/articulos/2026/07/30/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-2-movimiento-masivo-de-asientos/</link>
<guid>http://sgcg.es/articulos/2026/07/30/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-2-movimiento-masivo-de-asientos/</guid>
<pubDate>Thu, 30 Jul 2026 18:35:09 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
He aprendido a hacer cuatro cosas con los bindings de Python del
programa de contabilidad Gnucash.  Una cosa que puede hacerse es
un renombrado masivo de asientos, que es algo que puede ser útil
si queremos enmendar alguna decisión desafortunada a la hora de
nombrar los conceptos en nuestra contabilidad doméstica.  He aquí
unas instrucciones válidas para Gnucash 5 y Python 3 y un programa
de ejemplo.
</description>
<content:encoded><![CDATA[<p>He aprendido a hacer cuatro cosas con los <i>bindings</i> de Python
del programa de
contabilidad <a href="https://gnucash.org/">Gnucash</a>.  Una cosa que
puede hacerse es mover masivamente el debe o el haber de muchos
asientos de una cuenta a otra, que es algo que puede ser útil si
queremos enmendar alguna decisión desafortunada a la hora de hacer
anotaciones en nuestra contabilidad doméstica.  He aquí unas
instrucciones válidas para Gnucash 5 y Python 3 y un programa de
ejemplo.


<h3>Trabajando con Gnucash 5 en Python 3</h3>

<p>Lo que necesitamos para trabajar con un libro de cuentas está en el
módulo <var>gnucash</var>.  Podemos importarlo así:

<p><code>import gnucash</code>

<p>Lo primero que hay que hacer es abrir una sesión.  Digamos que
tenemos un libro de cuentas, <kbd>contabilidad.gnucash</kbd>; podemos
abrirlo así:

<p><code>session = gnucash.Session("contabilidad.gnucash")
book = session.book
root = book.get_root_account()</code>

<p>Así hemos abierto una sesión (<var>session</var>), accedido al
libro de cuentas (<var>book</var>) y a la cuenta raíz
(<var>root</var>).  La sesión puede abrirse así, lo que nos obligará a
guardar nuestros cambios (<code>session.save()</code>) y cerrarla
(<code>session.end()</code>); de forma alternativa, podemos abrirla
como un <i>context manager</i>.

<p>Lo siguiente que hay que hacer es acceder a las cuenta que queremos
tocar.  Si, por ejemplo, estas cuenta son <var>Gastos</var> (la
original) y <var>Gastos.Comida</var> (donde queremos mover los
asientos), las seleccionamos así:

<p><code>source_account = root.lookup_by_full_name("Gastos")
target_account = root.lookup_by_full_name("Gastos.Comida")</code>

<p>Ahora podemos acceder a la cuenta original
(<var>source_account</var>) y listar todos los desgloses
o <i>splits</i> que le tocan con <code>account.GetSplitList()</code>.
A partir de estos desgloses, podemos acceder a los asientos o
transacciones que afectan a la cuenta y moverlos a otra cuenta
diferente.  Por ejemplo, si queremos mover todos
asientos <var>Pan</var> de la cuenta <var>Gastos</var> a la
cuenta <var>Gastos.Comida</var>, podemos hacer los siguiente:


<p><code>for split in source_account.GetSplitList():
    transaction = split.GetParent()
    if transaction.GetDescription() == "Pan":
        split.SetAccount(
        transaction.SetDescription("Pan")</code>

<p>Finalmente, guardamos y cerramos la sesión:

<p><code>session.save()
session.end()</code>


<h3>Programa de ejemplo</h3>

<p>He recogido lo expuesto arriba en un pequeño
programa: <a href="http://sgcg.es/articulos/2026/07/30/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-2-movimiento-masivo-de-asientos/batch_move_transactions.py"><var>batch_move_transactions.py</var></a>

<p>El programa puede usarse directamente como una herramienta de línea
de órdenes normal (que muestra la ayuda con la
opción <kbd>--help</kbd>) o como una función que puede llamarse desde
código de Python.  Es un poquito más complicado que lo descrito
arriba, ya que usa expresiones regulares para elegir los asientos que
mover.
]]></content:encoded>
</item>


<item>
<title>A350 completa un vuelo de más de 24 horas</title>
<link>http://sgcg.es/articulos/2026/07/28/a350-completa-un-vuelo-de-mas-de-24-horas/</link>
<guid>http://sgcg.es/articulos/2026/07/28/a350-completa-un-vuelo-de-mas-de-24-horas/</guid>
<pubDate>Tue, 28 Jul 2026 20:23:45 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Un Airbus A350-1000ULR de Qantas ha completado un vuelo de más de
24 horas entre Melbourne y Toulouse.  Tripulado por 4 pilotos y 6
ingenieros y con una carga de pago simulada, se trata de un vuelo
de prueba dentro del Proyecto Sunrise que pretende conectar Sídney
y Londres mediante vuelos directos, que es algo particularmente
notable y ambicioso.  Aunque la distancia geodésica entre Melbourne
y Toulouse es de algo menos de 1700 km (algo más de dos quintos de
la circunferencia terrestre), este vuelo siguió un camino algo más
largo y recorrió unos 23000 km (algo menos de tres quintos de la
circunferencia terrestre).
</description>
<content:encoded><![CDATA[<p>Un Airbus A350-1000ULR (una modificación del A350-1000 con más
alcance) de Qantas ha completado <a
href="https://www.flightradar24.com/data/aircraft/f-wulr#40df2c78">un
vuelo de más de 24 horas</a> <a
href="https://www.flightaware.com/live/flight/FWULR">entre Melbourne y
Toulouse</a>.  Tripulado por 4 pilotos y 6 ingenieros y con una carga
de pago simulada, se trata de un vuelo de prueba dentro del <a
href="https://www.qantas.com/en-au/onboard/fleet/a350">Proyecto
<i>Sunrise</i></a> que pretende conectar Sídney y Londres mediante
vuelos directos, que es algo particularmente notable y ambicioso.
Aunque la distancia geodésica entre Melbourne y Toulouse es de algo
menos de 1700 km (algo más de dos quintos de la circunferencia
terrestre), este vuelo siguió un camino algo más largo y, según he
podido ver tras <a
href="https://globe.adsbexchange.com/?icao=39a3fb">descargar la
traza</a>, recorrió unos 22000 km (algo menos de tres quintos de la
circunferencia terrestre), que es, francamente, un buen alcance para
la aviación comercial.

<p class="figure"> <img
src="http://sgcg.es/articulos/2026/07/28/a350-completa-un-vuelo-de-mas-de-24-horas/traza.jpg"
width="320" height="200" alt="Traza del vuelo.  Mapa de fondo de
OpenTopoMap (CC-BY-SA 3.0)."> <br>Traza del vuelo.  Mapa de fondo de
<a href="https://opentopomap.org/">OpenTopoMap</a> con
licencia <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.es">Creative
Commons Atribución-CompartirIgual 3.0</a>.
]]></content:encoded>
</item>


<item>
<title>Ejemplos de uso de los bindings de Python de Gnucash (1): renombrado masivo de asientos</title>
<link>http://sgcg.es/articulos/2026/07/27/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-1-renombrado-masivo-de-asientos/</link>
<guid>http://sgcg.es/articulos/2026/07/27/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-1-renombrado-masivo-de-asientos/</guid>
<pubDate>Mon, 27 Jul 2026 14:42:39 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
He aprendido a hacer cuatro cosas con los bindings de Python del
programa de contabilidad Gnucash.  Una cosa que puede hacerse es
un renombrado masivo de asientos, que es algo que puede ser útil
si queremos enmendar alguna decisión desafortunada a la hora de
nombrar los conceptos en nuestra contabilidad doméstica.  He aquí
unas instrucciones válidas para Gnucash 5 y Python 3 y un programa
de ejemplo.
</description>
<content:encoded><![CDATA[<p>He aprendido a hacer cuatro cosas con los <i>bindings</i> de Python
del programa de
contabilidad <a href="https://gnucash.org/">Gnucash</a>.  Una cosa que
puede hacerse es un renombrado masivo de asientos, que es algo que
puede ser útil si queremos enmendar alguna decisión desafortunada a la
hora de nombrar los conceptos en nuestra contabilidad doméstica.  He
aquí unas instrucciones válidas para Gnucash 5 y Python 3 y un
programa de ejemplo.


<h3>Trabajando con Gnucash 5 en Python 3</h3>

<p>Lo que necesitamos para trabajar con un libro de cuentas está en el
módulo <var>gnucash</var>.  Podemos importarlo así:

<p><code>import gnucash</code>

<p>Lo primero que hay que hacer es abrir una sesión.  Digamos que
tenemos un libro de cuentas, <kbd>contabilidad.gnucash</kbd>; podemos
abrirlo así:

<p><code>session = gnucash.Session("contabilidad.gnucash")
book = session.book
root = book.get_root_account()</code>

<p>Así hemos abierto una sesión (<var>session</var>), accedido al
libro de cuentas (<var>book</var>) y a la cuenta raíz
(<var>root</var>).  La sesión puede abrirse así, lo que nos obligará a
guardar nuestros cambios (<code>session.save()</code>) y cerrarla
(<code>session.end()</code>); de forma alternativa, podemos abrirla
como un <i>context manager</i>.

<p>Lo siguiente que hay que hacer es acceder a la cuenta que queremos
tocar.  Si, por ejemplo, esta cuenta es <var>Gastos.Comida</var>, la
seleccionamos así:

<p><code>account = root.lookup_by_full_name("Gastos.Comida")</code>

<p>Ahora podemos acceder a la cuenta (<var>account</var>) y listar
todos los desgloses o <i>splits</i> que le tocan
con <code>account.GetSplitList()</code>.  A partir de estos desgloses,
podemos acceder a los asientos o transacciones que afectan a la cuenta
y cambiar las descripciones.  Por ejemplo, si queremos corregir una
errata en la hemos escrito <q>Pann</q> en vez de <q>Pan</q>, podemos
hacer lo siguiente:

<p><code>for split in account.GetSplitList():
    transaction = split.GetParent()
    if transaction.GetDescription() == "Pann":
        transaction.SetDescription("Pan")</code>

<p>Finalmente, guardamos y cerramos la sesión:

<p><code>session.save()
session.end()</code>


<h3>Programa de ejemplo</h3>

<p>He recogido lo expuesto arriba en un pequeño
programa: <a href="http://sgcg.es/articulos/2026/07/27/ejemplos-de-uso-de-los-bindings-de-python-de-gnucash-1-renombrado-masivo-de-asientos/batch_rename_transactions.py"><var>batch_rename_transactions.py</var></a>

<p>El programa puede usarse directamente como una herramienta de línea
de órdenes normal (que muestra la ayuda con la
opción <kbd>--help</kbd>) o como una función que puede llamarse desde
código de Python.  Es un poquito más complicado que lo descrito
arriba, ya que usa expresiones regulares para hacer el renombrado.
]]></content:encoded>
</item>


<item>
<title>Alcanzado por el fuego el Complejo de Comunicaciones de Espacio Profundo de Madrid en Robledo de Chavela</title>
<link>http://sgcg.es/articulos/2026/07/25/alcanzado-por-el-fuego-el-complejo-de-comunicaciones-de-espacio-profundo-de-madrid-en-robledo-de-chavela/</link>
<guid>http://sgcg.es/articulos/2026/07/25/alcanzado-por-el-fuego-el-complejo-de-comunicaciones-de-espacio-profundo-de-madrid-en-robledo-de-chavela/</guid>
<pubDate>Sat, 25 Jul 2026 21:21:59 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
El fuego no discrimina y los incendios que se producen este verano,
además de causar las esperadas pero indeseables pérdidas sobre los
bienes de la población y sobre el medio natural, han alcanzado el
Complejo de Comunicaciones de Espacio Profundo de Madrid en Robledo
de Chavela.  El estado de las instalaciones es incierto, pero exist
eel consuelo de que el personal fue evacuado a tiempo.
</description>
<content:encoded><![CDATA[<p>El fuego no discrimina y los incendios que se producen este verano,
además de causar las esperadas pero indeseables pérdidas sobre los
bienes de la población y sobre el medio
natural, <a href="https://www.europapress.es/madrid/noticia-incendio-deja-situacion-critica-complejo-antenas-nasa-robledo-chavela-20260724195432.html">han
afectado al Complejo de Comunicaciones de Espacio Profundo de Madrid
en Robledo de Chavela</a>.  El estado de las instalaciones es
incierto, pero existe el consuelo de que el personal fue evacuado a
tiempo y que las antenas parecen encontrarse intactas.

<p>El Complejo de Comunicaciones de Espacio Profundo de Madrid,
operado por el Instituto Nacional de Tecnología Aeroespacial en apoyo
de la NASA, es uno de los tres grandes complejos de antenas repartidos
por la circunferencia terrestre que forman la Red del Espacio Profundo
que da soporte a las misiones interplanetarias, así como a algunas
misiones en órbita terrestre.  La red ya opera en torno al límite de
su capacidad y la pérdida de cobertura durante varias horas al día
puede ser significativa.
]]></content:encoded>
</item>


<item>
<title>Más práctica con secuenciador: Bavaria 2026</title>
<link>http://sgcg.es/articulos/2026/07/20/mas-practica-con-un-secuenciador-bavaria-2026/</link>
<guid>http://sgcg.es/articulos/2026/07/20/mas-practica-con-un-secuenciador-bavaria-2026/</guid>
<pubDate>Mon, 20 Jul 2026 21:18:14 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Otra pieza producida practicando con un secuenciador.
</description>
<content:encoded><![CDATA[<p>He aquí otra pieza que produje con un secuenciador con el que
estoy
practicando: <a href="http://sgcg.es/articulos/2026/07/20/mas-practica-con-un-secuenciador-bavaria-2026/bavaria-2026.ogg"><i>Bavaria 2026</i></a>.

<p>Hice esta pieza mientra viajaba.
]]></content:encoded>
</item>


<item>
<title>La productora cinematográfica A24 pide la retirada de contenido relacionado con The Backrooms</title>
<link>http://sgcg.es/articulos/2026/07/18/la-productora-cinematografica-a24-pide-la-retirada-de-contenido-relacionado-con-backrooms/</link>
<guid>http://sgcg.es/articulos/2026/07/18/la-productora-cinematografica-a24-pide-la-retirada-de-contenido-relacionado-con-backrooms/</guid>
<pubDate>Sat, 18 Jul 2026 12:22:10 +0000</pubDate>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/es/</creativeCommons:license>
<description>
Recientemente, A24 Films produjo Backrooms, una película ambientada
en el popular universo de ficción The Backrooms.  A pesar de que
esta ambientación, The Backrooms, es un fenómeno cultural anterior
a la película, fruto del esfuerzo colectivo de numerosos artistas
independientes, algo así como un nuevo folclore que no pertenece a
una única persona u organización, sino que es procomún a todos los
efectos, A24 ha enviado avisos de violación de derechos de autor
solicitando la retirada de la circulación contenido relacionado con
The Backrooms anterior a la propia película.  Tras la intervención del
director de Backrooms, A24 ha abortado las peticiones de retirada y
usa el comodín del clanker para eludir su responsabilidad: al parecer,
se trata de un error de un sistema automatizado.
</description>
<content:encoded><![CDATA[<p>Recientemente, A24 Films produjo
<a href="https://www.imdb.com/title/tt26657236/"><i>Backrooms</i></a>,
una película ambientada en el popular universo de ficción <i>The
Backrooms</i>.  A pesar de que esta ambientación, <i>The
Backrooms</i>, es un fenómeno cultural anterior a la película, fruto
del esfuerzo colectivo de numerosos artistas independientes, algo así
como un nuevo folclore que no pertenece a una única persona u
organización, sino que es procomún a todos los
efectos, <a href="https://www.thegamer.com/the-backrooms-a24-copyright-strike-artwork/">A24
ha enviado avisos de violación de derechos de autor solicitando la
retirada de la circulación contenido relacionado con <i>The
Backrooms</i> anterior a la propia película</a>.  Tras la intervención
del director
de <i>Backrooms</i>, <a href="https://kotaku.com/backrooms-director-kane-parsons-a24-copyright-strike-wallpaper-2000717053">A24
ha abortado las peticiones de retirada</a> y usa el comodín
del <a href="http://sgcg.es/articulos/2025/07/27/clanker/"><i>clanker</i></a> para
eludir su responsabilidad: al parecer, se trata de un error de un
sistema automatizado.
]]></content:encoded>
</item>
</channel>
</rss>
