Episodes

  • Plataformas centralizadas, GIL, aprendizaje automático, Pydantic y Python 3.10, y hemos renunciado a llevar la cuenta de los gazapos que metemos en cada tertulia https://podcast.jcea.es/python/29

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Felipem, conectando desde Cantabria.

    Juan José, Nekmo, https://nekmo.com/, https://github.com/Nekmo/. Madrileño conectando desde Málaga.

    Jesús, conectando desde Ferrol.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] "Vamos a ir cortando" es la entrada de Jesús Cea para que alguien proponga temas durante media hora más.

    [02:27] ¡Ha salido el primer podcast!: Python en español #7: ¡Metapodcast de relanzamiento! https://podcast.jcea.es/python/7.

    Plataformas de podcasting.

    No necesitas ninguna plataforma, puedes usar directamente el feed RSS https://es.wikipedia.org/wiki/Rss.

    Funkwhale https://funkwhale.audio/.

    toc2audio https://docs.jcea.es/toc2audio/.

    Jesús Cea tiene su propia plataforma de podcasting, herramientas, etc. Quiere evitar la centralización a toda costa.

    [07:37] Mercurial https://es.wikipedia.org/wiki/Mercurial y Git https://es.wikipedia.org/wiki/Git.

    En Mercurial https://es.wikipedia.org/wiki/Mercurial es imposible modificar la historia.

    Es imposible hacer nada sofisticado en Git https://es.wikipedia.org/wiki/Git sin recurrir a Google.

    Mercurial - Filosofía y visión de alto nivel: https://www.jcea.es/artic/mercurial_madrid/.

    Bitbucket https://bitbucket.org/ ya no soporta Mercurial.

    Hay alternativas pequeñitas. Por ejemplo, Heptapod https://heptapod.net/.

    Más referencias en https://www.mercurial-scm.org/wiki/MercurialHosting.

    ¡Evita la centralización!

    Al final, el 99.9% de los proyectos de código abierto los mantienen los autores originales en exclusiva.

    Microsoft to acquire GitHub for $7.5 billion https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/.

    ¿Trabajar por visibilidad? Eso se cura con la edad.

    Mantener infraestructura propia tiene su coste, pero puedes pagar a alguien para que lo haga, promoviendo multitud de plataformas federadas en vez de centralizar internet más y más.

    En cada campo de internet, hay uno o dos ganadores y nadie más pinta nada. Jesús Cea se queja mucho de eso.

    [21:54] Herramientas de aprendizaje automático (Machine Learning) https://es.wikipedia.org/wiki/Aprendizaje_autom%C3%A1tico:

    Diferencia entre aprendizaje automático "de toda la vida" y el aprendizaje con refuerzo https://es.wikipedia.org/wiki/Aprendizaje_por_refuerzo.

    Redes neuronales: TensorFlow https://es.wikipedia.org/wiki/TensorFlow y Keras https://es.wikipedia.org/wiki/Keras.

    Procesado de texto: NLTK https://es.wikipedia.org/wiki/NLTK.

    scikit-learn https://scikit-learn.org/stable/index.html.

    Algunos libros:

    Python Machine Learning - Second Edition: Machine Learning and Deep Learning with Python, scikit-learn, and TensorFlow https://www.amazon.es/Python-Machine-Learning-Sebastian-Raschka/dp/1787125939/. Hay versión en castellano.

    "TensorFlow en un dia" https://www.amazon.es/TensorFlow-Day-Neural-Network-English-ebook/dp/B07H474R7Q/. Hay versión en castellano.

    Packt publica un libro gratis al día, muchos de aprendizaje automático: https://www.packtpub.com/free-learning.

    "Towards Data Science" https://towardsdatascience.com/.

    Medium https://medium.com/. Otra plataforma centralizada de las que tanto molestan a Jesús Cea.

    Vídeos:

    Dot CSV: https://www.youtube.com/channel/UCy5znSnfMsDwaLlROnZ7Qbg.

    La IMPRESIONANTE Cancelación de Ruido de NVIDIA | Data Coffee #13 https://www.youtube.com/watch?v=d0g1EviDyWM.

    Slack https://slack.com/. ¡Arggg, otra plataforma privada centralizada!:

    ML-Hispano https://machinelearninghispano.com/.

    [30:32] PyConES 2021 https://2021.es.pycon.org/. Llamada a ponencias.

    [31:11] Incompatibilidad entre pydantic https://pypi.org/project/pydantic/ y Python 3.10: IMPORTANT: PEP 563, PEP 649 and the future of pydantic #2678 https://github.com/samuelcolvin/pydantic/issues/2678.

    PEP 563 -- Postponed Evaluation of Annotations https://www.python.org/dev/peps/pep-0563/.

    Aún quedan meses para que se publique Python 3.10, se puede dar marcha atrás.

    Spoiler: Se dio marcha atrás temporalmente. Python 3.10 se publicará sin ese cambio polémico. En principio, Python 3.11 (octubre de 2022) sí incluirá ese cambio. Detalles: PEP 563 and Python 3.10 https://mail.python.org/archives/list/[email protected]/thread/CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ/.

    [37:02] ¿Qué pensais del comportamiento actual, que ejecuta la anotación de tipos al importar un módulo?

    >>> def pepe(): ... print('hola') ... >>> def perico(x:pepe()): ... pass ... hola

    [38:47] Más aclaraciones sobre Flit https://pypi.org/project/flit/ y PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.

    [40:14] Muchas erratas en las tertulias. Hay que fiarse más de las notas de los podcasts, que se elaboran con posterioridad.

    ¡Son charlas de bar! Conversaciones informales, sin investigación detallada.

    ¿Publicar audios de fé de erratas?

    [45:07] Truquillo que puede ser útil a alguien, sobre todo al serializar objetos con ciertos protocolos que no soportan True/False:

    >>> int(True) 1 >>> int(False) 0 >>> bool(0) False >>> bool(1) True

    [46:15] Extraer parámetros "keyword" de "**keywords", de forma automática.

    >>> def a(pepe=5, **kwargs): ... print(pepe, kwargs) ... >>> a(5, siete=5) 5 {'siete': 5}

    Se explican algunos casos de uso.

    toc2audio https://docs.jcea.es/toc2audio/.

    [49:42] Dataclasses https://docs.python.org/3/library/dataclasses.html.

    PEP 557 -- Data Classes https://www.python.org/dev/peps/pep-0557/.

    Decoradores de clases: PEP 3129 -- Class Decorators https://www.python.org/dev/peps/pep-3129/.

    attrs https://pypi.org/project/attrs/.

    pydantic https://pypi.org/project/pydantic/. Validación de tipos en tiempo de ejecución. Esta biblioteca se nombra en casi todas las tertulias.

    Mypy http://mypy-lang.org/. Validación de tipos en tiempo de "testing" o integración continua.

    [01:01:12] Truco: "dar por cerrada la sesión" siempre abre temas nuevos:

    Libro: Python avanzado en un fin de semana https://www.amazon.es/Python-avanzado-fin-semana-Aprende-ebook/dp/B08XLYC38D.

    Libro de iniciación: Aprende Python en un fin de semana https://www.amazon.es/Aprende-Python-en-fin-semana-ebook/dp/B07GXDXLYC/.

    [01:03:50] GIL https://en.wikipedia.org/wiki/Global_interpreter_lock.

    Aunque solo se pueda ejecutar un hilo simultaneamente, es ventajoso cuando hay hilos dominados por la entrada/salida.

    Multihilo https://es.wikipedia.org/wiki/Hilo_(inform%C3%A1tica).

    Ha habido muchos intentos de cargarse el GIL de Python, con poco éxito.

    PEP 554 -- Multiple Interpreters in the Stdlib https://www.python.org/dev/peps/pep-0554/.

    Ejemplos de beneficios de multihilo y de tener varias CPUs https://es.wikipedia.org/wiki/Unidad_central_de_procesamiento en Python, aún con el GIL actual.

    Charla de Jesús Cea en la PyConES 2018: GIL: Todo lo que quisiste saber y no te atreviste a preguntar https://www.youtube.com/watch?v=50eOwz9lek4.

    [01:22:27] Truco: "dar por cerrada la sesión" siempre abre temas nuevos (segunda parte):

    ¿Ponerse deberes para que todos podamos aportar temas cada semana?

    [01:24:32] Uso de IDEs https://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado.

    Vim https://es.wikipedia.org/wiki/Vim.

    Autocompletado: Languaje Server Protocol https://en.wikipedia.org/wiki/Language_Server_Protocol.

    Sublime Text https://www.sublimetext.com/.

    PyCharm https://www.jetbrains.com/pycharm/.

    Eclipse https://www.eclipse.org/ide/.

    Automatizar cosas implica que puedes perder la capacidad de hacerlo "a mano", cuando lo necesites.

    [01:34:42] Eduardo "no tiene casa" :-). Eduardo nos presenta a la "jefa".

    Se emplaza un futuro debate sobre IDEs https://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado.

    Inercia para cambiar. El coste de cambiar el evidente, y lo que puede no ser evidente es el beneficio de cambiar.

    Hace falta un mentor "al lado". Ver un caso de uso.

    "Intentar salir de vim". Fuente inagotable de memes https://es.wikipedia.org/wiki/Meme.

    Módulo Mercurial que interactúa con GIT: hg-git https://pypi.org/project/hg-git/.

    FTP https://es.wikipedia.org/wiki/Ftp.

    WebDAV: https://es.wikipedia.org/wiki/WebDAV.

    Wing Python IDE: https://wingware.com/.

    El tiempo se va en pensar, no en picar código.

    También importa el perfil de código o proyecto concreto. Por ejemplo, puede haber mucha plantilla fácil de automatizar.

    [01:47:42] Truco: "dar por cerrada la sesión" siempre abre temas nuevos (tercera parte).

    [01:48:00] Cierre:

    Apuntarnos temas para traer a lo largo de la semana.

    Canal de Telegram https://t.me/joinchat/y__YXXQM6bg1MTQ0.

    [01:49:27] Mejorar el sistema de grabación de la tertulia. Jitsi https://es.wikipedia.org/wiki/Jitsi.

    Jesús Cea explica cómo graba. Algo bizarro y que funciona casi de casualidad.

    Cuando Jesús Cea grababa podcasts https://es.wikipedia.org/wiki/P%C3%B3dcast con un grupo cerrado de gente, la grabación era local cada uno en su máquina. Cada uno grababa su micrófono local y la suma de todos los demás en dos canales distintos. Eso permite tener separación de canales para editar el sonido y, si alguien se olvida de ponerlo, su voz ha quedado grabada en remoto en todos los demás.

    ALSA https://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture.

    PulseAudio https://es.wikipedia.org/wiki/PulseAudio.

    PipeWire https://en.wikipedia.org/wiki/PipeWire.

    Jesús Cea explica por qué no está usando esa tecnología en las tertulias.

    Jibri: Jitsi BRoadcast Infraestructure https://github.com/jitsi/jibri.

    aiortc https://pypi.org/project/aiortc/.

    ICE (Interactive Connectivity Establishment): https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment.

    Hay un montón de plataformas de grabación online, de pago. El problema habitual es el soporte de conexiones desde distintos dispositivos.

    [01:58:35] Despedida.

    [01:59:15] Final.

  • Tener varias versiones de Python en el mismo ordenador, estado de Durus, su licencia y cómo funciona la persistencia de datos https://podcast.jcea.es/python/28

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Jesús, conectando desde Ferrol.

    Felipem, conectando desde Cantabria.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Sergio, conectando desde Vigo.

    Juan José, Nekmo, https://nekmo.com/, https://github.com/Nekmo/. Madrileño conectando desde Málaga.

    Miguel Sánchez, email: [email protected], conectando desde Las Palmas.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Presentaciones.

    [03:47] Utilizar diferentes versiones de Python en el mismo ordenador.

    Cada paquete instalado está vinculado a una instancia concreta de Python instalada en el sistema.

    Nunca hacer pip install, sino indicar la versión: pip3.9 install.

    A la hora de instalar paquetes Python en la versión nativa del sistema operativo, se puede usar pip o bien el gestor de paquetes del sistema operativo. Mezclar ambas es una receta para el desastre.

    [16:37] Un problema de los paquetes precompilados ("wheels" https://www.python.org/dev/peps/pep-0427/) es que no se suelen precompilar de forma retroactiva para la última versión de Python que acaba de salir.

    No suelen estar disponibles hasta que sale una versión nueva del paquete, lo que puede tardar meses.

    [19:52] ¿Bibliotecas para manejar imágenes, compatibles con PyPy https://www.pypy.org/?

    Numpy https://numpy.org/ aún no funciona en PyPy https://www.pypy.org/.

    [21:17] ¿Qué es PyPy https://www.pypy.org/ exactamente?

    Jit: Compilación al vuelo https://es.wikipedia.org/wiki/Compilaci%C3%B3n_en_tiempo_de_ejecuci%C3%B3n.

    Barrera de entrada muy grande para entrar en el proyecto. Curva de aprendizaje.

    Problemas con los módulos en C. No valoraron la importancia del ecosistema.

    HPy https://hpyproject.org/.

    [27:27] Experiencia de un par de semanas con Flit https://pypi.org/project/flit/.

    Jesús Cea lo está utilizando para publicar su biblioteca toc2audio https://docs.jcea.es/toc2audio/.

    Herramienta propuesta en la charla "Python Packaging: Lo estás haciendo mal" https://www.youtube.com/watch?v=OeOtIEDFr4Y, de Juan Luis Cano.

    https://github.com/astrojuanlu/charla-python-packaging.

    https://nbviewer.jupyter.org/format/slides/github/astrojuanlu/charla-python-packaging/blob/main/Charla%20Python%20packaging.ipynb#/

    PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.

    Lo importante que es tener enlaces directos al "changelog" o a la documentación en PyPI https://pypi.org/.

    [31:32] Módulos de documentación. Carencias.

    Docstrings.

    doctest https://docs.python.org/3/library/doctest.html.

    Sphinx https://pypi.org/project/Sphinx/.

    make html.

    Tema eterno: Incluir una biblioteca en la biblioteca estándar o como biblioteca estándar.

    ReST: reStructuredText https://docutils.sourceforge.io/rst.html.

    PEP 287 -- reStructuredText Docstring Format https://www.python.org/dev/peps/pep-0287/.

    docutils: https://pypi.org/project/docutils/.

    [40:02] ¿Formato tertulia o preguntas y respuestas?

    [41:22] Estado actual de Durus https://www.mems-exchange.org/software/DurusWorks/ y comentarios variados sobre el sistema de persistencia.

    Jesús Cea ha estado intentando conectar con los autores, con poco éxito.

    Jesús Cea tiene problemas con la licencia.

    ¿Abandonar el proyecto y pasarse a ZODB https://zodb.org/en/latest/?

    La gente está haciendo "forks" https://en.wikipedia.org/wiki/Fork_(software_development) pasando olímpicamente de las licencias.

    Jesús Cea se está currando varios cambios de licencia en ciertos proyectos que le interesan, con muy poco éxito.

    ZOPE https://zopefoundation.github.io/Zope/.

    COPYRIGHT ASSIGNMENT https://www.copylaw.com/forms/copyassn.html.

    [50:32] ¿Cómo funciona un sistema de persistencia?

    Modelo completamente diferente a un ORM https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping.

    SQL: https://en.wikipedia.org/wiki/SQL.

    Working set: https://en.wikipedia.org/wiki/Working_set.

    [58:17] Volvemos al tema de licencias.

    [59:52] Explícame esto: https://lists.es.python.org/pipermail/general/2021-April/003476.html.

    Creamos un fichero "a.py" con el contenido: def x(): print('X') Creamos otro fichero "b.py" con el contenido: import a class clase: x = a.x def p(self): print(self.x) self.x() if __name__ == '__main__': a.x() b = clase() b.p() Ejecutas "b.py" y me explicas por qué sale lo que sale :-).

    [01:03:42] A la gente le encanta que le "piquen".

    [01:03:52] Las versiones actuales de Python ya han integrado el parche del "memory leak" que se habló en navidades.

    bpo-35930: Raising an exception raised in a "future" instance will create reference cycles #24995 https://github.com/python/cpython/pull/24995.

    [01:04:22] Llamada a ponencias de la PyConES https://2021.es.pycon.org/.

    [01:05:22] Volvemos al reto en https://lists.es.python.org/pipermail/general/2021-April/003476.html.

    Pista: los métodos son descriptores: https://docs.python.org/3/howto/descriptor.html.

    Bound method: https://www.geeksforgeeks.org/bound-methods-python/.

    Métodos estáticos: https://pythonbasics.org/static-method/.

    No se ha entendido nada porque ha habido numerosos cortes de sonido. El tema está bastante mejor explicado y se entiende en, por ejemplo, From Function to Method https://wiki.python.org/moin/FromFunctionToMethod.

    [01:10:02] Atributos de función. PEP 232 -- Function Attributes https://www.python.org/dev/peps/pep-0232/.

    Se pueden meter atributos a un método, pero se hace a nivel de clase, no de instancia, porque los métodos pertenecen a la clase, no a la instancia:class clase: def p(self): clase.p.hola = 78>>> x=clase()>>> x.p()>>> x.p.hola78>>> y=clase()>>> a.p.hola78>>> clase.p.hola78

    [01:14:42] Notas de las grabaciones, temas futuros y enviar temas con algún tiempo previo a la tertulia si requieren pensar.

    [01:16:06] Final.

  • Episodes manquant?

    Cliquez ici pour raffraichir la page manuellement.

  • Flit, estilos de código, reducir no es optimizar, muchas opiniones sobre cómo documentar software y minutos sobre el audio de las tertulias y su inminente publicación https://podcast.jcea.es/python/27

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Javier, conectando desde Madrid.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Prólogo y comentarios sobre la calidad del audio en las grabaciones.

    Auriculares para evitar pedir demasiado al sistema de cancelación de eco, sobre todo si la sala tiene reverberación.

    ¡Manos fuera del teclado!

    [03:32] Consejos que ha dado Pablo Gómez para mejorar nuestras grabaciones.

    [04:52] Cómo conecta y graba las tertulias Jesús Cea.

    [06:22] Publicación inminente de las tertulias.

    toc2audio https://docs.jcea.es/toc2audio/.

    [07:22] Revisamos el micro de Jesús Cea y sus roces con la ropa en tiempo real. Fue muy entretenido.

    [09:32] Repaso de la tertulia pasada.

    toc2audio https://docs.jcea.es/toc2audio/ usa Flit https://pypi.org/project/flit/.

    Erratas de lo que se dijo la tertulia pasada sobre Flit https://pypi.org/project/flit/.

    [11:20] ¿Cómo se añaden comandos nuevos al sistema en MS Windows (en Python, claro)?

    [17:52] La nota legal de rigor y presentación de los tertulianos.

    [19:27] Revisión estética de "Python en Español" https://podcast.jcea.es/python/. ¿Algún voluntario?

    [20:52] Más sobre Flit https://pypi.org/project/flit/

    Problemas con los namespaces (PEP 420 -- Implicit Namespace Packages https://www.python.org/dev/peps/pep-0420/).

    [21:42] Estilo de código. La mayor parte del código abierto lo mantiene una sola persona. Tener una cultura común de código abierto ayuda. PEP 8 https://pep8.org/.

    [24:44] Mejor explícito que implícito.

    "from X import Y as Z".

    Cuidado con las microoptimizaciones.

    Reducir no es optimizar, necesariamente.

    Comentarios obvios sin utilidad.

    Los comentarios deben explicar el contexto, no lo que puedes ver directamente en el código.

    Ejemplos de comentarios inútiles.

    Metacomentarios:

    Linter https://es.wikipedia.org/wiki/Lint.

    Vim https://es.wikipedia.org/wiki/Vim.

    [55:32] Temas de actualidad.

    Nuevas versiones (fallidas) de Python 3.8 y 3.9.

    Última alpha de Python 3.10.

    Caída de PyPI https://pypi.org/: PyPI Unavailable : https://status.python.org/incidents/rw171ylf8jw3.

    [57:27] Rarezas Python.

    What does this print, #1: https://blog.kevmod.com/2014/06/what-does-this-print-1/.

    Depende de la implementación.

    Da pistas de cómo funciona la implementación Python por dentro.

    Hay muchas ambigüedades en las implementaciones de Python. Hay muchas reglas implícitas no documentadas.

    [01:00:52] Uso de variables globales.

    Condiciones de carrera: https://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera.

    Conflictos entre múltiples instancias o múltiples hilos.

    Patrón de diseño "singleton" https://es.wikipedia.org/wiki/Singleton.

    ¿Qué es una variable global?

    "Contextvars": https://docs.python.org/3/library/contextvars.html.

    Jesús Cea amenaza con usar "Contextvars" https://docs.python.org/3/library/contextvars.html en su proyecto "toc2audio" https://docs.jcea.es/toc2audio/ por pura chulería.

    "Closures": https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).

    [01:08:02] ¿Cómo se hacen pruebas con "closures" https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica) o decoradores sofisticados?

    ¿Los tests unitarios están sobrevalorados?

    ¿Concentrarse en tests funcionales?

    Mock: unittest.mock https://docs.python.org/3/library/unittest.mock.html.

    Tests unitarios cuando se solucionan bugs, para evitar regresiones.

    Al refactorizar https://es.wikipedia.org/wiki/Refactorizar el código, hay que refractorizar tanto el código como los tests unitarios.

    Inyección de dependencias https://es.wikipedia.org/wiki/Inyecci%C3%B3n_de_dependencias.

    [01:13:07] Algunos comentarios sobre "Machete Mode": https://nedbatchelder.com/blog/202103/machete_mode_tagging_frames.html.

    [01:14:54] Detalles de la grabación e ideas de mejora.

    Jesús Cea se ha pasado la tertulia sujetando el micro con la mano y Eduardo no ha metido ruido de teclado.

    Jesús Cea tiene "ideas" de cómo grabar mejor. ¡Peligro!

    Plataformas de grabación online.

    El problema del cocktail: https://en.wikipedia.org/wiki/Signal_separation?wprov=srpw1_4#Cocktail_party_problem.

    Supresión de ruido: rnnoise https://jmvalin.ca/demo/rnnoise/.

    Cancelación de ruido espectacular de NVIDIA: https://www.youtube.com/watch?v=d0g1EviDyWM.

    Pablo Gómez utiliza Ardour https://ardour.org/ para editar los audios.

    [01:22:52] PÉRDIDA DE SONIDO.

    [01:23:07] Enlace al canal de Telegram de la tertulia: https://t.me/joinchat/y__YXXQM6bg1MTQ0.

    A Jesús Cea no le gusta nada utilizar mensajería instantanea para cosas que se quieran conservar.

    [01:24:02] PÉRDIDA DE SONIDO.

    [01:24:47] "Lo que se ha perdido ha sido la mejor conversación de la historia; lástima que no se haya grabado. La gente debería conectarse en directo a la tertulia para no perderse estas joyas". Es broma, ¿o no?. Muahahahaha :-).

    [01:26:35] Final.

  • Diseccionamos la charla de Juan Luis Cano "Python Packaging: Lo estás haciendo mal" y mucho DevOps https://podcast.jcea.es/python/26

    Este audio tiene mucho ruido producido por el roce del micrófonode Jesús Cea en la ropa.

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Felipem, conectando desde Cantabria.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Javier, conectando desde Madrid.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:50] Preludio.

    Hay que automatizarlo todo, y lo que no se puede automatizar, se documenta.

    Detalles de calidad de grabación.

    Lo que falta para publicar los audios.

    toc2audio https://docs.jcea.es/toc2audio/.

    La publicación de audios es inminente.

    Diversas plataformas de podcast https://es.wikipedia.org/wiki/Podcasting.

    Spotify https://es.wikipedia.org/wiki/Spotify.

    ¿Y publicar en Youtube?

    Estadísticas de descarga.

    [08:20] Autonomía digital.

    ¡Muerte al MP3! https://es.wikipedia.org/wiki/MP3

    [10:20] Jesús Cea se queja de que la encuesta de programadores de Python no es sobre Python.

    Python Developers Survey 2020 Results https://www.jetbrains.com/lp/python-developers-survey-2020/

    [11:55] Python Packaging: Lo estás haciendo mal https://www.youtube.com/watch?v=OeOtIEDFr4Y.

    https://github.com/astrojuanlu/charla-python-packaging.

    https://nbviewer.jupyter.org/format/slides/github/astrojuanlu/charla-python-packaging/blob/main/Charla%20Python%20packaging.ipynb#/

    La charla ha gustado bastante en general.

    Flit https://pypi.org/project/flit/.

    Mucha documentación online está anticuada. Viene bien una lista de "buenas prácticas" actualizadas.

    El peso del "legado" anticuado.

    El ecosistema se está moviendo muy rápido.

    Buenas prácticas: https://packaging.python.org/. Esperemos que alguien mantenga eso actualizado.

    PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.

    Pecado que Jesús Cea comete constantemente: ¡instalar paquetes a nivel de sistema operativo!. No le da problemas porque hace tantas barbaridades que se cancelan unas a otras. ¡Tú mejor que sigas las recomendaciones de Juan Luis Cano https://twitter.com/juanluisback!

    pipenv es el mal https://pypi.org/project/pipenv/.

    pip-tools https://pypi.org/project/pip-tools/.

    pip-compile.

    pipdeptree https://pypi.org/project/pipdeptree/.

    [35:28] A la hora de fijar dependencias, no es lo mismo bibliotecas que aplicaciones.

    [40:58] ¿Estar a la última o actualizar cuando no hay más remedio?

    ¡Tests de integración! https://es.wikipedia.org/wiki/Prueba_de_integraci%C3%B3n

    [45:15] Un 100% de cobertura de código no garantiza que se ejecuten todos los estados del código.

    [49:10] Tests de mutaciones https://es.wikipedia.org/wiki/Prueba_de_mutaci%C3%B3n.

    hypothesis https://pypi.org/project/hypothesis/.

    mutant https://pypi.org/project/mutant/.

    [50:50] Flit https://pypi.org/project/flit/.

    PEP 420 -- Implicit Namespace Packages https://www.python.org/dev/peps/pep-0420/.

    PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.

    [55:35] PEP 427 -- The Wheel Binary Package Format 1.0 https://www.python.org/dev/peps/pep-0427/.

    Conda: https://docs.conda.io/en/latest/.

    Problemas para que los Wheel soporten las nuevas versiones de Python.

    Cuando sale una nueva versión de Python, suele sernecesario esperar para tener soporte Wheels de lospaquetes que nos interesan.

    ELF (Executable and Linkable Format): https://en.wikipedia.org/wiki/Executable_and_Linkable_Format.

    [01:03:10] ¿Alguien usando un sistema operativo viejo va a instalar una versión moderna de Python?

    Si puedes instalar Python desde código fuente, seguro que puedes compilar mi librería desde código fuente también.

    Ojo con los paquetes binarios avanzados en CPUs antiguas.

    SSE: https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions.

    cmov: https://en.wikipedia.org/wiki/Predication_(computer_architecture)#History.

    [01:10:48] Docker https://es.wikipedia.org/wiki/Docker_(software).

    [01:11:20] Réplicas locales de PyPI https://pypi.org/ y PyPI privados.

    [01:14:45] ccache https://ccache.dev/.

    Ansible: https://es.wikipedia.org/wiki/Ansible_(software).

    [01:18:58] HPy https://hpyproject.org/.

    [01:20:10] ¿Proponer temas esotéricos? ¿Mandar deberes?

    [01:21:05] Más sobre HPy https://hpyproject.org/.

    API alternativa para módulos Python en C. https://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones.

    Permite generar un Wheel https://www.python.org/dev/peps/pep-0427/ que funciona en varias versiones de Python.

    Buen rendimiento tanto en CPython como en PyPy https://www.pypy.org/.

    Posible API https://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones futuro para CPython.

    [01:29:02] Ayuda para adecentar la página web de los podcasts: https://podcast.jcea.es/python/.

    La publicación de los audios es inminente.

    Reusaremos el podcast "Python en español" https://podcast.jcea.es/python/. He pedido permiso a mis antiguos compañeros.

    CSS: https://es.wikipedia.org/wiki/Hoja_de_estilos_en_cascada.

    Hay tanto retraso en la publicación que cualquier "feedback" tardará en salir y en notarse sus efectos.

    [01:35:10] Canal de Telegram de coordinación: https://t.me/joinchat/y__YXXQM6bg1MTQ0.

    [01:36:10] Machete Mode https://nedbatchelder.com/blog/202103/machete_mode_tagging_frames.html.

    Usarlo para depurar un bug.

    Pena de muerte en producción.

    Ideas locas: James Powell https://twitter.com/dontusethiscode.

    Conocimiento íntimo del lenguaje y de su implementación.

    Javier disfruta dando charlas de temas profundos y esotéricos.

    [01:42:30] El parche de Memory Leak ya se ha integrado el Python.

    bpo-35930: Raising an exception raised in a "future" instance will create reference cycles #24995 https://github.com/python/cpython/pull/24995.

    [01:43:30] Despedida y deberes futuros.

    Security funding & NYU https://discuss.python.org/t/new-packaging-security-funding-nyu/7792.

    TUF (The Update Framework) https://theupdateframework.io/.

    PEP 458 -- Secure PyPI downloads with signed repository metadata https://www.python.org/dev/peps/pep-0458/.

    PEP 480 -- Surviving a Compromise of PyPI: End-to-end signing of packages https://www.python.org/dev/peps/pep-0480/.

    En honor a Eduardo, que no se ha conectado hoy, metemos ruido de teclado para que nuestro editor Pablo no lo eche de menos.

    [01:48:20] Final.

  • Pattern Matching en Python 3.10, Sans IO y Encuesta mundial de programadores Python https://podcast.jcea.es/python/25

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Felipem, conectando desde Cantabria.

    Jesús, conectando desde Ferrol.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Advertencia de que el audio tiene lagunas y puede ser difícil seguir el hilo.

    [01:07] Conecta gente nueva y cambio de horario.

    ¡Queremos que las tertulias sean más cortas!

    [04:57] Python 3.10: ¿Mandar y cómo mandar deberes?

    ¿Probar las novedades cuando se anuncian o esperar a que entren en producción?

    [08:19] Presentaciones.

    [10:32] Jesús Cea ha enviado ya el parche para el bug que se discutió en navidades: Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    [11:12] Los que se autodenominan novatos también tienen mucho que aportar.

    [12:21] Unpacking en bucles for: PEP 3132 -- Extended Iterable Unpacking: https://www.python.org/dev/peps/pep-3132/.

    Busca en Internet: "Python tuple unpacking".

    PEP 448 -- Additional Unpacking Generalizations: https://www.python.org/dev/peps/pep-0448/.

    [15:57] Python Packaging: Lo estás haciendo mal https://www.youtube.com/watch?v=OeOtIEDFr4Y.

    https://github.com/astrojuanlu/charla-python-packaging.

    https://nbviewer.jupyter.org/format/slides/github/astrojuanlu/charla-python-packaging/blob/main/Charla%20Python%20packaging.ipynb#/

    [18:07] Machete Mode: https://nedbatchelder.com/blog/202103/machete_mode_tagging_frames.html.

    [18:42] Pattern Matching en Python 3.10:

    PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.

    PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.

    PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.

    PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.

    Tema recurrente: ¿Compensa complicar la sintaxis del lenguaje?

    [22:27] ¡Combina todo eso con el Walrus operator (operador morsa)!: PEP 572 -- Assignment Expressions https://www.python.org/dev/peps/pep-0572/.

    Presentación en vídeo: Pattern Matching in Python 3.10: https://morioh.com/p/aa1e6d5352c3, minuto 8:47.

    [24:32] Temas recurrentes de Jesús Cea: complejidad accidental del lenguaje. ¿Python ha perdido el rumbo?

    Guido van Rossum https://es.wikipedia.org/wiki/Guido_van_Rossum está apoyando muchos cambios polémicos en Python.

    El principio del fin fue la implementación de async/await y dividir Python en dos mundos: síncrono y asíncrono.

    [27:02] Código que puede funcionar tanto en el mundo síncrono y asíncrono.

    Biblioteca asyncio: https://docs.python.org/3/library/asyncio.html.

    Biblioteca unsync: https://pypi.org/project/unsync/.

    inspect.iscoroutinefunction(object): https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction.

    inspect.iscoroutine(object): https://docs.python.org/3/library/inspect.html#inspect.iscoroutine.

    inspect.isawaitable(object): https://docs.python.org/3/library/inspect.html#inspect.isawaitable.

    inspect.isasyncgenfunction(object): https://docs.python.org/3/library/inspect.html#inspect.isasyncgenfunction.

    inspect.isasyncgen(object): https://docs.python.org/3/library/inspect.html.

    [29:12] Lo bueno de tener dificultad para mezclar el mundo síncrono y el mundo asíncrono es que ha surgido un movimiento para desvincular los protocolos del propio medio de comunicación.

    Sans IO: https://sans-io.readthedocs.io/.

    Máquina de estados: https://es.wikipedia.org/wiki/M%C3%A1quina_de_estados.

    [33:15] How to write obfuscated python https://archive.org/details/pyvideo_398___how-to-write-obfuscated-python.

    [33:52] Seguridad en PyPI https://pypi.org/: New packaging security funding & NYU https://discuss.python.org/t/new-packaging-security-funding-nyu/7792.

    PEP 458 -- Secure PyPI downloads with signed repository metadata https://www.python.org/dev/peps/pep-0458/.

    Permite meter espejos de PyPI https://pypi.org/ sin tener que confiar en ellos.

    [36:27] Encuesta mundial de programadores Python: Python Developers Survey 2020 Results https://www.jetbrains.com/lp/python-developers-survey-2020/.

    Aquí no vamos a describir cada respuesta de la encuesta en lasnotas de la tertulia, pero listamos puntos y enlaces quepueden ser de interés.

    [40:32] Usar Python en el navegador web: Brython http://www.brython.info/.

    [44:42] ¿No molaría poder mezclar código Python y Javascript y poder llamarse mutuamente?

    [45:42] Precendente: Python y Java: Jython https://www.jython.org/.

    WAR: https://en.wikipedia.org/wiki/WAR_(file_format).

    [47:42] Python soportado en los navegadores.

    PyXPCOM: https://developer.mozilla.org/pl/docs/PyXPCOM.

    WebAssembly: https://es.wikipedia.org/wiki/WebAssembly.

    asm.js: https://en.wikipedia.org/wiki/Asm.js.

    Emscripten: https://emscripten.org/.

    Javascript en javascript: Polyfill https://en.wikipedia.org/wiki/Polyfill_(programming).

    Pyodide https://pyodide.org/en/stable/index.html.

    [59:37] Aún hay mucha documentación online sin actualizar, con ejemplos en Python 2.

    [01:00:42] Corte de conexión. Se supone que había un más gente grabando la tertulia, pero luego resultó que no.

    [01:04:12] pipenv https://pypi.org/project/pipenv/.

    [01:09:22] Las características deseadas de Python chocan con lo que más se valora en él...

    [01:11:32] La documentación de FastAPI https://fastapi.tiangolo.com/ es fantástica y puedes aprender muchísimos conceptos web.

    REST: https://en.wikipedia.org/wiki/Representational_state_transfer.

    [01:18:07] Libro "Modern Tkinter for Busy Python Developers" https://tkdocs.com/book.html.

    [01:19:12] En la escuesta no salen librerías de generación de PDFs https://es.wikipedia.org/wiki/PDF. Se sugieren algunas:

    Reportlab https://pypi.org/project/reportlab/.

    PyPDF3 https://pypi.org/project/PyPDF3/.

    weasyprint https://pypi.org/project/weasyprint/.

    [01:21:52] No hay representación de tecnologías de persistencia de datos en los resultados de la encuesta.

    [01:22:22] Tortoise ORM https://tortoise-orm.readthedocs.io/en/latest/index.html es asíncrona.

    [01:22:47] SQLite https://sqlite.org/ es perfecta si quieres SQL https://es.wikipedia.org/wiki/SQL, pero solo hay un programa usando la base de datos.

    [01:26:42] Map/Reduce https://es.wikipedia.org/wiki/MapReduce.

    Manta: Triton's object storage and converged analytics solution https://apidocs.joyent.com/manta/.

    [01:27:32] Lo dejamos en la mitad de la encuesta: Technologies and Cloud.

    [01:28:22] Intentamos coordinar el acceso a la segunda captura de audio de la tertulia. Lamentablemente la cosa no funcionó.

    [01:29:22] Queda pendiente comentar cómo va la publicación de las tertulias en formato podcast.

    [01:30:17] ¡Nuevo horario!

    [01:31:05] Final.

  • Evolución de la sintaxis de Python, comunidades locales y metareferencias a las grabaciones de las tertulias https://podcast.jcea.es/python/24

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Jesús, conectando desde Ferrol.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Gato, desde Chile.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:53] Volvemos a estar poquita gente.

    Comunidades locales en Galicia.

    Python Vigo: https://www.python-vigo.es/.

    Makerspaces: https://en.wikipedia.org/wiki/Hackerspace.

    GPUL: Grupo de Programadores e Usuarios de Linux: https://www.gpul.org/.

    [05:48] Propuesta de cambio en la sintaxis de lambda.

    Ventaja de la sintaxis actual: al aparecer el término "lambda", se puede buscar en Internet.

    El lenguaje cada vez es más opaco y complejo.

    [09:58] Asistencia escasa en las últimas tertulias. ¿Cómo afrontarlo?

    ¿Proponer temas a lo largo de la semana?

    [12:23] Volvemos al cambio de sintaxis de lambda.

    PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.

    [15:03] Guido van Rossum https://es.wikipedia.org/wiki/Guido_van_Rossum está apoyando muchos cambios polémicos en Python.

    Nominación de Pablo Galindo al Steering Council: https://discuss.python.org/t/steering-council-nomination-pablo-galindo-salgado-2021-term/5720.

    [16:58] ¿Python intenta seguir la estela de otros lenguajes con los que compite?

    PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.

    El parser nuevo abre muchas posibilidades peligrosas.

    Lista de correo de Python-ideas: https://mail.python.org/mailman3/lists/python-ideas.python.org/.

    [23:38] ¿Dónde se almacenan los valores por defecto de los parámetros de una función?

    Librerías para procesar y generar bytecode https://es.wikipedia.org/wiki/Bytecode python.

    Ejemplo: simplificar la sintaxis de meter código ensamblador desde Python.

    Decoradores que manipulan las tripas de las funciones, a nivel de bytecode https://es.wikipedia.org/wiki/Bytecode.

    Módulo "dis" https://docs.python.org/3/library/dis.html.

    import dis>>> def a():... return 5...>>> dis.dis(a) 2 0 LOAD_CONST 1 (5) 2 RETURN_VALUE

    [30:13] Cómo mezclar código síncrono y asíncrono, en función del tipo de función que te llama.

    inspect.iscoroutinefunction(object): https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction.

    inspect.iscoroutine(object): https://docs.python.org/3/library/inspect.html#inspect.iscoroutine.

    inspect.isawaitable(object): https://docs.python.org/3/library/inspect.html#inspect.isawaitable.

    inspect.isasyncgenfunction(object): https://docs.python.org/3/library/inspect.html#inspect.isasyncgenfunction.

    inspect.isasyncgen(object): https://docs.python.org/3/library/inspect.html.

    [32:03] Bibliotecas con "plugins". Namespaces: PEP 420 -- Implicit Namespace Packages https://www.python.org/dev/peps/pep-0420/.

    Problemas con el "modo desarrollo" del paquete.

    PEP 402 -- Simplified Package Layout and Partitioning: https://www.python.org/dev/peps/pep-0402/. Este PEP se rechazó.

    PEP 382 -- Namespace Packages https://www.python.org/dev/peps/pep-0382/.

    Ficheros pth: https://docs.python.org/3/library/site.html.

    [42:21] Charla Python Madrid: Python Packaging: Lo estás haciendo mal https://www.youtube.com/watch?v=OeOtIEDFr4Y.

    Buenas prácticas actuales.

    Se puso como deberes futuros.

    [45:11] Metareferencia: Podcast: Python en español: https://podcast.jcea.es/python/.

    Notas y capítulos para poder navegar por las grabaciones.

    Temas pendientes para poder publicar los audios.

    Biblioteca toc2audio: https://docs.jcea.es/toc2audio/.

    MP3 https://es.wikipedia.org/wiki/Mp3 en formato VBR https://es.wikipedia.org/wiki/Tasa_de_bits_variable.

    ¿Dónde colgar las grabaciones? ¿Secuestrar y resucitar el podcast "Python en español": https://podcast.jcea.es/python/?

    Zope: https://es.wikipedia.org/wiki/Zope.

    [51:33] Temas Django https://www.djangoproject.com/:

    Consultas complejas usando el ORM https://es.wikipedia.org/wiki/Asignaci%C3%B3n_objeto-relacional.

    SQL: https://es.wikipedia.org/wiki/SQL.

    Postgresql: https://www.postgresql.org/.

    MySQL: https://www.mysql.com/.

    MariaDB: https://mariadb.org/.

    [55:38] Novedades Python 3.10:

    PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.

    PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.

    PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.

    PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.

    ¿Deberes futuros?

    What the f*ck Python! https://github.com/satwikkansal/wtfpython

    Docker: https://en.wikipedia.org/wiki/Docker_(software).

    [01:02:18] Podcast: Python Bytes: https://pythonbytes.fm/.

    Hablar de las cosas habiéndolas probado.

    Real Python https://realpython.com/.

    No hay contenido comparable en español.

    [01:05:08] Traducción de la documentación Python al español:

    Documentación Python en Español: https://docs.python.org/es/3/.

    Documentación oficial de Python en español https://pyar.discourse.group/t/documentacion-oficial-de-python-en-espanol/238/23.

    GitHub: https://github.com/python/python-docs-es/.

    Documentación oficial de Python en Español https://elblogdehumitos.com/posts/documentacion-oficial-de-python-en-espanol/.

    docs.python.org en Español https://elblogdehumitos.com/posts/docspythonorg-en-espanol/.

    [01:06:43] Tutorial de Python en español: https://docs.python.org/es/3/tutorial/index.html.

    [01:07:08] Python España: Aprende Python https://www.es.python.org/pages/aprende-python.html.

    Parece abandonado.

    [01:07:43] Eventos Python en España: http://calendario.es.python.org/.

    Costaba mucho que la gente avisase de los eventos. Al final había que estar en todas partes y poner mucha oreja.

    [01:09:03] Automatizaciones de seguimientos.

    [01:09:43] La dificultar para crear comunidad.

    [01:10:38] Iniciativa de comunidades tecnológicas de Madrid.

    Problemas comunes de los organizadores: conseguir ponentes, reservar locales, conseguir subvenciones, gente que se apunta y luego no acude, etc.

    Calendario de actividades tecnológicas en Madrid.

    [01:13:18] Python para desarrollar herramientas de sonido.

    Latencia.

    PulseAudio: https://es.wikipedia.org/wiki/PulseAudio.

    Instrumentos VST: https://es.wikipedia.org/wiki/Virtual_Studio_Technology.

    Jesús Cea ha escrito software de control de una emisora de radio. Detalles.

    Ojo con el sistema de recogida de basuras. gc — Garbage Collector interface: https://docs.python.org/3/library/gc.html.

    [01:19:43] Capítulos en podcasts. Más detalles sobre el "workflow" de edición de sonido.

    Biblioteca: https://docs.jcea.es/toc2audio/.

    rnnoise: https://jmvalin.ca/demo/rnnoise/.

    [01:22:53] Despedida.

    Experimento con deberes para poder tratar temas profundos habiéndolos visto con anterioridad.

    [01:24:18] Final.

  • Hoy estamos poquitos en la tertulia y eso permite hablar a gente que nunca ha hablado antes: ¿Cómo puede aprender Python un novato? Python y seguridad https://podcast.jcea.es/python/23

    Audio procesado con "rnnoise": https://jmvalin.ca/demo/rnnoise/.

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Jesús, conectando desde Ferrol.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Gato, desde Chile.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:53] Hoy no se han conectado los habituales (Virako conectó un rato en medio de la sesión). Por suerte, Jesús, un oyente silencioso habitual, se apiadó de mí.

    ¿Cómo empezamos a programar en Python?

    Empezar con el tutorial: https://docs.python.org/es/3/tutorial/index.html.

    [05:43] Jesús Cea coleccionaba lenguajes de programación en su juventud.

    Forth: https://es.wikipedia.org/wiki/Forth.

    Ensamblador: https://es.wikipedia.org/wiki/Lenguaje_ensamblador.

    [06:23] "La mejor herramienta para cada trabajo" tiene un coste oculto. Especializarse.

    [07:23] Mercado laboral en España para trabajar en remoto.

    Los empleadores tienen exigencias poco realistas.

    [09:18] Hay mucho material para aprender.

    Saqueadores edición técnica: http://set-ezine.org/.

    [12:48] Formación formal.

    [14:03] Comunidades locales Python:

    Python Vigo: https://www.python-vigo.es/.

    Se intentaba montar algo en La Coruña.

    Makerspaces: A Industriosa https://aindustriosa.org/.

    [16:23] ¿Recursos que pueda usar un novato para aprender?

    Asociación Python España: https://www.es.python.org/.

    Lista de correo Python-es: https://mail.python.org/mailman/listinfo/python-es.

    Internet.

    [19:23] Raspberry PI https://www.raspberrypi.org/, ESP8266 https://es.wikipedia.org/wiki/ESP8266, ESP32 https://es.wikipedia.org/wiki/ESP32.

    [21:43] Puesta al día de la semana.

    [23:28] Encuesta mundial de programadores de Python: Python Developers Survey 2020 Results https://www.jetbrains.com/lp/python-developers-survey-2020/.

    [24:04] Ya estamos repasando las grabaciones, con vista a publicarlas.

    Las notas jugarán un papel importante en las grabaciones.

    Capítulos.

    [26:03] IPFS: https://es.wikipedia.org/wiki/IPFS.

    Peer 2 Peer: https://es.wikipedia.org/wiki/Peer-to-peer.

    webrtc: https://es.wikipedia.org/wiki/WebRTC.

    Contribuir compartiendo las fotos de Python España.

    BitTorrent: https://es.wikipedia.org/wiki/BitTorrent.

    [29:33] Métricas de calidad de código.

    Complejidad ciclomática: https://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica.

    Radon: https://pypi.org/project/radon/.

    Cobertura de test: Coverage https://pypi.org/project/coverage/.

    Cada pequeño paso ayuda.

    [35:08] Porcentaje de código nuevo y mantenimiento.

    [36:33] Se perdió parte de la grabación de la tertulia de la semana pasada. Explicaciones.

    Explicación de cómo se graban las tertulias.

    [41:13] Packt https://www.packtpub.com/. Muchos libros digitales sobre Python.

    Un libro gratis al día: https://www.packtpub.com/free-learning.

    Bot de telegram de notificaciones diarias: https://t.me/packtpubfreelearning.

    [44:33] Funciones que son malas prácticas en C.

    C++ 'strcpy' gives a Warning (C4996): https://stackoverflow.com/questions/4012222/c-strcpy-gives-a-warning-c4996

    [46:23] Tema recurrente: ¿poner deberes?

    [48:08] ¿Progresos sobre Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676, visto en tertulias anteriores?

    Bug poco prioritario.

    Jesús Cea propone algunos rodeos al problema.

    runpy: https://docs.python.org/3/library/runpy.html.

    [52:09] Volvemos al tema de cómo un novato puede aprender desde cero.

    Hacer un proyecto pequeño.

    Intentar no extenderse mucho, no hacer "muchas cosas".

    Si no tiene base, el código del novato va a ser malo y con mucho más esfuerzo del necesario. Hace falta cierto tutelaje.

    Examinar un proceso ajeno "pequeño" y estudiarlo.

    Project Euler: https://projecteuler.net/.

    Kata: https://es.wikipedia.org/wiki/Kata.

    Ventajas de un libro: Aprendizaje estructurado, gradual y que prioriza lo importante.

    Aprende Python en un fin de semana || Libro – PDF – EPUB – Descargar https://elcientificodedatos.com/aprende-python-en-un-fin-de-semana/.

    Python España: Aprende Python https://www.es.python.org/pages/aprende-python.html.

    Comunidades locales.

    ¿Las charlas valen para algo?

    ¿Alguien que no sabe programar en absoluto entiende qué significa a = a + 1?

    Commodore VIC-20: https://en.wikipedia.org/wiki/Commodore_VIC-20.

    BASIC: https://es.wikipedia.org/wiki/BASIC.

    Escribir código a mano puede ayudar.

    [01:11:13] ¿Los emails de recordatorio a las listas de correo sirven para algo? ¿Son spam?

    [01:13:43] Python y seguridad. ¿Recomendaciones para novatos?

    OWASP: https://owasp.org/.

    OWASP Top Ten Web Application Security Risks: https://owasp.org/www-project-top-ten/.

    Listas de correo de seguridad.

    Desbordamiento de búfer: https://es.wikipedia.org/wiki/Desbordamiento_de_buffer.

    Podcast: Security Now https://twit.tv/shows/security-now.

    Hispasec: Noticias de seguridad diaria: Una al Día: https://unaaldia.hispasec.com/.

    The CERT C Secure Coding Standard https://www.amazon.com/CERT-Secure-Coding-Standard/dp/0321563212.

    Cada lenguaje tiene sus propios fallos de seguridad típicos, propios de las idiosincrasias o el estilo de ese lenguaje.

    [01:22:43] PEP 578 -- Python Runtime Audit Hooks https://www.python.org/dev/peps/pep-0578/

    Audit events table: https://docs.python.org/3/library/audit_events.html.

    [01:24:43] Los "Framework" te protegen de fallos típicos conocidos https://es.wikipedia.org/wiki/Framework.

    Si el "framework" es popular y se le encuentra un bug, eres susceptible a un ataque masivo.

    Ejemplo: WordPress: https://es.wikipedia.org/wiki/WordPress.

    Hay que preocuparse de tenerlo actualizado.

    Django: https://www.djangoproject.com/.

    Ataque de cadena de suministro: https://es.wikipedia.org/wiki/Ataque_a_cadena_de_suministro.

    [01:28:53] DevOps: https://es.wikipedia.org/wiki/DevOps.

    Docker: https://www.docker.com/.

    ¿Quién se preocupa de actualizarlo?

    [01:31:53] Volvemos al tema OWASP https://owasp.org/.

    OWASP Top Ten Web Application Security Risks: https://owasp.org/www-project-top-ten/.

    [01:32:53] ¿En qué posición está Python respecto a la seguridad, respecto a otros lenguajes de programación?

    DB-API 2.0: PEP 249 -- Python Database API Specification v2.0 https://www.python.org/dev/peps/pep-0249/.

    sqlite3: https://docs.python.org/3/library/sqlite3.html.

    Aunque un lenguaje de programación sea razonablemente seguro, los programadores introducen fallos de seguridad en su código. Algunos ejemplos.

    pickle: https://docs.python.org/3/library/pickle.html.

    eval: https://docs.python.org/3/library/functions.html#eval.

    [01:36:43] Ataque de cadena de suministro: https://es.wikipedia.org/wiki/Ataque_a_cadena_de_suministro.

    Poison packages – “Supply Chain Risks” user hits Python community with 4000 fake modules: https://nakedsecurity.sophos.com/2021/03/07/poison-packages-supply-chain-risks-user-hits-python-community-with-4000-fake-modules/.

    Cualquiera puede subir un módulo nuevo a PYPI: https://pypi.org/.

    [01:40:53] Costes del código abierto.

    La reputación no basta.

    Trabajo ingrato.

    Depender del trabajo voluntario es un problema.

    [01:43:13] Auditoría automática de código.

    Hay una diferencia entre código con bugs y ataques maliciosos conscientes.

    Ejemplo, Antivirus. VirusTotal: https://www.virustotal.com/gui/, Hispasec https://hispasec.com/es/.

    Un clásico de 1984: "Reflections on Trusting Trust": https://users.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf.

    [01:46:08] Es un problema universal. Dependemos del trabajo de mucha gente que no cobra, que lo hace por amor al arte.

    Referencia obligada a XKCD https://xkcd.com/:

    Dependency https://xkcd.com/2347/.

    Wikipedia XKCD: https://es.wikipedia.org/wiki/Xkcd.

    OpenSSL https://es.wikipedia.org/wiki/OpenSSL:

    Heartbleed https://es.wikipedia.org/wiki/Heartbleed.

    WordPress: https://es.wikipedia.org/wiki/WordPress.

    [01:50:03] Empresas que dan soporte comercial a productos de código abierto.

    Red Hat: https://es.wikipedia.org/wiki/Red_Hat.

    Opinión de Jesús Cea: Se vende tranquilidad, no seguridad.

    Desplazas la responsabilidad a otro.

    Gestión de riesgo. Proteger su puesto de trabajo.

    "No han despedido nunca a nadie por comprar IBM": https://loscuenca.com/2010/04/nunca-han-despedido-a-nadie-por-contratar-a-______/

    [01:55:23] Hoy ha sido un día raro en la tertulia, faltan (casi) todos los habituales y habla gente que no ha hablado nunca.

    Jesús Cea ya ha perdido el miedo a que no se conecte nadie a la tertulia semanal.

    [02:00:33] Falta la voz del "novato".

    Aprende Python en un fin de semana || Libro – PDF – EPUB – Descargar https://elcientificodedatos.com/aprende-python-en-un-fin-de-semana/.

    [02:09:03] Traducción de la documentación Python al español:

    Documentación Python en Español: https://docs.python.org/es/3/.

    Documentación oficial de Python en español https://pyar.discourse.group/t/documentacion-oficial-de-python-en-espanol/238/23.

    GitHub: https://github.com/python/python-docs-es/.

    Documentación oficial de Python en Español https://elblogdehumitos.com/posts/documentacion-oficial-de-python-en-espanol/.

    docs.python.org en Español https://elblogdehumitos.com/posts/docspythonorg-en-espanol/.

    [02:11:28] Final.

  • Os dejamos con la miel en los labios, pero hasta ese momento hablamos de la interacción entre las clases abstractas y MYPY, más complejidad en la sintaxis de Python con el PEP 637, PIP, dependencias varias y seguridad, y los tipos de PEP que hay. ¿Bokeh o Plotly? Haberte conectado en directo... https://podcast.jcea.es/python/22

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Javier, conectando desde Madrid.

    Miguel Sánchez, email: [email protected], conectando desde Las Palmas.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    José Juan.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:53] Vamos progresando en la publicación de las grabaciones.

    Pablo Gómez, twitter: @julebek, nuestro sufrido editor de audio, está enviando a Jesús Cea ya algunos audios procesados.

    La calidad de los audios originales es bastante mala.

    Capítulos en audios: Biblioteca toc2audio https://docs.jcea.es/toc2audio/.

    Jesús Cea quiere notas exhaustivas de cada grabación. El audio es casi redundante. Lo que estás leyendo ahora mismo, vaya.

    [06:45] El aviso legal de rigor para grabar los audios y publicarlos luego.

    [06:58] Presentaciones.

    [09:58] Jesús Cea habla mucho.

    [10:53] Interacción entre clases abstractas https://docs.python.org/3/library/abc.html y MYPY http://mypy-lang.org/.

    [18:28] Expansión explosiva del tamaño del bytecode https://es.wikipedia.org/wiki/Bytecode generado por un programa trivial Python.

    Ojo, teclear este código tal cual puede tumbar tu máquina ypuedes necesitar reiniciar, perdiendo lo que estés haciendocon el ordenador.

    (1<<19**8,)*2 (1<<19**8,)*4**7

    Build a Compiler Bomb: Python 3, 13 byte source, 9,057,900,463 byte (8.5GiB) .pyc-file / Python 3, 16 byte source, >32TB .pyc-file (if you have enough memory, disk space and patience) https://codegolf.stackexchange.com/questions/69189/build-a-compiler-bomb/69415#69415.

    16 bytes of Python code compiles to 32 terabytes of bytecode https://www.reddit.com/r/Python/comments/llccey/16_bytes_of_python_code_compiles_to_32_terabytes/.

    [27:48] GitHub actions: https://github.com/features/actions.

    [28:43] PEP 637 -- Support for indexing with keyword arguments https://www.python.org/dev/peps/pep-0637/.

    La sintaxis de Python es cada vez más compleja.

    Jesús Cea se sorprende de que Guido van Rossum https://es.wikipedia.org/wiki/Guido_van_Rossum esté "pervertiendo" tanto Python.

    Muchos cambios de sintaxis se justifican para ciertos usuarios (cálculo numérico) y resulta que a esos usuarios no les está preguntando nadie.

    Los lenguajes empiezan simples y se van complicando... siendo reemplazados por otros lenguajes que empiezan simples.

    Estos temas se han tratado con frecuencia y profundidad en tertulias anteriores.

    El lenguaje se particiona en "sublenguajes" y "subculturas".

    BNF (Backus–Naur form): https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_Backus-Naur.

    JavaScript: The Good Parts: https://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742.

    ¿Cómo aprende Python la gente novata?

    Grupos de excepciones: PEP 654 https://www.python.org/dev/peps/pep-0654/.

    asyncio https://docs.python.org/3/library/asyncio.html contamina todo tu código.

    Trio: https://pypi.org/project/trio/.

    [44:26] Metaconversacion sobre temas recurrentes en la tertulia.

    ¿Puesta al día anual sobre temas recurrentes?

    [45:08] ¿Cómo se numeran los PEP https://www.python.org/dev/peps/?

    Cuando se actualiza un PEP, no cambia de numeración.

    Black: https://pypi.org/project/black/.

    Los PEP incluyen una sección de cambios, historia del PEP.

    PEP 494 -- Python 3.6 Release Schedule https://www.python.org/dev/peps/pep-0494/.

    PEP 373 -- Python 2.7 Release Schedule https://www.python.org/dev/peps/pep-0373/.

    [51:08] A veces para ver los cambios de un proyecto, a veces no hay más remedio que examinar el propio sustema de control de versiones. Documentar los cambios debería ser obligatorio, pero no todos los proyectos lo usan https://es.wikipedia.org/wiki/Changelog.

    [53:28] El valor de los DeprecationWarning: https://docs.python.org/3/library/exceptions.html#DeprecationWarning. ¿Cuándo los arreglas?

    Deuda técnica.

    Estrategia: Bloquear dependencias.

    Acumular actualizaciones tampoco es buena idea.

    Que tus tests comprueben tus dependencias suele ser una mala práctica, pero para los tests de integración puede ser buena idea para asegurarse la estabilidad del ecosistema del proyecto.

    [58:13] Los problemas de bloquear dependencias de forma transitiva.

    pip freeze https://pip.pypa.io/en/stable/cli/pip_freeze/.

    virtualenv: https://pypi.org/project/virtualenv/.

    [01:02:56] pip https://pypi.org/project/pip/ no tiene "hooks" https://es.wikipedia.org/wiki/Hooking, pero las versiones recientes tienen un proceso de resolución de dependencias bastante sofisticado.

    [01:05:43] Paquete "safety" https://pypi.org/project/safety/.

    [01:07:38] Salto de fe al hacer pip install. Paquetes maliciosos.

    Ataque a cadena de suministro https://es.wikipedia.org/wiki/Ataque_a_cadena_de_suministro.

    [01:09:23] Motivación económica para secuestrar el DNS https://es.wikipedia.org/wiki/Dns.

    [01:10:58] Nombres inexplicables de paquetes en PIP.

    [01:11:28] RFC 2606: Reserved Top Level DNS Names https://datatracker.ietf.org/doc/html/rfc2606.

    Por ejemplo, http://example.org/ .

    [01:13:53] Recursos en español de Python:

    Pybonacci: https://pybonacci.org/.

    Chema Cortés: https://blog.ch3m4.org/.

    AlgoriSoft: https://algorisoft.com/. Cursos de Django https://www.djangoproject.com/.

    [01:16:28] Comparativa entre Bokeh https://bokeh.org/ y Plotly https://plotly.com/python/.

    Gráficos dinámicos en JavaScript para el navegador web, pero alimentado desde Python en el servidor.

    [01:19:46] La grabación se cortó aquí debido a "un problema técnico" (entre la silla y el teclado de Jesús Cea). Se ha perdido más o menos la última media hora.

    [01:19:55] Final.

  • Grupos de excepciones (PEP 654), PYPI y hasta bitcoins y blockchains (¡sin hype!) https://podcast.jcea.es/python/21

    Este audio tiene mucho ruido producido por el roce del micrófonode Jesús Cea en la ropa.

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Javier, conectando desde Madrid.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:53] El aviso legal de rigor.

    ¡Hay un voluntario para editar!

    [02:23] Pasamos a reunirnos en la sala "py2021" en vez de en la sala "py2020".

    [03:13] ¿Las cadenas son inmutables? Las cadenas son inmutables, pero los id() se reutilizan cuando se liberan objetos.

    Se explica qué es id(). No es una identidad persistente, depende de su direcciñon de memoria y la memoria se reutiliza cuando se liberan objetos.

    [07:23] ¿Hay forma de mutar una cadena? No desde el propio lenguaje, pero desde C y... ¡No vayas por ahí!

    Python 3.9.2 soluciona un desbordamiento de memoria.

    [10:03] Grupos de excepciones: PEP 654 https://www.python.org/dev/peps/pep-0654/.

    Lista de correo de Python Ideas: https://mail.python.org/mailman3/lists/python-ideas.python.org/.

    Si usas la funcionalidad, la sintaxis y semántica de las excepciones se modifica.

    Como ocurrió con async y await, si alguno de los paquetes nuevos usa esta funcionalidad, te contaminará tu propio código.

    [14:28] Probar una biblioteca en diferentes versiones de Python.

    Tener varias versiones instaladas de Python.

    make altinstall es tu amiga para poder instalar varias versiones diferentes de Python a la vez en el sistemas operativo.

    Diferencia entre llamar a python3 y llamar a python3.6.

    Matriz de tests.

    Docker: https://es.wikipedia.org/wiki/Docker_(software).

    Flake8: https://pypi.org/project/flake8/.

    [22:43] Bibliotecas y cambios de sintaxis en Python con la evolución del intérprete.

    Si código Python 3 funciona en Python 2... ¿El código era Python 3 realmente?

    Proyectos con compatibilidad mal especificada.

    [25:53] Pruebas en varias versiones:

    Tox: https://pypi.org/project/tox/.

    pyenv: https://pypi.org/project/pyenv/.

    Pylint: https://pypi.org/project/pylint/.

    [27:53] Black: https://pypi.org/project/black/.

    Reformateador de código "nazi".

    Se acabaron las discusiones de estilo.

    ¿Puede un formateador "nazi" ser configurable? ¿No es un oxímoron?

    [32:28] Pasar tests y comprobaciones cuando se mete código en el control de versiones:

    gitlint: https://jorisroovers.com/gitlint/.

    vim-autopep8: https://vim-autopep8.readthedocs.io/en/latest/.

    [34:53] PEPs recientes con cambios de sintaxis: Grupos de excepciones y "pattern matching":

    Grupos de excepciones: PEP 654 -- Exception Groups and except* https://www.python.org/dev/peps/pep-0654/.

    La semántica cambia bastante y "contamina" el código como lo hace async/await.

    PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.

    PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.

    PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.

    PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.

    [40:28] Trio https://pypi.org/project/trio/ programación asíncrona mejor hecha que con asyncio https://docs.python.org/3/library/asyncio.html.

    El concepto de "guardería" en Trio: https://trio.readthedocs.io/en/stable/reference-core.html#trio.Nursery.

    [44:23] Python ha cumplido 30 años. La primera versión pública fue la 0.9.1 en 1991.

    Happy birthday, Python, you're 30 years old this week: Easy to learn, and the right tool at the right time https://www.theregister.com/2021/02/20/python_at_30/.

    Compilación en sistemas operativos modernos: https://github.com/smontanaro/python-0.9.1.

    [45:13] Comparación de diferentes tipos. En Python 2 se podían mezclar, pero en Python 3 no.

    Programar funciones de comparación personalizadas.

    Definir tipos personalizados que sepan compararse entre sí.

    Problemas al migrar un sistema de persistencia de Python 2 a Python 3.

    BTree: https://es.wikipedia.org/wiki/%C3%81rbol-B.

    [52:33] ¿Por qué Pillow https://pypi.org/project/Pillow/ se sigue importando como import PIL, la librería que reemplazó hace eones?

    Confuso.

    Casos similares (hay muchos más):

    python-dateutil https://pypi.org/project/python-dateutil/.

    Beautiful Soup: https://pypi.org/project/beautifulsoup4/.

    dnspython https://pypi.org/project/dnspython/.

    [59:18] Seguridad en PYPI https://pypi.org/.

    [01:00:48] ¿El buscador de PYPI https://pypi.org/ sirve para algo? El orden por relevancia es un chiste.

    [01:02:18] Estadísticas de descarga en PYPI https://pypi.org/:

    Antes había contadores de descargas.

    Vanity: https://pypi.org/project/vanity/.

    Ahora tenemos: (depende de Google)

    PyPI Download Stats https://pypistats.org/.

    pypinfo https://pypi.org/project/pypinfo/.

    [01:09:48] Servicios que Google ha matado: https://killedbygoogle.com/.

    229 servicios hasta el momento.

    [01:10:23] Jesús y su ideología de servicios gratuitos que crecen a costa del trabajo de los usuarios.

    Encima dependes de ellos y queman el mercado para servicios comerciales.

    La resignación y pasividad de los usuarios.

    [01:13:28] Idea de Jesús: Estamos viviendo en la edad oscura de la informática. Dentro de 50 años no se podrá acceder a la información generada en estos momentos.

    Por ejemplo: Videojuegos en red con servidores.

    https://archive.org/.

    GeoCities https://es.wikipedia.org/wiki/GeoCities.

    Tumblr https://es.wikipedia.org/wiki/Tumblr.

    [01:16:43] ¿Mirrors de PYPI https://pypi.org/? Ahora mismo no hay verificación de firmas digitales.

    Package signing & detection/verification: https://github.com/pypa/warehouse/milestone/16.

    Red distribuida por IPFS https://es.wikipedia.org/wiki/Sistema_de_archivos_interplanetario o BitTorrent https://es.wikipedia.org/wiki/BitTorrent.

    Ideas de Jesús para Python España: red distribuida de fotos de las PyConES http://www.es.pycon.org/.

    [01:21:13] Montar servicios encima de PYPI https://pypi.org/.

    PYPI proporciona RSS https://es.wikipedia.org/wiki/Rss.

    PyPI recent updates https://pypi.org/rss/updates.xml.

    PyPI newest packages https://pypi.org/rss/packages.xml.

    [01:24:43] GitHub: Security vulnerability alerts for Python https://github.blog/2018-07-12-security-vulnerability-alerts-for-python/.

    [01:25:13] Compilar paquetes binarios para Windows.

    [01:26:48] Cython https://pypi.org/project/Cython/ y mypyc https://github.com/mypyc/mypyc.

    [01:28:33] A veces te importa a ti más el código que al dueño de la biblioteca.

    Dinámicas de colaboración en proyectos de código abierto.

    Core developer de Python: Mariatta Wijaya - What is a Python Core Developer? https://www.youtube.com/watch?v=hhj7eb6TrtI.

    La importancia de la realimentación.

    [01:35:43] Kodi https://es.wikipedia.org/wiki/Kodi y dinámica del proyecto:

    La compresión de datos en WebDAV.

    Que la gestión de base de datos sea Python.

    Bajar la barrera de entrada al proyecto.

    [01:39:21] ¿Qué micros tenemos para grabar? ¿Cómo hablamos?

    [01:45:08] Digresión sobre BitCoins https://es.wikipedia.org/wiki/Bitcoin y la importancia de hacer copia de seguridad del monedero.

    Blockchain https://es.wikipedia.org/wiki/Cadena_de_bloques.

    BitCoin desarrolla ideas muy interesantes.

    Prueba de trabajo: https://es.wikipedia.org/wiki/Sistema_de_prueba_de_trabajo.

    Cypherpunk: https://en.wikipedia.org/wiki/Cypherpunk.

    Contrato inteligente: https://es.wikipedia.org/wiki/Contrato_inteligente.

    Datos abiertos: https://es.wikipedia.org/wiki/Datos_abiertos.

    [01:55:23] Ojo, que todo queda grabado para la posteridad. Estamos teniendo una conversación de bar. Hay que valorar que las opiniones son opiniones de bar, con el peso de una opinión de bar.

    [01:58:03] ¿Poner deberes? Nadie tiene tiempo...

    [01:58:58] La motivación para hacer todo esto.

    Solapar intereses es difícil.

    [02:00:23] Despedida.

    [02:01:45] Final.

  • Internet Archive, no acabamos de hablar del nuevo "pattern matching", complejidad creciente de la sintaxis de Python https://podcast.jcea.es/python/20

    Participantes:

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Javier, conectando desde Madrid.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [01:33] Cómo documentar en Python.

    Google docs: https://docs.google.com.

    Wikis en GitHub: https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis.

    Ventajas de tener la documentación en el control de versiones del proyecto.

    Ventajas de ir escribiendo la documentación mientras escribes el propio código: Realimentación.

    Sphinx: https://www.sphinx-doc.org/en/master/.

    sphinx.ext.autodoc: https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html.

    plantuml: https://github.com/sphinx-contrib/plantuml.

    Markdown: https://www.markdownguide.org/.

    [03:48] La vieja guardia es escéptica con las novedades de la semana.

    No hay balas de plata.

    La documentación guía el desarrollo.

    Paralelismo con los tests.

    [08:38] Open source y la vergüenza: tests y documentación.

    [09:28] CPython Internals Book https://realpython.com/products/cpython-internals-book/.

    [11:13] HPy https://hpyproject.org/. Nuevo API https://es.wikipedia.org/wiki/Api para programar extensiones C para Python, independizándote de la versión del intérprete y compatible con cosas como PyPy: https://www.pypy.org/.

    [13:18] Internet Archive como biblioteca de libros modernos: https://archive.org/details/inlibrary.

    Funciona como una biblioteca tradicional.

    Préstamo de libros.

    Están escaneando a toda velocidad: 2.5 millones de libros en el momento de escribir estas notas (mayo de 2021).

    Internet Archive: https://archive.org/.

    Wayback Machine: https://web.archive.org/.

    Preservación de videojuegos, páginas en flash, discos de música...

    [17:03] Web de Python en Internet Archive.

    1997: https://web.archive.org/web/19970606181701/http://www.python.org/.

    1998: https://web.archive.org/web/19981212032130/http://www.python.org/.

    Un ejemplo de "batteries included": https://commons.wikimedia.org/wiki/File:Python_batteries_included.jpg.

    [17:53] Jesús Cea echa de menos la internet distribuida.

    [18:23] Pattern Matching en Python 3.10. PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.

    ¿"match" y "case" serán palabras reservadas?

    PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.

    Se repasa la funcionalidad un poco por encima.

    [27:48] Logs fáciles de configurar y decorados con colorines:

    Daiquiri: https://daiquiri.readthedocs.io/en/latest/.

    Colorama: https://pypi.org/project/colorama/. Compatible con Windows.

    [29:28] Truco: Python -i: Ejecuta un script y pasa a modo interactivo.

    Comentado hace unas semanas.

    También se puede hacer desde el propio código concode.InteractiveConsole(locals=globals()).interact().

    Jesús Cea se queja de que usando la invocación desde códigono funciona la edición de líneas. Javier da la pista correcta:para que funcione, basta con hacer import readline antes delanzar el modo interactivo.

    [30:48] Manhole: https://pypi.org/project/manhole/.

    [31:53] Breakpoints condicionales https://docs.python.org/3/library/pdb.html#pdbcommand-condition.

    breakpoint() como función nativa: PEP 553 -- Built-in breakpoint() https://www.python.org/dev/peps/pep-0553/.

    import pdb; pdb.set_trace().

    [33:28] Scraping a mano:

    scrapy shell: https://docs.scrapy.org/en/latest/topics/shell.html.

    Jesús Cea no echa de menos Scrapy https://docs.scrapy.org/en/latest/.

    [36:03] Indexador y buscador de documentos: Whoosh https://whoosh.readthedocs.io/en/latest/intro.html.

    Jesús necesitaba ignorar tildes, lo que impacta en la extracción del lexema.

    El backend está documentado, para que te lo puedas currar tú si lo necesitas.

    [38:23] ¿Cómo hacer copia de seguridad de un fichero de 600 gigabytes con pocos cambios internos?

    [40:58] Eduardo Castro ha ganado un hackathon en Pontevedra.

    Software para Django: https://www.djangoproject.com/.

    [46:38] Experiencias agridulces con los hackathones https://en.wikipedia.org/wiki/Hackathon.

    Netflix Prize https://en.wikipedia.org/wiki/Netflix_Prize.

    [50:38] Una URL puede no estar no disponible ya cuando escuchas el podcast:

    Podcast: Programar es una mierda: https://www.programaresunamierda.com/.

    [52:28] Jamii https://jamii.es/.

    API https://es.wikipedia.org/wiki/Api

    [55:38] GraphQL https://es.wikipedia.org/wiki/GraphQL.

    REST: https://es.wikipedia.org/wiki/Transferencia_de_Estado_Representacional.

    Permisos de usuario.

    No hay cacheo.

    Vulcain: https://github.com/dunglas/vulcain.

    [01:02:53] HTTP/2 https://en.wikipedia.org/wiki/HTTP/2.

    HTTP/2 Server Push: https://en.wikipedia.org/wiki/HTTP/2_Server_Push.

    No se tiene que responder por orden. Multiplexación.

    [01:08:53] La explosión de la complejidad innecesaria ocultada por bibliotecas:

    OAuth2 https://en.wikipedia.org/wiki/OAuth#OAuth_2.0.

    OpenID: https://en.wikipedia.org/wiki/OpenID.

    [01:10:33] Complejidad creciente de la sintaxis de Python.

    Volvemos a Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.

    Complejidad de la sintaxis.

    Un lenguaje pequeño y capaz reemplaza a lenguajes dinosaurio. Python reemplazó a otros lenguajes dinosaurio. Ahora Python es un dinosaurio. ¿Cuándo saldrá un lenguaje que reemplace a Python?

    [01:12:13] Metaclases https://realpython.com/python-metaclasses/.

    Closures: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).

    [01:15:08] Empiezan a aparecer sublenguajes, tribus, subculturas de Python.

    Ciertos cambios de sintaxis pueden unificar subculturas: "la forma oficial de hacerlo".

    El operador ternario de Python v = VALOR1 if CONDICIÓN else VALOR2: PEP 308 -- Conditional Expressions https://www.python.org/dev/peps/pep-0308/.

    List comprehension: [f(i) for i in ITER if CONDICIÓN(i)]: PEP 202 -- List Comprehensions https://www.python.org/dev/peps/pep-0202/.

    [01:20:18] En los viejos tiempos, podías hacer barbaridades como True = 0. Esto funciona en Pythonn 2.7. Es algo que se cambió en Python 3.0: https://docs.python.org/3.0/whatsnew/3.0.html#changed-syntax.

    [01:21:53] Jesús Cea echa de menos que se eliminen cosas. Está obsesionado con el tamaño del lenguaje.

    ¿Qué eliminaríamos?

    [01:25:23] El lenguaje C incluye solo lo mínimo imprescindible.

    [01:26:48] Curiosidades: What the f*ck Python! https://github.com/satwikkansal/wtfpython:

    >>> all([])True>>> all([[]])False>>> all([[[]]])True

    [01:28:03] Algunos avances en la investigación del bug descrito por Virako en las últimas semanas: Ejemplo de código: https://pastebin.com/vGM1sh8r.

    Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.

    Issue9914: trace/profile conflict with the use of sys.modules[__name__] https://bugs.python.org/issue9914.

    Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.

    Requiere mejorar el módulo runpyhttps://docs.python.org/3/library/runpy.html.

    A nadie le ha dolido lo suficiente el bug como parasolucionarlo. No es que sea realmente difícil. Tal vez sí.

    [01:35:53] Nuitka https://nuitka.net/.

    Ejecutables Python independientes de lo que tengas instalado en el sistema. Por ejemplo, para poder usar una versión de Python "moderna".

    También funciona en MS Windows.

    [01:39:43] Tertulia previa: Fuentes de caracteres con ligaduras.

    Combinación de caracteres unicode.

    Las banderas de los países, por ejemplo, son un código "bandera" seguido del código del país: https://en.wikipedia.org/wiki/Regional_indicator_symbol.

    La bandera de Taiwan se ve distinta en China que en el resto del mundo: https://emojipedia.org/flag-taiwan/.

    "Collation" https://en.wikipedia.org/wiki/Unicode_collation_algorithm, para ordenar y comparar correctamente caracteres unicode: PyICU: https://pypi.org/project/PyICU/.

    [01:50:23] Cuando el Steering Council https://www.python.org/dev/peps/pep-0013/ vota un tema polémico, la decisión es final. Ya no se busca el consenso a toda costa.

    [01:52:53] Despedida.

    [01:53:55] Final.

  • ¿Se pueden usar diferentes versiones de una misma librería en un proyecto? (resumen: ¡No vayas por ahí!). MultiVersion Concurrent Control https://podcast.jcea.es/python/19

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Javier, conectando desde Madrid.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Prólogo:

    FOSDEM https://fosdem.org/.

    Escuchar audios previos para ver errores y comentar "erratas".

    [03:07] ¡Tenemos un voluntario para editar el podcast!

    Detalles de cómo grabamos las tertulias.

    Todo se graba en una sola pista :-(.

    RNNoise: https://people.xiph.org/~jm/demo/rnnoise/.

    Ideas para automatizar el proceso.

    [09:17] Aviso legal de que se está grabando el sonido y que se va a publicar online.

    El audio publicado tendrá un índice en texto, para poder hacer búsquedas y poder moverse con facilidad entre temas.

    [11:22] Errata de la tertulia anterior: No, pipenv https://pypi.org/project/pipenv/ no puede instalar dos versiones diferentes de la misma librería.

    [13:07] Tormenta de ideas https://es.wikipedia.org/wiki/Lluvia_de_ideas sobre cómo usar diferentes versiones de la misma librería en el mismo proyecto. Conclusión: ¡No vayas por ahí!

    Las bibliotecas solo se cargan una vez en el programa, aunque se hagan muchos import en el código.

    sys.modules https://docs.python.org/3/library/sys.html#sys.modules.

    Dependencias transitivas.

    Subintérpretes Python. PEP 554: https://www.python.org/dev/peps/pep-0554/.

    Módulos en C: PEP 489 -- Multi-phase extension module initialization https://www.python.org/dev/peps/pep-0489/.

    [22:17] Python 3.10a5. PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.

    ¡Más sintaxis nueva!

    PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.

    [23:57] Nuitka https://nuitka.net/.

    Puede generar un binario que no depende de tener nada instalado.

    [26:02] Volvemos a "Structural Pattern Matching" https://www.python.org/dev/peps/pep-0636/.

    "Switch" con esteroides.

    [27:32] Lo importante que fue la modernización de los tutoriales y ejemplos para ayudar a la migración de Python 2 a Python 3.

    PEP 414 -- Explicit Unicode Literal for Python 3.3 https://www.python.org/dev/peps/pep-0414/.

    Jesús Cea opina que la migración de Python 2 a Python 3 se hizo mal y ha sido muy traumática.

    [30:22] PEP 8 https://www.python.org/dev/peps/pep-0008/.

    ¿Ajustarse estrictamente a 80 columnas?

    Flake8: https://pypi.org/project/flake8/.

    [33:22] Mucho cuidado con "python-ideas" https://mail.python.org/mailman3/lists/python-ideas.python.org/.

    Tabulación de código.

    La anotación de tipos puede gustar o no, pero de momento es opcional.

    Tema recurrente: ¿Qué es ser pythonico?

    [35:12] Ventajas de anotar tipos.

    Origen de MYPY: http://mypy-lang.org/.

    Aportar información al IDE https://en.wikipedia.org/wiki/Integrated_development_environment.

    Valor a la hora de documentar los tipos en los API https://en.wikipedia.org/wiki/API.

    [39:52] Cryptography https://cryptography.io/en/latest/ y polémica al integrar módulos en Rust https://en.wikipedia.org/wiki/Rust_(programming_language)

    Comunidad tóxica.

    [41:27] Digresión sobre systemd https://en.wikipedia.org/wiki/Systemd y otras cosas de sistemas.

    ¿El cambio por el cambio?

    [45:07] El peso de la web está moviéndose otra vez al backend. ¿Qué opciones tiene Python en este area?

    El cliente web solo envía eventos al servidor y recibe cambios al DOM https://es.wikipedia.org/wiki/Document_Object_Model enviadas por el servidor.

    Abre la posibilidad olvidarnos de JavaScript: https://es.wikipedia.org/wiki/JavaScript.

    ItsNat: https://en.wikipedia.org/wiki/ItsNat.

    [51:02] splash https://pypi.org/project/splash/. Servicio de dibujado de javascript en Python.

    AJAX: https://es.wikipedia.org/wiki/AJAX.

    [56:07] Integrar Python en otros programas y demonios.

    LUA: https://es.wikipedia.org/wiki/Lua.

    [57:07] PyOxidizer https://pyoxidizer.readthedocs.io/en/stable/ y PyO3 https://pyo3.rs/.

    Interactuar con otros lenguajes.

    Python en Java, interactuando sin dolor: Jython https://www.jython.org/.

    [59:52] ¿Cómo empezamos en Python?

    Valor de Python como lenguaje fácil de entender y pseudocódigo.

    SpamBayes: http://spambayes.sourceforge.net/.

    Tutorial de Python: https://docs.python.org/es/3/tutorial/index.html.

    bc -l https://linux.die.net/man/1/bc.

    [01:05:07] Modificación atómica de ficheros.

    En Unix se suele hacer: write + flush + rename.

    rename: https://www.man7.org/linux/man-pages/man2/rename.2.html.

    MS Windows eso no funciona.

    Python 3.3 añadió os.replace() https://docs.python.org/3.8/library/os.html#os.replace.

    En MS Windows es atómico... casi siempre: Issue8828: Atomic function to rename a file https://bugs.python.org/issue8828.

    [01:10:02] Combinar fork e hilos en Python es una receta para el desastre.

    fork: https://www.man7.org/linux/man-pages/man2/fork.2.html.

    multiprocessing: https://docs.python.org/3/library/multiprocessing.html.

    [01:11:37] Decorador @overload https://docs.python.org/3/library/typing.html#typing.overload.

    @functools.singledispatch https://docs.python.org/3/library/functools.html.

    ¿Qué se ve cuando salta una excepción?

    Especializaciones.

    Cython https://cython.org/.

    [01:17:00] AnyIO https://anyio.readthedocs.io/en/stable/basics.html. Unificación de reactores asíncronos.

    [01:18:12] "lxml soporta xpath".

    Hilo en la lista de correo: "[Python-es] Biblioteca XPATH" https://mail.python.org/pipermail/python-es/2021-February/037931.html.

    lxml: https://lxml.de/.

    beautifulsoup4: https://pypi.org/project/beautifulsoup4/.

    XPath: https://es.wikipedia.org/wiki/XPath.

    Scrapy: https://scrapy.org/.

    El buscador de PyPI https://pypi.org/ funciona fatal a la hora de ordenar por relevancia.

    [01:20:02] El valor de estudiar el código fuente ajeno no solo para aprender de él sino también para descubrir qué bibliotecas útiles utilizan para añadirlas a tu cajón de herramientas.

    Es la documentación última.

    Los tests son muy útiles para saber cómo se usa el producto.

    [01:22:02] ¿Cómo gestionáis la paginación cuando los datos del backend cambian? ¿Cómo evitáis repetir resultados o saltaros datos?

    Brainstorming de diversas estrategias.

    Berkeley DB: https://pypi.org/project/berkeleydb/.

    lmdb: https://pypi.org/project/lmdb/.

    Multiversion concurrency control: https://es.wikipedia.org/wiki/Multiversion_concurrency_control.

    Copy on Write: https://es.wikipedia.org/wiki/Copy_on_write.

    Snapshot: https://es.wikipedia.org/wiki/Copia_instant%C3%A1nea_de_volumen.

    BTree: https://es.wikipedia.org/wiki/%C3%81rbol-B.

    PostgreSQL: https://www.postgresql.org/.

    ZFS: https://es.wikipedia.org/wiki/ZFS_(sistema_de_archivos).

    Normalización y formas normales: https://es.wikipedia.org/wiki/Forma_normal_(base_de_datos).

    [01:48:42] FOSDEM https://fosdem.org/:

    Virako recomienda las siguientes:

    Some SQL Tricks of an Application DBA - Non-trivial tips for database development https://fosdem.org/2021/schedule/event/postgresql_some_sql_tricks_of_an_application_dba/.

    Database Disasters and How to Find Them https://fosdem.org/2021/schedule/event/postgresql_database_disasters_and_how_to_find_them/.

    Practical advice for using Mypy - Hidden gems in the typing system! https://fosdem.org/2021/schedule/event/python_mypy/.

    Escaping the Cargo Cult - How to structure your project without losing your mind. https://fosdem.org/2021/schedule/event/python_escaping_cargo_cult/.

    [01:52:02] Charla Python Madrid https://www.python-madrid.es/.

    TDD - ¿panacea del desarrollo o pérdida de tiempo? https://www.python-madrid.es/meetings/reunion-febrero-2021-python-madrid/.

    [01:54:27] Comentado en la tertulia de la semana pasada: Bugs sobre "pickle" https://docs.python.org/3/library/pickle.html en el módulo __main__.

    Se trata de un problema conocido.

    Ejemplo de código: https://pastebin.com/vGM1sh8r.

    Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.

    Issue9914: trace/profile conflict with the use of sys.modules[__name__] https://bugs.python.org/issue9914.

    Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.

    [02:00:42] Que te cuenten lo que no funciona es mucho más interesante.

    Postmortem.

    [02:02:52] Whoosh: https://whoosh.readthedocs.io/en/latest/intro.html. ¿Cómo normalizar las palabras para español?

    La palabra "real" Whoosh: https://www.wordreference.com/es/translation.asp?tranword=whoosh. Dificultades para buscar el proyecto Python Whoosh https://whoosh.readthedocs.io/en/latest/intro.html en internet.

    [02:05:48] Final.

  • Anotaciones de tipos: ¿Son pythónicas? También versiones de paquetes y grafos de dependencias https://podcast.jcea.es/python/18

    En este audio hay un hablante que no identifico. ¿Quien es?. Esquien habla, por ejemplo, en 01:06:00 o en 01:12:00. ¿Antoni?

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Dani, conectando desde Málaga.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Preámbulo.

    Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.

    Dificultades con el horario de la tertulia.

    Podría haber más tertulias en otros horarios, llevadas por otras personas.

    Problemas para publicar los audios.

    Editar es un infierno.

    Las notas de los audios tienen una importancia transcendental.

    Dinámica de las tertulias.

    Antiguo podcast "Python en español": https://podcast.jcea.es/python/.

    [08:32] Presentaciones.

    Raspberry Pi Pico: https://www.raspberrypi.org/products/raspberry-pi-pico/.

    Micropython: https://www.micropython.org/.

    [13:32] El aviso legal para poder grabar los audios.

    [14:32] Bugs sobre "pickle" https://docs.python.org/3/library/pickle.html en el módulo __main__.

    Se trata de un problema conocido.

    Ejemplo de código: https://pastebin.com/vGM1sh8r.

    Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.

    Issue9914: trace/profile conflict with the use of sys.modules[__name__] https://bugs.python.org/issue9914.

    Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.

    [16:27] Lo importante que es abrir bugs, para que puedan solucionarse. Queja productiva.

    [18:12] Nueva versión de MYPY http://mypy-lang.org/ y MYPYC https://github.com/mypyc/mypyc, que aprovechan Python 3.9.

    Sigue fallando mucho.

    [20:42] pyannotate https://pypi.org/project/pyannotate/ para meter anotaciones de tipos de forma automática.

    Las dificultades de meter tipos en un proyecto ya maduro.

    [22:52] Puedes usar tipos o no. Son opcionales. Ventajas en equipos grandes.

    Linter: https://es.wikipedia.org/wiki/Lint.

    Impone disciplina y una cultura.

    Las anotaciones de tipos no se verifican en tiempo de ejecución. Se usan en el sistema de test e integración continua.

    Una de la ventaja de los "__slots__" es que si te equivocas en el nombre de atributo en una asignación, te dará un error claro. Los tipos ayudan aquí también.

    "pyannotate" https://pypi.org/project/pyannotate/.

    Las anotaciones de tipos te permiten luego compilar Python para ganar rendimiento "sin coste".

    Las anotaciones se pueden meter en el mismo código o en un fichero "compañero".

    Usar un fichero "compañero" es útil para poder usar anotaciones modernas en versiones antiguas de Python.

    Evitar "contaminar" el sistema de control de versiones con cambios masivos irrelevantes que ofuscan la historia de un proyecto. Por ejemplo, el autor original del código.

    Que los creadores de código y los etiquetadores de tipos sean personas diferentes.

    "typeshed": Collection of library stubs for Python, with static types: https://github.com/python/typeshed.

    ¿Y meter tipos en los comentarios, como se hacía antiguamente?

    Hay mucha literatura de ingeniería de software sobre si es bueno documentar tipos o no, según el tipo de equipo y el tipo de proyecto.

    [40:17] Python podría ser mucho más rápido aunque no se usen tipos. Podría ser mucho más inteligente.

    Descubrimiento de tipos en tiempo de ejecución.

    Tema recurrente.

    Numba: https://numba.pydata.org/.

    Javascript V8: https://en.wikipedia.org/wiki/V8_(JavaScript_engine).

    [43:06] Habiendo tantos compiladores, ¿por qué no se integra alguno en el intérprete normal de Python?

    Complejidad y compatibilidad.

    Faltan manos.

    Hay muchos "gérmenes" que no germinan.

    Dispersión de esfuerzos.

    [46:12] Puntos de dolor de Python para la gente que viene de otros lenguajes:

    Tipos.

    Velocidad.

    Espacios significantes.

    [46:37] ¿Qué es "Python"?

    Cada novedad de sintaxis de Python cambia el lenguaje. ¿Qué es Python?

    Problemas para los que llegan nuevos al lenguaje.

    Hay organizaciones grandes que un lenguaje sin tipos ni siquiera lo consideran.

    [51:22] Cultura común en todos los proyectos Python. Baja barrera de entrada si conoces esa cultura.

    La cultura va evolucionando.

    Solución de compromiso: Meter tipos solo en la frontera.

    [53:02] El tipado avanzado de Python 3.9 da un error de sintaxis al importar el código en una versión anterior de Python.

    [54:46] El operador morsa no se puede usar dentro de un "list comprehension":

    >>> [i for i in ('a', '' ,'b') if i := i.strip()] File "<stdin>", line 1 [i for i in ('a', '' ,'b') if i := i.strip()] ^ SyntaxError: invalid syntax

    No queda otra que escribirlo como:

    >>> [i.strip() for i in ('a', '' ,'b') if i.strip()] ['a', 'b']

    duplicando el i.strip().

    [56:40] En versiones de Python anteriores a 3.8 no se podría usar un continue en un finally. El texto era https://docs.python.org/3.7/reference/compound_stmts.html#the-try-statement:

    When a return, break or continue statement is executed inthe try suite of a try...finally statement, the finally clauseis also executed ‘on the way out.’ A continue statement isillegal in the finally clause. (The reason is a problem withthe current implementation — this restriction may be lifted inthe future).

    Eso se solucionó en Issue32489: Allow 'continue' in 'finally' clause: https://bugs.python.org/issue32489.

    [57:47] f-string con datetime https://docs.python.org/3/library/datetime.html.

    Ya está en los propios ejemplos de PEP 498: Literal String Interpolation: https://www.python.org/dev/peps/pep-0498/.

    [59:22] Modo depuración en f-strings en Python 3.8:

    >>> a = 5>>> f'{a=}''a=5'

    Útil para el loging.

    [01:00:47] Versiones fijas de dependencias y actualizar un despliegue.

    Herramientas para esto: "pip" https://pypi.org/project/pip/, "virtualenv" https://pypi.org/project/virtualenv/.

    "pipenv" https://pypi.org/project/pipenv/.

    "Poetry": https://pypi.org/project/poetry/.

    Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.

    Paralelismos con el enlazado estático y dinámico.

    [01:14:22] ¿Por qué se ha instalado este paquete, qué paquetes exige y qué paquetes dependen de él?

    pip show.

    Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.

    [01:19:22] Visualizar el grafo de versiones de un sistema de control de versiones moderno. Por ejemplo con Mercurial: "hg glog" https://www.mercurial-scm.org/.

    [01:23:07] Recogida de basuras:

    Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.

    Hora de sacar la basura garbage collector - Pablo Galindo y Victor Terrón - PyConES 2018 https://www.youtube.com/watch?v=G9wOSExzs5g.

    La recolección de basura de la generación más antigua funciona de forma diferente. En vez de ser por un número fijo de desequilibrio entre creación y destrucción de objetos, funciona por porcentaje.

    [01:31:37] Divagación: Powerball https://powerball.org.uk/.

    [01:31:52] Explicación de cómo funciona "__slots__" https://docs.python.org/3/reference/datamodel.html.

    [01:34:22] Libro "CPython Internals": https://realpython.com/products/cpython-internals-book/.

    Website de "Real Python": https://realpython.com/. Merece bastante la pena.

    También tienen podcast: "The Real Python Podcast: Python Tips, Interviews, and More" https://realpython.com/podcasts/rpp/.

    [01:36:42] Más sobre "__slots__" https://docs.python.org/3/reference/datamodel.html.

    Técnica estándar.

    Un diccionario vacío ocupa 64 bytes: sys.getsizeof({}).

    Se puede usar para evitar errores mecanográficos al escribir en atributos.

    [01:38:52] "AutoScraper: A Smart, Automatic, Fast and Lightweight Web Scraper for Python" https://pypi.org/project/autoscraper/. Búsquedas "borrosas".

    Seguimos sin encontrar la biblioteca de scraping de foros de la que ha hablado Eduardo en tertulias anteriores.

    [01:43:02] Librería para dibujar grafos: graphviz https://pypi.org/project/graphviz/.

    Le das un texto describiendo nodos y conexiones entre nodos y calcula un gráfico.

    Sería trivial para dibujar el grafo de dependencias de "pip".

    Ejemplo:

    El gráfico de antes, con ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0002.png.

    El gráfico de después, sin ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0003.png.

    [01:47:22] ¿Cómo asegurarse que el nombre de un fichero no tenga caracteres extraños? ¡Problema de seguridad!

    Expresiones regulares. Cuidado con el unicode https://en.wikipedia.org/wiki/Unicode. Mejor usar una lista blanca que una lista negra.

    Usar pathlib.is_relative_to() https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.is_relative_to. Novedad en Python 3.9.

    [01:52:07] ¡Usa la versión actual de Python, leches! Ahora mismo, Python 3.9.

    Ventajas de compilar el intérprete desde código fuente para no depender de la versión que te proporciona el sistema operativo.

    Puedes tener tu propio intérprete de Python dentro de un "virtualenv" https://pypi.org/project/virtualenv/.

    Proyectos "llave en mano". El cliente quiere algo que se instale como un componente en lo que ya conoce. Por ejemplo, en un panel de configuración en un servicio de hospedaje.

    [01:56:47] Jesús Cea repite una vez más la anécdota de que al principio de los tiempos para conducir un coche tenías que ser mecánico, pero ya no.

    Falta toda la base, pero... ¿Hace falta?

    [01:59:12] Memoria escasa en un microcontrolador.

    [01:59:55] Final.

  • Eduardo Castro se desata y nos invita a comentar trucos y construcciones idiomáticas no evidentes https://podcast.jcea.es/python/17

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Javier, conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Dani, conectando desde Málaga.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Jorge Rúa, conectando desde Vigo.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Haciendo tiempo hasta que entre más gente.

    Raspberry Pi Pico: https://www.raspberrypi.org/products/raspberry-pi-pico/.

    Jesús Cea está encantado con su rango de alimentación.

    Micropython: https://www.micropython.org/.

    [06:02] Truco: Python -i: Ejecuta un script y pasa a modo interactivo.

    También se puede hacer desde el propio código concode.InteractiveConsole(locals=globals()).interact().

    Jesús Cea se queja de que usando la invocación desde códigono funciona la edición de líneas. Javier da la pista correcta:para que funcione, basta con hacer import readline antes delanzar el modo interactivo.

    [11:17] Regresión con ipdb: https://pypi.org/project/ipdb/.

    [12:37] Nueva versión de Pyston https://www.pyston.org/.

    Intérprete de Python más rápido. Un 50% más rápido que cpython.

    [16:22] Ver si dos fechas son iguales con datetime https://docs.python.org/3/library/datetime.html.

    Trabajar siempre en UTC https://es.wikipedia.org/wiki/Tiempo_universal_coordinado, aunque solo tengas una zona horaria.

    [19:52] Jesús Cea ha investigado cómo funcionan los POSTs HTTP en las protecciones CSRF https://es.wikipedia.org/wiki/CSRF.

    Buena práctica: La respuesta al POST es una redirección a un GET. Patrón Post/Redirect/Get (PRG) https://es.wikipedia.org/wiki/Post/Redirect/Get.

    Ventajas de usar un framework.

    [24:32] ¿Optimizaciones cuando tienes grandes cantidades de datos?

    Tema muy amplio, hacen falta detalles del problema.

    Se ofrecen algunas ideas:

    Map/Reduce: https://en.wikipedia.org/wiki/Map_reduce.

    Usar generadores u otras construcciones "lazy" siempre que sea posible. https://wiki.python.org/moin/Generators.

    [31:52] Gestión de memoria en Python.

    Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.

    Hora de sacar la basura garbage collector - Pablo Galindo y Victor Terrón - PyConES 2018 https://www.youtube.com/watch?v=G9wOSExzs5g.

    [35:17] Tipografía para programadores:

    Victor Mono: https://rubjo.github.io/victor-mono/.

    Fira Code: https://fonts.google.com/specimen/Fira+Code.

    Fira Code Retina: https://github.com/tonsky/FiraCode/issues/872.

    [37:17] Eduardo Castro se ha currado una lista de trucos sencillos pero interesantes:

    En estas notas solo referenciamos los puntos a los quededicamos más tiempo, se habló de más cosas.

    El documento para poder seguir los comentarios de lagrabación está en https://demo.hedgedoc.org/s/hEZB92q40#.

    hash(float('inf')) -> 314159.

    [43:02] LRU Caché: <https://docs.python.org/3/library/functools.html#functools.lru_cache.

    Bugs abundantes en LRU Cache y múltiples hilos: https://bugs.python.org/issue?%40columns=id%2Cactivity%2Ctitle%2Ccreator%2Cassignee%2Cstatus%2Ctype&%40sort=-activity&%40filter=status&%40action=searchid&ignore=file%3Acontent&%40search_text=lru_cache+threads&submit=search&status=-1%2C1%2C2%2C3.

    Yield:

    Ojo con excepciones y filtraciones de memoria.

    [48:37] Uso interesante con los "context managers": @contextlib.contextmanager https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager y @contextlib.asynccontextmanager https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager.

    [51:12] itertools: https://docs.python.org/3/library/itertools.html. A Jesús Cea no le entra en la cabeza la programación funcional.

    [56:02] ¿Qué es ser Pythonico?

    Aunque esté en la biblioteca estándar, no significa que sea pythónico:

    asyncore: https://docs.python.org/3/library/asyncore.html. Está marcado como obsoleto desde Python 3.6.

    Mover métodos funcionales en una librería separada.

    Las dos jerarquías distintas que existían en Python 2. Esto se unificó en Python 3.

    from __future__ import ....

    La migración a Python 3 fue un intento de simplificar el lenguaje. Pero Python 3 se está complicando cada vez más.

    La complejidad fragmenta los diferentes idiomas del lenguaje.

    [01:08:22] Seguimos desgranando los trucos propuestos por Eduardo.

    collections.defaultdict(): https://docs.python.org/3/library/collections.html#collections.defaultdict.

    [01:11:12] iter() y next() admiten una parametro extra centinela opcional que especifica un valor que termina el iterador.

    Utilizar objetos centinelas que no sean None, porque None puede ser un objeto válido.

    [01:17:32] Los "slices" son objetos que se pueden crear y utilizar: slice(1,100).

    Pasar un iterador a una función abre posibilidades interesantes.

    Slice Objects: https://docs.python.org/3/c-api/slice.html.

    [01:23:42] contextlib.suppress() https://docs.python.org/3/library/contextlib.html#contextlib.suppress.

    Hay que recordar que aunque la excepción se suprime, la ejecución del cuerpo se corta en ese punto.

    [01:24:47] pathlib: https://docs.python.org/3/library/pathlib.html.

    [01:25:12] Usos atípicos de else: if, for, try, while...

    https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops.

    https://docs.python.org/3/tutorial/errors.html#handling-exceptions.

    Teoría unificada sobre else en Python.

    [01:30:07] El orden de los except ... IMPORTA.

    [01:32:22] Tu yo del futuro tiene que tratar con tu yo del pasado. "Escribe código como si el siguiente que tuviera que trabajar con el fuese un psicópata asesino que sabe donde vives".

    Sistemas de control de versiones: "Annotate" -> "blame".

    [01:33:57] Usos de lambda.

    Módulo Operator: https://docs.python.org/3/library/operator.html.

    [01:35:52] Algunos trucos cortos adicionales.

    collections.deque: https://docs.python.org/3/library/collections.html.

    dateutil: https://pypi.org/project/python-dateutil/.

    itertools: https://docs.python.org/3/library/itertools.html.

    if a < x < b:

    >>> import dis>>> dis.dis(lambda x: a < x < b) 1 0 LOAD_GLOBAL 0 (a) 2 LOAD_FAST 0 (x) 4 DUP_TOP 6 ROT_THREE 8 COMPARE_OP 0 (<) 10 JUMP_IF_FALSE_OR_POP 18 12 LOAD_GLOBAL 1 (b) 14 COMPARE_OP 0 (<) 16 RETURN_VALUE >> 18 ROT_TWO 20 POP_TOP 22 RETURN_VALUE

    Desempaquetado complejo:

    >>> a, b, (c, d), *e, f = 1, 2, (3, 4), 5, 6, 7, 8, 9>>> print(a,b,c,d,e,f)1 2 3 4 [5, 6, 7, 8] 9

    Usar la variable "guión bajo" para descartar valores. Ojo con la internacionalización.

    [01:56:22] Python cada vez tiene más "gotchas". Algunos ejemplos:

    Operador morsa. Tratado con projilidad en tertulias anteriores.

    Parámetros mutables.

    Definir "closures" dentro de un for pero usarlo fuera.

    Tuplas con un solo elemento. Es más evidente el constructor tuple(), pero ojo: tuple('abc') -> ('a', 'b', 'c').

    [02:01:06] ¡Terminamos con los trucos!

    [02:01:37] Ideas para indexar y buscar el documentos:

    Whoosh: https://whoosh.readthedocs.io/en/latest/intro.html.

    Solr: https://solr.apache.org/.

    [02:04:22] Deberes para el futuro: módulos dis https://docs.python.org/3/library/dis.html y enum https://docs.python.org/3/library/enum.html.

    [02:04:47] Sugerencia sobre visión artificial: https://www.pyimagesearch.com/. De lo mejor que hay.

    [02:06:47] regex https://pypi.org/project/regex/ que libera el GIL https://en.wikipedia.org/wiki/Global_interpreter_lock.

    [02:07:47] Acelerador y distribución de programas Python precompilados en binario y empaquetados en un directorio e, incluso, en un único fichero: Nuitka: https://nuitka.net/.

    [02:08:57] Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.

    [02:09:17] Cierre.

    [02:10:52] Casi se nos olvida el aviso legal para grabar y publicar las sesiones.

    [02:12:55] Final.

  • Polémica Frameworks, compilación al vuelo, compiladores y rendimiento Python, scraping web y la persistencia vuelve a la carga https://podcast.jcea.es/python/16

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Javier, conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Dani, conectando desde Málaga, invitado por Virako.

    Javier, conectando desde Sevilla, también invitado por Virako.

    Antonio, conectado desde Albacete.

    Jorge Rúa, conectando desde Vigo.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [01:17] Event sourcing y nieve.

    Borrasca Filomena: https://es.wikipedia.org/wiki/Borrasca_Filomena.

    [03:52] Los comentarios legales habituales para poder grabar la tertulia.

    [04:47] Presentaciones varias, dinámica y motivación de las tertulias.

    [11:22] Los problemas logísticos de Jesús Cea con sus charlas.

    [12:52] Debate: Frameworks y cómo condicionan el conocimiento del lenguaje y la forma de desarrollar código.

    Mucha tela que cortar.

    [30:22] Conexión con el mundo asyncio.

    [34:12] Digresión: ¿Cómo funciona la protección CSRF? https://es.wikipedia.org/wiki/Cross-site_request_forgery.

    Diferencia semántica entre verbos HTTP: GET y POST https://en.wikipedia.org/wiki/POST_(HTTP).

    Algunos recursos de seguridad web (no exhaustivo, la lista es infinita):

    CSRF: https://es.wikipedia.org/wiki/Cross-site_request_forgery.

    Cross-Origin Resource Sharing (CORS) https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS.

    Content Security Policy Reference https://content-security-policy.com/.

    La documentación de FastAPI https://fastapi.tiangolo.com/ tiene mucho de seguridad:

    CORS (Cross-Origin Resource Sharing): https://fastapi.tiangolo.com/tutorial/cors/.

    OAuth2 with Password (and hashing), Bearer with JWT tokens https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/.

    About HTTPS https://fastapi.tiangolo.com/deployment/https/.

    [39:52] Proyecto ItsNat https://en.wikipedia.org/wiki/ItsNat. Estado en el servidor y el cliente solo gestiona eventos y actualizaciones del DOM que le envía el servidor.

    Se está moviendo otra vez la inteligencia del navegador al servidor.

    [44:42] ¿Realmente es imprescindible usar Javascript si tu interfaz es el navegador?

    Brython: https://brython.info/.

    Pyjs (antiguo Pyjamas): https://en.wikipedia.org/wiki/Pyjs.

    Emscripten: https://emscripten.org/.

    [48:57] ¡Compilación al vuelo!

    Versionado de diccionarios. PEP 509 Add a private version to dict: https://www.python.org/dev/peps/pep-0509/.

    Compilación al vuelo: Pyjion: https://pyjion.readthedocs.io/en/latest/index.html.

    Conflicto con la portabilidad del intérprete.

    numba: https://numba.pydata.org/.

    Hay pocos "core developers" y heredar código avanzado que luego hay que mantener es un problema.

    LLVM: https://en.wikipedia.org/wiki/LLVM.

    [01:04:27] Los lenguajes de programación deben ser conservadores porque no tienes ni idea de lo que están utilizando los programadores.

    [01:05:32] Si la documentación se ha actualizado, más vale que hayas actualizado tu código a "cómo se hacen ahora las cosas".

    [01:06:47] Tema recurrente: ¿Es mejor estar dentro o fuera de la biblioteca estándar?

    Boost: https://www.boost.org/.

    [01:09:12] Compiladores de Python:

    Cython: https://cython.org/. Rendimiento y ofuscación.

    nuitka: https://nuitka.net/.

    numba: https://numba.pydata.org/.

    PyPy: https://www.pypy.org/.

    [01:10:42] Mejoras recientes en la implementación de Python:

    Issue 26647: ceval: use Wordcode, 16-bit bytecode: https://bugs.python.org/issue26647.

    Issue 9203: Use computed gotos by default: https://bugs.python.org/issue9203.

    [01:14:52] Psyco https://en.wikipedia.org/wiki/Psyco.

    [01:16:22] Etiquetado de tipos para ayudar a los JIT.

    Cython: https://cython.org/.

    MYPY: http://mypy-lang.org/.

    MYPYC: https://mypyc.readthedocs.io/en/latest/index.html.

    Especialización.

    [01:22:37] GHC (The Glasgow Haskell Compiler): https://www.haskell.org/ghc/.

    [01:25:07] Memoria transaccional https://en.wikipedia.org/wiki/Transactional_memory.

    Implementaciones en Python: Sistemas de persistencia como Durus https://www.mems-exchange.org/software/DurusWorks/ o ZODB http://www.zodb.org/.

    Mecanismos de resolución de conflictos.

    [01:34:32] Más sobre optimizaciones y guardas.

    Mucha discusión sobre el GIL: https://en.wikipedia.org/wiki/Global_interpreter_lock.

    La atomicidad de operaciones no está documentada en ningún sitio.

    [01:42:02] Ejemplo de bytecode:

    >>> def rutina(n): ... n += 1 ... n = n + 1 ... >>> dis.dis(rutina) 2 0 LOAD_FAST 0 (n) 2 LOAD_CONST 1 (1) 4 INPLACE_ADD 6 STORE_FAST 0 (n) 3 8 LOAD_FAST 0 (n) 10 LOAD_CONST 1 (1) 12 BINARY_ADD 14 STORE_FAST 0 (n) 16 LOAD_CONST 0 (None) 18 RETURN_VALUE

    [01:45:02] Cuando haces cosas muy avanzadas que usan cosas no definidas formalmente, mejor verificar las suposiciones.

    [01:46:47] La ventaja de probar cosas en proyectos personales:

    ¿Por qué Jesús Cea se ha hecho su propio scraper web?

    "Maldades".

    scrapy: https://scrapy.org/.

    [01:49:22] Migración de versiones en sistemas de persistencia.

    [02:05:07] Event sourcing.

    Event sourcing: https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome.

    Logs de modificaciones.

    [02:08:07] Ventajas de haber usado scrapy: https://scrapy.org/.

    Concurrencia.

    tarpit.

    Problemas habituales:

    Normalización de URLs.

    Webs mal formadas.

    [02:13:47] Módulos de scraping:

    newspaper3k: https://pypi.org/project/newspaper3k/.

    [02:15:02] Recapitulación.

    Pyjion: https://pyjion.readthedocs.io/en/latest/index.html.

    MYPYC: https://mypyc.readthedocs.io/en/latest/index.html.

    [02:16:02] Compilación de módulos de Python para MS Windows. Generar un wheel.

    Aprovechar sistemas de integración continua que levantan máquinas virtuales.

    [02:22:21] Final.

  • Python aprieta, pero no ahoga https://podcast.jcea.es/python/15

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    José Luis, conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [01:37] Reducir dependencias en los proyectos.

    Las listas de Numpy https://numpy.scipy.org/ no son comolas listas de Python.

    statistics: https://docs.python.org/3/library/statistics.html

    Hacer scraping web sin usar Scrapy https://scrapy.org/.

    Beautiful Soup: https://www.crummy.com/software/BeautifulSoup/bs4/doc/.

    [05:52] Usar librerías hace que no sepas cómo funcionan las cosas.

    ¿Cuánto ocupa ese objeto en memoria?

    Se oculta la complejidad, se trabaja a más alto nivel.

    Ineficiencia.

    [09:52] La "nube" te factura toda esa ineficiencia.

    Ventajas de tener servidores dedicados.

    ¿Y los backups?

    ZFS https://es.wikipedia.org/wiki/ZFS_(sistema_de_archivos).

    rsync: https://es.wikipedia.org/wiki/Rsync.

    Contenedores Solaris: https://en.wikipedia.org/wiki/Solaris_Containers.

    Docker: https://es.wikipedia.org/wiki/Docker_(software).

    Hipervisor: https://es.wikipedia.org/wiki/Hipervisor.

    SmartOS: https://es.wikipedia.org/wiki/SmartOS.

    Ansible: https://es.wikipedia.org/wiki/Ansible_(software).

    Evitar las configuraciones manuales a toda costa.

    [16:22] Delegar en la magia hace que no sepas cómo funcionan las cosas, pero también te permite ocuparte de problemas de más alto nivel.

    Entender los pros y contras. Decisión informada.

    [18:47] doctest https://docs.python.org/3/library/doctest.html.

    Una utilidad de los tests es enseñarte cómo usar un proyecto. A veces la documentación formal es muy mala.

    Tutoriales.

    unittest: https://docs.python.org/3/library/unittest.html.

    pytest: https://docs.pytest.org/en/6.2.x/.

    [22:42] ZODB https://zodb.org/en/latest/.

    [23:20] Jesús Cea se plantea mantener Durus https://www.mems-exchange.org/software/DurusWorks/ por su cuenta.

    Problemas con la licencia.

    Imposible ponerse en contacto con sus autores originales.

    ¿Hacer un fork hostil? https://es.wikipedia.org/wiki/Bifurcaci%C3%B3n_(desarrollo_de_software).

    [25:57] Problemas para conectar la persistencia tradicional con el nuevo paradigma asíncrono.

    [26:57] La persistencia tiene un sistema de almacenamiento concreto configurable:

    Por defecto, almacenamiento "cutre" en un fichero.

    RelStorage: https://pypi.org/project/RelStorage/.

    Jesús Cea: Berkeley DB Backend Storage Engine for DURUS: https://www.jcea.es/programacion/durus-berkeleydbstorage.htm.

    Berkeley DB: https://es.wikipedia.org/wiki/Berkeley_DB.

    Durabilidad regulable.

    Group Committing.

    [29:52] Más de lo que nunca quisiste saber sobre Group Committing.

    [32:52] Persistencia y Durus.

    Jesús Cea: Berkeley DB Backend Storage Engine for DURUS: https://www.jcea.es/programacion/durus-berkeleydbstorage.htm.

    Tal vez portarlo a ZODB https://zodb.org/en/latest/.

    [34:52] Persistencia y versionado de objetos.

    Versionado objeto por objeto. Se actualiza al ir cargando objetos durante el funcionamiento normal.

    Versión de la base de datos. Migración de todos los objetos al arrancar el programa.

    Rompe el encapsulamiento de objetos.

    La migración es algo que no se explica nunca lo suficiente en la documentación.

    [47:52] La mayoría de los tutoriales son demasiado simples.

    Tutorial de Python en español: https://docs.python.org/es/3/tutorial/index.html.

    Tutoriales progresivos.

    La mayoría de las charlas son "introducción a ...". No aportan mucho.

    Las mejores charlas son los postmortem.

    Pegas, pero desde un punto de vista constructivo y realista.

    Es más interesante conocer los puntos débiles.

    [51:57] Un motivo para no tener temáticas cerradas en las tertulias es que es difícil que los intereses de dos expertos se solapen.

    [55:42] El tema legal habitual sobre grabar los audios de las tertulias.

    [57:37] Python Madrid.

    Kaleidos: https://kaleidos.net/.

    Meetup Python Madrid: https://www.meetup.com/python-madrid/.

    Nostalgia de los "buenos tiempos".

    Networking entre personas.

    [01:09:52] super() https://docs.python.org/3/library/functions.html#super.

    [01:11:17] Operador Morsa.

    PEP 572: https://www.python.org/dev/peps/pep-0572/.

    Tema recurrente.

    [01:13:42] La sintaxis de Python cada vez se complica más.

    [01:15:57] Guido van Rossum sigue muy activo como "core developer": https://es.wikipedia.org/wiki/Guido_van_Rossum.

    [01:16:22] Funciones lambda.

    Closures: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).

    [01:21:12] Función universal que se comporta de forma diferente dependiendo de si se llama de forma síncrona o asíncrona.

    What Color is Your Function? https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/.

    Go: https://golang.org/.

    Corrutina: https://es.wikipedia.org/wiki/Corrutina.

    CSP: https://en.wikipedia.org/wiki/Communicating_sequential_processes.

    La implementación actual en Python no es transparente, "colorea" todo el programa.

    [01:30:17] Stackless Python: https://en.wikipedia.org/wiki/Stackless_Python.

    Documentación: https://github.com/stackless-dev/stackless/wiki.

    ¿Por qué no se integró en CPython? Portabilidad.

    [01:37:07] Licencia del logotipo de Python.

    Logotipo de Python Madrid: https://www.python-madrid.es/.

    Condiciones de uso del logo de Python: https://www.python.org/community/logos/.

    [01:40:44] Repesca de temas de tertulias anteriores:

    "Closures".

    Respuestas "de nivel" en las listas de correo cuando la pregunta es interesante.

    Versionado de diccionarios.

    Cacheo de "lookups" en la implementación actual de Python.

    [01:46:12] Nuestra relación con PEP 8 https://www.python.org/dev/peps/pep-0008/.

    Jesús Cea: Problemas por ser un dinosaurio y por programar en varios lenguajes diferentes.

    [01:47:12] Jesús Cea y código abierto:

    Mercurial de Jesús Cea: http://hg.jcea.es/.

    https://blog.jcea.es.

    El código publicado no es bueno. Personal. Hago lo mínimo para que funcione.

    No hay test, por practicidad.

    El código pagado no se puede enseñar.

    Solo puede enseñar código el que tiene tiempo para programar código abierto, por ejemplo, gente joven sin cargas familiares.

    Ideas interesantes, código regulero.

    [01:52:02] Equilibrio entre practicidad y perfección.

    Tener claros los "puntos de dolor".

    Hacer lo mínimo imprescindible.

    Máquinas limitadas como la Raspberry PI: https://es.wikipedia.org/wiki/Raspberry_Pi.

    Recibir notificaciones de cambios en el disco duro: Watchman: https://github.com/facebook/watchman.

    Entrega de valor constante e incremental.

    [01:57:32] Los clientes son muy vagos y no quieren hacer los deberes.

    Metodologías ágiles.

    El cliente nunca tiene tiempo para probar las entregas.

    [02:01:32] Compartir archivos en la tertulia, para cositas pequeñas. Algo pendiente para el futuro.

    [02:03:32] El valor de leerse la documentación de Python como si fuera un libro, de principio a fin.

    Aparte de aprender en profundidad, el valor de colaborar puliendo la documentación.

    [02:05:42] Cambio de licencia de Python 1.x a Python 2.x.

    Python 2.0 License: https://www.python.org/download/releases/2.0/license/.

    [02:06:37] Estudiar el código fuente de las propias librerías de Python.

    [02:07:02] El bug 35930 sigue coleando. Estado de la cuestión.

    Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    Temas de estilo.

    [02:11:27] Despedida.

    [02:13:10] Los riesgos de caerse con nieve en polvo.

    [02:14:29] Final.

  • Detalles internos de rendimiento de Python y exabruptos sobre asyncio https://podcast.jcea.es/python/14

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Javier, conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Juan Carlos, conectando desde Bilbao.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [01:32] Nuevas versiones: Python 3.10a4 y Numpy.

    [01:57] Don’t Use Recursion In Python Any More,Python Closure — A Pythonic technique you must know

    Don’t Use Recursion In Python Any More,Python Closure — A Pythonic technique you must know: https://towardsdatascience.com/dont-use-recursion-in-python-any-more-918aad95094c.

    Hilo en la lista de correo de Python Madrid: https://lists.es.python.org/pipermail/madrid/2021-January/004838.html.

    Closure: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).

    Mixin: https://es.wikipedia.org/wiki/Mixin.

    [10:02] ¿Qué es ser "Pythónico"?

    Twisted daña el cerebro: https://twistedmatrix.com/trac/.

    unittest: https://docs.python.org/3/library/unittest.html.

    Black: https://pypi.org/project/black/.

    from __future__ import braces.

    [14:52] Python Ideas:

    https://mail.python.org/mailman3/lists/python-ideas.python.org/.

    [16:52] ¿Comillas simples o comillas dobles? ' o ".

    Diferencias semánticas con otros lenguajes como C.

    [23:07] Tamaño de columnas: ¿80?, ¿120?, ¿132?

    [31:02] Primar la legibilidad, no el rendimiento.

    Cuando tienes if ... else ..., ¿Qué caso pones primero?, ¿el corto o el largo? ¿Primero la condición normal?

    Microoptimizaciones que complican la legibilidad sin ganancia de rendimiento que importe en realidad.

    [41:57] En las variables locales, la longitud del nombre de una variable no impacta en el rendimiento.

    [43:02] Curiosear el "bytecode" https://es.wikipedia.org/wiki/Bytecode que genera Python.

    Dispositivo de Duff: https://es.wikipedia.org/wiki/Dispositivo_de_Duff.

    El "bytecode" https://es.wikipedia.org/wiki/Bytecode que genera Python no está nada optimizado. Es mejorable.

    [46:22] Bytecode generado para a + a:

    >>> dis.dis(lambda a: a + a) 1 0 LOAD_FAST 0 (a) 2 LOAD_FAST 0 (a) 4 BINARY_ADD 6 RETURN_VALUE

    ¡Guardas!

    Sí se hacen algunas optimizaciones simples:

    >>> dis.dis(lambda : 5 + 3) 1 0 LOAD_CONST 1 (8) 2 RETURN_VALUE

    [50:12] Python deja su pila de evaluación vacía al terminar de calcular una expresión.

    Máquina virtual de registros en vez de máquina virtual orientada a pila.

    El compilador debe ser más sofisticado, pero puede reutilizar valores.

    Muchas operaciones redundantes:

    >>> import dis>>> def suma(valores):... s=0... for i in valores:... s+=i... return s... >>> dis.dis(suma) 2 0 LOAD_CONST 1 (0) 2 STORE_FAST 1 (s) 3 4 LOAD_FAST 0 (valores) 6 GET_ITER >> 8 FOR_ITER 12 (to 22) 10 STORE_FAST 2 (i) 4 12 LOAD_FAST 1 (s) 14 LOAD_FAST 2 (i) 16 INPLACE_ADD 18 STORE_FAST 1 (s) 20 JUMP_ABSOLUTE 8 5 >> 22 LOAD_FAST 1 (s) 24 RETURN_VALUE

    ¿Qué ocurre a la hora de depurar o para gestionar excepciones?

    [56:32] Que un hilo modifique variables de otro hilo.

    ¡Guardas!

    NOTA DESDE EL FUTURO:

    Python 3.9.5: https://docs.python.org/release/3.9.5/whatsnew/changelog.html.

    Traceback objects allow accessing frame objects without triggering audit hooks: https://bugs.python.org/issue42800.

    [58:37] Pensábais que las interioridades del intérprete de Python son aburridas, pero no...

    La complejidad debe estar en tu programa, no en el lenguaje o el intérprete.

    Compiladores optimizadores. Python se está quedando atrás.

    Hacer caché al buscar atributos:

    Issue1616125: Cached globals+builtins lookup optimization: https://bugs.python.org/issue1616125.

    issue43452: Microoptimize PyType_Lookup for cache hits https://bugs.python.org/issue43452.

    Detectar cambios en un diccionario, incluyendo diccionarios internos como locals o __builtins__: PEP 509 Add a private version to dict: https://www.python.org/dev/peps/pep-0509/.

    [01:06:52] Huevos de pascua en Python:

    from __future__ import braces.

    import antigravity.

    import this.

    import __hello__.

    [01:08:27] Usar pass o ... (ellipsis).

    Ellipsis: https://docs.python.org/3/library/constants.html#Ellipsis y https://docs.python.org/3/library/stdtypes.html?highlight=ellipsis#the-ellipsis-object.

    [01:09:22] El PEP 509 no es para hacer diccionarios inmutables.

    Es algo interno para el API de C. No está accesible desde Python.

    Cambios pequeños pueden abrir posibilidades interesantes. ¡Guardas!.

    [01:13:07] Curiosidades encontradas esta semana:

    traceback.clear_frames(tb): https://docs.python.org/3/library/traceback.html#traceback.clear_frames.

    inspect: https://docs.python.org/3/library/inspect.html.

    Manipular frame.back.

    Que una función sepa si se le está llamando de una forma síncrona o asíncrona.

    [01:17:02] Los problemas filosóficos que tiene Jesús Cea con la programación asíncrona tal y como está implementada en Python.

    Una biblioteca debe decidir si es síncrona o asíncrona y "contamina" todo tu código.

    Hacer corrutinas "de verdad": https://es.wikipedia.org/wiki/Corrutina.

    Persistencia y programación asíncrona.

    Concepto de "awaitable": https://docs.python.org/3/library/asyncio-task.html#awaitables.

    future.result(): https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result.

    [01:32:17] Es difícil plantear temas tan esotéricos sin una preparación formal de la charla o sin avisar con tiempo para que la gente se lo pueda ver con calma antes.

    [01:33:32] Problemas con el control de carga de asyncio https://docs.python.org/3/library/asyncio.html.

    Vuelve a tratarse el tema de si la biblioteca estándar debe crecer o adelgazar.

    Según Jesús Cea, asyncio https://docs.python.org/3/library/asyncio.html es la peor opción.

    Alternativas a asyncio:

    Curio: https://curio.readthedocs.io/en/latest/.

    Trio: https://trio.readthedocs.io/en/stable/. Monkey patching: https://en.wikipedia.org/wiki/Monkey_patch.

    La dificultad de luchar con una biblioteca que está incluída en la biblioteca estándar.

    [01:42:32] La programación asíncrona es útil para muchas más cosas además de para gestionar peticiones de la red.

    Por ejemplo, operaciones de ficheros locales. Aprovechar tanto que el disco sea lento como para lanzar operaciones concurrentes a discos duros.

    [01:44:12] Mejor usar concurrent.futures https://docs.python.org/3/library/concurrent.futures.html que threading https://docs.python.org/3/library/threading.html directamente.

    Transportar excepciones entre hilos.

    Control de carga y paralelismo.

    [01:45:42] Referencia al bug solucionado en la tertulia anterior: Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    Queda por ultimar el detalle de cómo solucionar el problema exactamente y enviar el parche para que se integre oficialmente en Python.

    Jesús Cea describe las dos opciones que está barajando: weakrefs https://docs.python.org/3/library/weakref.html o try ... finally.

    [01:50:57] Ya hubo "flames" brutales con Guido cuando se introdujo el operador ternario en Python.

    [01:55:02] Despedida.

    [01:55:50] Final.

  • Resolución de Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://podcast.jcea.es/python/13

    Participantes:

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Juan Carlos.

    Plutarco, conectando desde Madrid.

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Julio, conectando desde Chile.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Presentaciones.

    [03:24] Aviso legal de que se está grabando y objetivos de latertulia.

    [06:22] Autoimport, ¿debería ser una funcionalidad del IDE?

    PyCharm: https://www.jetbrains.com/pycharm/.

    [12:52] Los IDEs y las inercias.

    PyCharm: https://www.jetbrains.com/pycharm/.

    Atajos de teclado.

    vim: https://es.wikipedia.org/wiki/Vim.

    Ubicuo y poder editar ficheros de forma remota.

    Uso del teclado en vez del ratón.

    Emacs: https://es.wikipedia.org/wiki/Emacs.

    [19:22] Operador morsa (walrus). Sigue usándose muy poco.

    Python va complicando la sintaxis más y más.

    Se habló en una tertulia anterior.

    Jesús solo ha encontrado este caso útil:

    Pasar de:

    buf = f.read(1000)while buf: [Hace el procesamiento] buf = f.read(1000)

    A lo siguiente:

    while buf := f.read(1000): [Hace el procesamiento]

    [25:57] Erratas en tertulias anteriores:

    Migración de Python a Github fue en 2017.

    No es "Steering committee" sino "Steering Council".

    [27:02] Pablo Galindo forma parte del "council" tras las últimas elecciones.

    Charla de Pablo Galindo en la PyconES 2019 sobre el mundode los Core Developers de Python:https://www.youtube.com/watch?v=qcvZOaY1emk.

    Algunos proyectos Python están usando Rust. Por ejemplo: https://cryptography.io/, con cierta polémica. Mercurial también usa Rust https://www.mercurial-scm.org/.

    Las variables locales pueden ser modificadas a través de su "closure", en funciones hijas o en otros hilos. Es una barbaridad, pero la posibilidad existe.

    Esto es lo que hace, por ejemplo, un debugger.

    [35:37] ¡Spoiler sobre la resolución del "Memory Leak"!

    Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    Traceback: https://docs.python.org/3/library/traceback.html

    Frame: https://docs.python.org/3/library/traceback.html#traceback.FrameSummary.

    Stack: https://docs.python.org/3/library/traceback.html#stacksummary-objects.

    [39:17] Usar una técnica similar para detectar las características de quien te llama para poder mezclar de forma más limpia código síncrono y asíncrono.

    Biblioteca Unsync: https://pypi.org/project/unsync/.

    [41:32] Sigo explicando detalles de la solución del "Memory Leak".

    Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    Estamos continuando una conversación que ha durado varias tertulias.

    Jesús Cea pone un ejemplo de cómo generar un ciclo con una excepcion.

    La caja y media de cervezas se las lleva... ¡Jesús!

    [47:22] No se está conectando gente desde Hispanoamérica. ¿Por qué?

    [50:07] Más erratas: Los "tracebacks" NO son inmutables.

    [50:32] Nuevo método "with_traceback()" a la hora de crear excepciones:

    https://docs.python.org/3/library/exceptions.html#BaseException.with_traceback.

    Puedes generar una excepción con un "traceback"arbitrario.

    El caballo de batalla del bug es que el "future" https://docs.python.org/3/library/concurrent.futures.html levanta una excepción y esa excepción debe "transportarse" a otro hilo.

    Explicando cómo se visualizan los "traceback" si un "future" https://docs.python.org/3/library/concurrent.futures.html muere con una excepción.

    def a(): 1/0try: a()except Exception as e: raise eTraceback (most recent call last): File "<stdin>", line 4, in <module> File "<stdin>", line 2, in <module> File "<stdin>", line 2, in aZeroDivisionError: division by zero

    Cuando un "future" https://docs.python.org/3/library/concurrent.futures.html lanza una excepción, se ven "frames" repetidos.

    Hay varias formas de solucionar el bug. Ahora hay que pensar en cual elegir, que sea la más simple e intuitiva.

    [01:01:52] Sobre el "nivel" de las tertulias y sus motivaciones.

    [01:06:12] Referencia rápida a temas de la tertulia anterior:

    Dataclasses: https://docs.python.org/3/library/dataclasses.html. Se hablo mucho sobre ellas en la tertulia de la semana pasada.

    Pydantic: https://pypi.org/project/pydantic/.

    FastAPI: https://pypi.org/project/fastapi/.

    [01:09:17] Diagnóstico exhaustivo del bug "Memory Leak", causa raíz y propuestas de soluciones.

    Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.

    Exploración del propio código fuente de Python.

    Repaso detallado del funcionamiento de un "future" https://docs.python.org/3/library/concurrent.futures.html.

    Uno de los problemas fundamentales de trabajar con hilos es cómo notificar excepciones a otros hilos. La gran ventaja de los "futures" es gestionar esto de forma trivial.

    Este "transporte" es lo que está ocasionando el "Memory Leak".

    ¡Agárrate que vienen curvas!

    [01:21:32] Ojo a la línea self = None. Aquí se rompe el ciclo en la excepción original: https://github.com/python/cpython/blob/3.9/Lib/concurrent/futures/thread.py#L47.

    Closures: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).

    "Pool" de "workers". De forma estándar, Python te proporciona dos ejecutores: el ejecutor de hilos y el ejecutor de procesos https://docs.python.org/3/library/concurrent.futures.html#executor-objects.

    [01:31:32] Las partes relevantes en el hilo principal son:

    https://github.com/python/cpython/blob/3.9/Lib/concurrent/futures/_base.py#L413.

    https://github.com/python/cpython/blob/2fe408497e6838b6fb761e42e8f8ffc70bd6f3b1/Lib/concurrent/futures/_base.py#L387.

    [01:37:02] ¡Brainstorming!

    [01:42:42] try ... finally

    Jejeje, alguien propone algo que funcionaría :-).

    [01:43:57] Weakref: https://docs.python.org/3/library/weakref.html. Hay contertulios que no están familiarizados con el concepto, Jesús Cea repasa qué son y para qué sirven las "Weakref".

    Se pueden "resucitar" objetos.

    [01:51:02] Volvemos al hilo, la corrección del bug.

    El gráfico de antes, con ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0002.png.

    El gráfico de después, sin ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0003.png.

    [01:55:12] Comprobar este bug con un test unitario.

    Por sus características... complicado.

    "sys.getrefcount()": https://docs.python.org/3/library/sys.html#sys.getrefcount.

    "sys.exc_info()": https://docs.python.org/3/library/sys.html#sys.exc_info.

    "Race conditions": https://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera.

    [01:59:22] Cuando recoge basura de objetos, podemos pedir que los guarde en "gc.garbage" para revisarlos: https://docs.python.org/3/library/gc.html#gc.garbage.

    "gc.DEBUG_SAVEALL": https://docs.python.org/3/library/gc.html#gc.DEBUG_SAVEALL.

    Se puede limpiar "gc.garbage" antes de la ejecución del código que nos interesa analizar.

    [02:03:42] Bola extra:

    Editar los audios.

    Machine learning para el procesado de audio.

    El problema del cocktail: https://en.wikipedia.org/wiki/Cocktail_party_effect y una solución aplicando inteligencia artificial: https://www.technologyreview.com/2015/04/29/168316/deep-learning-machine-solves-the-cocktail-party-problem/.

    RNNoise https://jmvalin.ca/demo/rnnoise/.

    [02:09:52] Repaso del día para los que llegaron tarde.

    [02:12:52] Weakref: https://docs.python.org/3/library/weakref.html.

    Jesús ofrece algunos ejemplos de su utilidad.

    [02:19:22] Iteradores WSGI https://www.python.org/dev/peps/pep-0333/.

    [02:21:12] Weakref en caché de objetos Durus https://www.mems-exchange.org/software/DurusWorks/DurusWorks-1.2.tar.gz/DurusWorks-1.2/doc/durus.html.

    [02:23:52] El valor de la tertulia es llevarse algo que probar en casa.

    [02:25:22] La tertulia la hacen los asistentes.

    [02:28:36] Final.

  • Ciclos de memoria, "core developers" y dataclasses https://podcast.jcea.es/python/12

    En lo que sigue, cuando se habla de CPython, se refiere alintérprete de referencia de Python, que está escrito en lenguajeC: https://www.python.org/downloads/.

    Participantes:

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Javier, conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Juan Carlos.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Seguimos hablando del bug comentado la semana pasada.

    bug bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.

    [02:17] El "bytecode" https://es.wikipedia.org/wiki/Bytecode que genera Python es muy mejorable.

    >>> import dis >>> def suma(valores): ... s=0 ... for i in valores: ... s+=i ... return s ... >>> dis.dis(suma) 2 0 LOAD_CONST 1 (0) 2 STORE_FAST 1 (s) 3 4 LOAD_FAST 0 (valores) 6 GET_ITER >> 8 FOR_ITER 12 (to 22) 10 STORE_FAST 2 (i) 4 12 LOAD_FAST 1 (s) 14 LOAD_FAST 2 (i) 16 INPLACE_ADD 18 STORE_FAST 1 (s) 20 JUMP_ABSOLUTE 8 5 >> 22 LOAD_FAST 1 (s) 24 RETURN_VALUEInferencia de tipos: https://es.wikipedia.org/wiki/Inferencia_de_tipos.

    [08:32] Recogida de basuras.

    gc.set_threshold(): https://docs.python.org/3/library/gc.html#gc.set_threshold.

    gc.disable(): https://docs.python.org/3/library/gc.html#gc.disable.

    [11:27] Herramientas de monitorización:

    DTrace: http://dtrace.org/blogs/. Monitoriza el sistema operativo entero, incluyendo las aplicaciones, todo integrado, de forma segura y sin modificar el software.

    [13:32] Funcionalidades de auditoría de Python:

    PEP 551 -- Security transparency in the Python runtime https://www.python.org/dev/peps/pep-0551/.

    PEP 578 -- Python Runtime Audit Hooks https://www.python.org/dev/peps/pep-0578/.

    [16:47] Más herramientas de monitorización:

    SystemTap: https://es.wikipedia.org/wiki/SystemTap.

    eBPF: https://ebpf.io/.

    py-spy: https://github.com/benfred/py-spy.

    [17:52] Más sobre DTrace https://es.wikipedia.org/wiki/DTrace_(Sun_Microsystems) y Python:

    Añadir sondas DTrace al intérprete de Python: https://www.jcea.es/artic/python_dtrace.htm.

    [22:12] Tracemalloc.

    tracemalloc: https://docs.python.org/3/library/tracemalloc.html.

    [23:02] Seguimos hablando del bug comentado la semana pasada.

    bug bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.

    ¡Se ofrece una caja de cervezas!

    Brainstorming.

    Diagnóstico detallado.

    weakref — Weak references: https://docs.python.org/3/library/weakref.html.

    Se sube la apuesta a caja y media de cervezas :-).

    La excepción salta en un hilo y se "transporta" y almacena para que se pueda acceder desde otro hilo.

    Test reproducible.

    [36:42] Aviso legal.

    Machine learning para identificar los diferentes hablantes.

    [38:27] Las futuras notas de las grabaciones serán EXHAUSTIVAS (como estáis comprobando leyendo esto :).

    [39:17] Ideas para "cebar" las tertulias.

    Muchos temas recurrentes, se ve que hay temas "flotando" en el aire.

    [40:37] Cómo organizar las tertulias, diferentes intereses y profundidad. Dinámica de la tertulia.

    [42:32] ¿Cómo se organizan los "core developers"?

    El desarrollo se ha movido en github. Los bugs están a medio migrar, se va a integrar más en github.

    https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html

    PEP 581 -- Using GitHub Issues for CPython https://www.python.org/dev/peps/pep-0581/.

    Guía del desarrollador: https://devguide.python.org/.

    Backporting de bugs de cpython de la versión en desarrollo a las versiones estables.

    ¿Cómo se obtiene y se pierde el status de "core developer"?

    Steering council. PEP 8016: https://www.python.org/dev/peps/pep-8016/. Rol que cumple y cómo se elige.

    Desde que Guido no es BDFL, está muy activo en listas de correo y picando código.

    [52:22] ¡Víctor quiere más bugs para aprender!

    Bugs marcados como "easy", como forma de entrada a desarrolladores nuevos.

    [53:42] ¿Qué partes de CPython están escritas en C y cuáles en Python?

    Se escribe en C lo que no tiene más remedio, por rendimiento o porque interactúa con el sistema operativo.

    Más adelante de la conversación Jesús Cea explica cómo ver si un módulo concreto está en C o en Python sin tener que ir al código fuente.

    [57:32] PyPy https://www.pypy.org/. Intérprete de Python escrito en Python.

    RPython: https://rpython.readthedocs.io/en/latest/.

    [58:27] ¿Incluir otros lenguajes en la implementación de CPython?

    Rust: https://es.wikipedia.org/wiki/Rust_(lenguaje_de_programaci%C3%B3n).

    PyOxidizer: https://github.com/indygreg/PyOxidizer.

    Fragmentación. Jesús Cea estoy más centrado en la parte de C porque la mayor parte de los "core developers" no saben C. Añadir más lenguajes reduce el grupo de gente que puede mantener esas partes.

    Portabilidad de C.

    Bootstraping de un lenguaje con el propio lenguaje.

    Forth: https://en.wikipedia.org/wiki/Forth_(programming_language).

    [01:05:02] Python 3.9. Mejoras.

    Dificultades para utilizar la última versión de Python, en función de lo que tenga el cliente.

    [01:08:07] Dataclasses: https://docs.python.org/3/library/dataclasses.html.

    La dificultad para tener atributos opcionales. Algunas ideas.

    attrs: https://www.attrs.org/en/stable/.

    Usar valores "sentinel".

    DRY: https://es.wikipedia.org/wiki/No_te_repitas.

    [01:20:52] Pydantic: https://pydantic-docs.helpmanual.io/.

    [01:23:07] Horarios de las tertulias. Mucha discusión y algunas ideas. De momento no habrá cambios. Hace falta más feedback.

    Se agradecería que la gente que deje las tertulias, explicase por qué se ha ido.

    [01:30:27] Jesús Cea explica cómo ver si un módulo concreto está en C o en Python sin tener que ir al código fuente.

    [01:31:18] Más sobre la dinámica de las tertulias.

    Debate sobre presentarse o no en tertulias abiertas, o tener la cámara apagada.

    Va siendo necesario tener algun repositorio para que la gente de la tertulia pueda compartir cosas.

    ¿Lista de correo específica para las tertulias?

    [01:36:42] Actas de las tertulias y publicar las grabaciones de una puñetera vez. ¿Algún ingeniero de sonido en la sala? ¿Baratito?

    [01:39:08] El "nivel" de las listas de correo. ¿Dónde están las conversaciones interesantes? (aparte de la tertulia semanal :-).

    La maldición de lo básico e "introducción a". Igual para que haya conversación interesante, hay que hacer preguntas interesantes :-).

    Python-Madrid antes de que llegase Meetup.

    Jesús Cea sugiere listas como "python-ideas": https://mail.python.org/mailman3/lists/python-ideas.python.org/. También la lista de programación Python en español: python-es@python.org.

    Javier tiene intereses muy extraños :-).

    [01:54:52] Cierre.

    [01:56:42] Final.

  • Más de lo que nunca quisiste aprender sobre JIT, guardas y especialización https://podcast.jcea.es/python/11

    En lo que sigue, cuando se habla de CPython, se refiere alintérprete de referencia de Python, que está escrito en lenguajeC: https://www.python.org/downloads/.

    Participantes:

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Javier, conectando desde Madrid.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Aviso de que se está grabando. Temas legales.

    [01:52] Valor de publicar estos audios y las dificultades para hacerlo.

    [02:42] Métodos mágicos:

    __set_name__(). PEP 487: https://www.python.org/dev/peps/pep-0487/.

    [04:12] Problemas con PIP 20.3.2: https://github.com/pypa/pip/issues/9284.

    [05:52] ¿Actualizar a la última versión o esperar?

    Poder "echar atrás" fácil.

    Acumular cambios pendientes es deuda técnica.

    [10:42] Google caído https://www.theguardian.com/technology/2020/dec/14/google-suffers-worldwide-outage-with-gmail-youtube-and-other-services-down.

    [11:02] Generación de wheels en varios sistemas: https://pythonwheels.com/.

    auditwheel: https://pypi.org/project/auditwheel/.

    ¿Generación de Wheels en Microsoft Windows?

    [13:12] Caché local de PIP https://pip.pypa.io/en/stable/.

    [14:17] Event Sourcing https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome.

    Módulo eventsourcing: https://pypi.org/project/eventsourcing/.

    [14:42] De momento se puede usar el viejo "resolver" de dependencias de PIP.

    Se puede usar la opción -use-deprecated=legacy-resolver.

    Esa opción se puede meter también en el fichero de configuración, para no tener que escribirlo en cada invocación.

    Jesús Cea comete el pecado de meter paquetes Python en el sistema operativo.

    [17:02] Batallitas de Jesús Cea.

    Jesús lleva dos años dándole vueltas a esto: bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.

    Explicación detallada del asunto.

    Brainstorming.

    [21:22] Visión a alto nivel del recolector de basuras de Python (cpython)

    Contador de referencias. Inmediato, pero no recoge ciclos.

    Si se crean instancias y no se destruyen, se llama a un recolector "pesado" que también recoge ciclos.

    Esto puede ser problemático al arrancar el programa, antes de que la creación/destrucción de objetos se "estabilice".

    gc.disable(): https://docs.python.org/3/library/gc.html#gc.disable.

    Jesús Cea "abusa" de los destructores y de que se ejecuten cuando él quiere. Lo práctico contra lo puro.

    Jesús ofrece cervezas.

    gc.collect(): https://docs.python.org/3/library/gc.html#gc.collect. Esto sirve tanto para recoger los ciclos como para comprobar si tu programa tiene ciclos de memoria o no.

    Futures: https://docs.python.org/3/library/concurrent.futures.html.

    [35:29] Módulo Manhole https://pypi.org/project/manhole/.

    Explorar un programa en producción.

    Tracemalloc: https://docs.python.org/3/library/tracemalloc.html.

    DTrace: http://dtrace.org/blogs/about/.

    py-spy: https://pypi.org/project/py-spy/.

    Pérdidas de memoria: Recordar lo hablado ya en tertulias anteriores.

    jemalloc: http://jemalloc.net/.

    MALLOC_PERTURB_: https://debarshiray.wordpress.com/2016/04/09/malloc_perturb_/.

    zswap: https://en.wikipedia.org/wiki/Zswap.

    [42:52] Micropython: https://micropython.org/.

    ESP8266: https://en.wikipedia.org/wiki/ESP8266.

    ESP32: https://en.wikipedia.org/wiki/ESP32.

    Bluetooth Low Energy: https://en.wikipedia.org/wiki/Bluetooth_Low_Energy.

    ¿Qué ventajas aporta usar Micropython?

    Velocidad de desarrollo y depuración.

    [52:42] ¿El futuro será mejor? O no.

    Desperdicio de recursos materiales porque realmente sobran.

    Python es mucho más lento que C y no digamos ensamblador.

    [57:17] Cambiar Python por un lenguaje más rápido.

    Go: https://en.wikipedia.org/wiki/Go_(programming_language).

    Rust: https://en.wikipedia.org/wiki/Rust_(programming_language).

    C++: https://en.wikipedia.org/wiki/C%2B%2B.

    [01:00:20] Python no pinta nada en móviles.

    Kivy: https://kivy.org/.

    [01:02:07] Acelerar Python.

    Subinterpreters: PEP 554: https://www.python.org/dev/peps/pep-0554/.

    Si los subintérpretes no compartiesen NADA, se podríanlanzar simultaneamente en varios núcleos de la CPU sincompetir por un GILhttps://en.wikipedia.org/wiki/Global_interpreter_lockúnico.

    JIT: https://es.wikipedia.org/wiki/Compilaci%C3%B3n_en_tiempo_de_ejecuci%C3%B3n.

    PYPY: https://www.pypy.org/.

    RPython: https://rpython.readthedocs.io/en/latest/.

    Numba: https://numba.pydata.org/.

    Cython: https://cython.org/.

    Python es "potencialmente" muy dinámico, pero en la práctica los programas no lo son. Jesús pone varios ejemplos.

    Conversación densa entre Jesús y Javier.

    Guardas para comprobar que la especialización sigue siendo correcta. Por ejemplo, para los diccionarios: PEP 509 Add a private version to dict: https://www.python.org/dev/peps/pep-0509/

    "Tipado" más estricto.

    MYPY: http://mypy-lang.org/.

    Pydantic: https://pydantic-docs.helpmanual.io/.

    Comprobación de tipos en tiempo de ejecución.

    Descubrimiento de tipos en tiempo de ejecución, proporcionando "especialización".

    psyco: https://en.wikipedia.org/wiki/Psyco.

    Eduardo Castro entra y simplifica la discusión.

    Jesús explica qué hace "a+b" internamente.

    [01:29:22] PyParallel http://pyparallel.org/

    Memoria transaccional: https://es.wikipedia.org/wiki/Memoria_transaccional.

    (nota de Jesús Cea): Los sistemas de persistencia Python descritos en tertulias anteriores pueden considerarse casos de memoria transaccional... si somos flexibles.

    "Colorear" objetos y que dos hilos no puedan acceder a objetos del mismo color simultaneamente o en transacciones concurrentes.

    [01:30:42] PYPY https://www.pypy.org/ es tan sofisticado que no lo entiende ni dios.

    Jesús Cea lo ha intentado y se ha rendido.

    psyco: https://en.wikipedia.org/wiki/Psyco.

    CFFI: https://cffi.readthedocs.io/en/latest/.

    [01:35:22] Compilar CPython a WebAssembly https://en.wikipedia.org/wiki/WebAssembly va más rápido que en C nativo.

    [01:36:02] Simplemente compilar código python con Cython https://cython.org/ sin declaración de tipos dobla la velocidad de ejecución.

    ¡CPython lo puede hacer mejor!

    [01:36:57] Subinterpreters: PEP 554: https://www.python.org/dev/peps/pep-0554/.

    Poder usar todos los núcleos de la CPU.

    [01:38:07] Seguimos hablando del asunto.

    [01:39:07] Un problema es que Python tiene la vocación de funcionar en todas partes, así que hay resistencia para implementar mejoras solo en ciertas plataformas.

    [01:40:17] Cierre.

    Dadle una pesada al bug bpo35930: "Raising an exception raisedin a "future" instance will create reference cycles":https://bugs.python.org/issue35930.

    [01:41:13] Final.

  • Más sobre persistencia de datos https://podcast.jcea.es/python/10

    En esta ocasión grabamos un miércoles porque ayer fue festivo enEspaña.

    Participantes:

    Eduardo Castro, email: [email protected]. Conectando desde A Guarda.

    Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.

    Miguel Sánchez, email: [email protected], conectando desde Canarias.

    Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.

    Artur, conectando desde Vigo.

    Audio editado por Pablo Gómez, twitter:@julebek.

    La música de la entrada y la salida es "Lightning Bugs", de JasonShaw. Publicada en https://audionautix.com/ con licencia- Creative Commons Attribution 4.0 InternationalLicense.

    [00:52] Problemas de sonido.

    [01:57] "Duda/problema con mod_wsgi-express"

    Referencia a un mensaje enviado a la lista de correo.

    Los módulos se importan una sola vez.

    mod_wsgi: https://pypi.org/project/mod-wsgi/.

    matplotlib: https://matplotlib.org/.

    Damos con la solución: Ojo con los objetos globales y múltiples hilos.

    [07:52] Python 3.9.1.

    PEP 384: https://www.python.org/dev/peps/pep-0384/.

    Py_FileSystemDefaultEncodeErrors and Py_UTF8Mode are not available with limited API: https://bugs.python.org/issue41986.

    [09:07] Estado de persistencia en Python.

    ZODB: http://www.zodb.org/en/latest/.

    Durus: https://www.mems-exchange.org/software/DurusWorks/.

    [10:07] ¿Cómo conectar la tecnología de persistencia con el mundo de Python asíncrono?

    [11:47] Según la opinión de Jesús Cea, la implementación actual de async/await en Python es... fea.

    La idea es buena, pero la implementación es chapucera y poco transparente.

    Es muy difícil combinar los mundos síncronos y asíncronos. Las librerías tienen que tomar partido.

    El código asíncrono "contamina" todo el programa.

    [15:52] Moderación en la lista de correo.

    [18:47] Reconducimos la tertulia. ¿Estáis usando Python 3.9?

    Las distribuciones no están a la última. Cada cliente tiene instalado algo distinto.

    Utilizar cosas como Docker https://es.wikipedia.org/wiki/Docker, para independizarte de la versión orifial del Sistema Operativo.

    Los tests te salvan el día a la hora de actualizar de versión.

    [25:22] Sistemas de tests avanzados.

    Hypothesis: https://pypi.org/project/hypothesis/.

    Prueba de mutación: https://es.wikipedia.org/wiki/Prueba_de_mutaci%C3%B3n.

    [27:37] Podcasts en inglés que escucha Jesús:

    Python Bytes https://pythonbytes.fm/.

    Seis temas, media hora. Semanal.

    Opinión con criterio.

    Podcast de testing: Test & Code https://testandcode.com/.

    [30:52] Justificar actualizar a versiones modernas de Python.

    No suele haber problemas de compatibilidad actualizando a versiones más modernas de Python 3, y los cambios necesarios -si los hay- son menores.

    Problema: Los paquetes precompilados de librerías complejas pueden tardar en estar disponible para la nueva versión de Python.

    Muchas librerías complejas no publican versiones precompiladas de forma retroactiva para las versiones nuevas de Python cuando salen, hay que esperar a que saquen una nueva versión de la librería, a veces meses después.

    Si tardas en actualizar, actualizar múltiples versiones de golpe puede ser muy costoso.

    [34:32] El nuevo "resolver" de dependencias de PIP https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html.

    Se puede usar la opción -use-deprecated=legacy-resolver.

    Librerías compatibles con versiones nuevas de Python, pero que PIP no quiere instalar porque en los descriptores del proyecto no dice que sea compatible. Esto es un problema cuando sale una versión nueva de Python.

    [38:24] ¿Desde dónde conectamos cada uno?

    Spam de Jesús en las listas de correo.

    ¿Qué pasa con la gente de hispanoamérica?

    Mucha gente conectando desde Vigo y alrededores.

    Comunidades técnicas en el entorno de Vigo.

    Vigo Tech Alliance https://vigotech.org/.

    A Industriosa https://aindustriosa.org/.

    [43:42] Aviso de que las tertulias se graban.

    [44:42] Las ideas de Jesús Cea sobre las tertulias.

    [46:37] Bases de datos.

    SQLAlchemy https://www.sqlalchemy.org/.

    Modelos de datos.

    Diversas bases de datos.

    PostgreSQL: https://www.postgresql.org/.

    MySQL: https://www.mysql.com/.

    MongoDB: https://www.mongodb.com/.

    Jesús Cea usa sistemas de persistencia. Se ha hablado mucho de esto en una tertulia anterior.

    [51:42] Persistencia en Python.

    Tema abordado de forma extensa en la tertulia anterior:https://podcast.jcea.es/python/9. Revisa el audio y/o lasnotas de esa grabación.

    [01:02:52] La persistencia no usa teoría relacional.

    Trabajando con persistencia, no puedes traerte tus ideas de teoría relacional. Se trabaja de otra manera.

    Acceso al sistema de persistencia a través de un API.

    [01:09:27] Nuevas incorporaciones a la tertulia.

    [01:10:12] ¿ORM de Django https://www.djangoproject.com/ o SQLAlchemy https://www.sqlalchemy.org/?

    [01:14:32] Jesús insiste en sus sistemas de persistencia.

    ZODB: http://www.zodb.org/en/latest/.

    ¿Cómo se actualiza la definición de objetos? Jesús describe las dos técnicas que usa:

    Versión global de la base de datos con actualización en el arranque.

    Cada objeto tiene su versión y se actualiza al cargarlo en memoria.

    Los objetos son objetos nativos de Python. Para que otros lenguajes puedan acceder a los datos hay que proporcionarles un API.

    [01:26:32] Tecnología "publicar & suscribir" https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern.

    Event Sourcing https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome.

    Lenguaje Linda https://en.wikipedia.org/wiki/Linda_(coordination_language).

    RabbitMQ: https://www.rabbitmq.com/.

    ZeroMQ: https://zeromq.org/.

    Redis: https://redis.io/.

    Pyro: https://pyro5.readthedocs.io/en/latest/.

    Colas persistentes.

    BerkeleyDB: https://en.wikipedia.org/wiki/BerkeleyDB.

    [01:40:37] Open Source y mantenedores quemados.

    Github: https://github.com/.

    Github actions: https://docs.github.com/en/actions.

    [01:49:54] Final.