Amor por la tecnología

Estoy desatado. Es como cuando nos gusta mucho alguien y hacemos todo lo posible por ocultarlo hasta que no podemos más y, un día, sale todo de golpe. Pues yo amo la tecnología. Ayer me instalé el Visual Studio code.

Está muy bien eso de escribir los scripts desde Vim en el terminal, pero quería probarlo. De hecho, lo probé hace cosa de un año o más, pero mi ordenador se arrastraba tanto que era un suplicio. Aunque peor era el Android Studio de Google. Le llevaba un varios minutos solamente arrancar. Inusable.

Y lo instalé ayer. Y funcionó muy bien, maravillas de la tecnología SSD. Y me resultó fácil e intuitivo instalar nuevos complementos.

Lo usé para mejorar el script de automatización del podcast.

Me di cuenta de que, al correr el script, cuando llegaba la parte en la que lanzaba Audacity para grabar el podcast, el script se detenía, y no finalizaba hasta que yo terminaba de grabar el episodio. Entonces pensé que podía aprovechar este inesperado comportamiento para automatizar algo más.

Yo hago la grabación del episodio y, cuando termino, lo exporto a mp3. Pero los ficheros internos de Audacity tienen un formato aup y además son enormes. Un episodio de media hora me puede generar un giga y medio de datos que me resultan irrelevantes, pues sólo me interesa el mp3 que es lo que subo a Anchor. Normalmente los borro justo en el momento de subirlos, pero… si los puedo borrar automáticamente al cerrar Audacity, pues mucho mejor.

Así que amplié el script en bash de manera que comprueba si se ha creado el mp3 del episodio y, entonces, elimina los archivos “residuales”:

# Cuando cierro Audacity
## Comprobar si se ha creado el mp3 y, en caso afirmativo, borrar el resto de ficheros de Audacity.
if [ -f ESDLV-ThePodcast-$NEWDIR.mp3 ]
then
       echo "Borrando ficheros de Audacity..."
       rm ESDLV-ThePodcast-$NEWDIR.aup
       rm -fr ESDLV-ThePodcast-$NEWDIR$DATA
fi

Me encanta esa manera tan elegante que tiene bash para trabajar con ficheros, con ese if -f seguido del nombre del fichero. Es la primera vez que me sumerjo en bash y me está gustando mucho.

Expandiendo horizontes

Espoleado por mi éxito, ayer por la tarde investigué algo más. ¿Acaso no sería genial si, además de hacer todas estas operaciones en local, pudiera expandir esa automatización a través de la red para generarme un borrador de post con una plantilla de podcast? Esto es, con su título, su plantilla de escaleta, su categoría de podcast ya preseleccionada… Sí, sería genial.

Así que me puse a investigar.

Mi lenguaje favorito es Python. Es sencillo, limpio, elegante, minimalista… Tiene todo lo que considero que tiene que tener un lenguaje de programación. ¿Para qué un punto y coma al final de cada sentencia? ¿Para qué tanto paréntesis? ¿Qué tal si usamos los tabuladores para estructurar el código necesariamente?

Así que me propuse hacerlo con Python y encontré un par de soluciones basadas en un módulo que utiliza la API, si lo he entendido bien, de WordPress para hacer todo tipo de cosas, entre otras crear un nuevo post con una serie de datos de base.

Y me puse manos a la obra.

La parte más difícil, paradójicamente, fue conseguir que Python importara el módulo en cuestión. Lo instalé pero no era detectado, así que al final tuve que terminar incluyendo el path en cuestión en la variable de PYTHONPATH que cargo desde mi .bashrc. No sé si es lo más ortodoxo, pero me funcionó.

Para simplificar el proyecto, me salté la parte de la autenticación. Para dar un poco de seguridad al asunto, creé un usuario WordPress tipo Colaborador, que sólo puede crear nuevos posts en borrador y queda al margen de todo tipo de permisos administrativos.

Y en fin, una hora más tarde, y después de algunas pruebas, la cosa estaba como yo quería:

# -*- coding: utf-8 -*-
# Script para crear una nueva entrada de Wordpres para el podcast
# Por hacer: Importar número de episodio y completar el título

import sys
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import posts

# He creado un usuario tipo colaborador que sólo puede escribir posts, no publicar.
# Nombre usuario tipo colaborador: MI_USUARIO
# Contraseña usuario: MI_CONTRASEÑA
# Email: MI_EMAIL

url_xmlrpc_esdlv = 'https://elsentidodelavida.net/xmlrpc.php'
usuario = 'MI_USUARIO'
contra = 'MI_CONTRASEÑA'

if sys.argv[1]:
   num_capitulo = sys.argv[1]
else:
   num_capitulo = 'XXX'

esdlv = Client(url_xmlrpc_esdlv, usuario, contra)

print "Creando nuevo post para el podcast a ESDLV..."
post = WordPressPost()
post.title = 'Podcast Ep. ' + num_capitulo + ': '
# post.slug = 'El slug del post'
post.content = """
<p>Descripción</p>
<p><strong>Escaleta:</strong></p>
<ul><li>Item A</li><li>Lectura de El Diario Teutón: "".</li></ul>
"""
post.terms_names = {
   'post_tag': [],
   'category': ['Podcast']}
post.id = esdlv.call(posts.NewPost(post))
# post.post_status = 'draft'

success = esdlv.call(posts.EditPost(post.id, post))

if success == True:
   print "Nuevo post creado exitosamente"
else:
   print "Algo ha ido mal"

— Ostras… ¡ha funcionado! –dije.

—¿No deberías decir “¡Yuhu, ha funcionado!”? —preguntó Daniela desde el sofá.

—Sí, pero es que no me lo creo…

Recuerdo mi primer “gran” proyecto en el trabajo. Para un cliente, tenía que acceder a la API de un servicio online para tomar los datos desde la base de datos de nuestro programa, subirlos al servicio online y además hacer algunas operaciones con ellos, tanto como antes como después. En mi vida había usado una API. El programa tenía un montón de líneas. Estuve ocho o diez horas trabajando en ello a lo largo de dos días. Al final, funcionó.

—La hostia puta… ¡Funciona! —pensé.

Me sentí como si estuviera poniendo un cohete en la luna.

Siempre había querido aprender a programar. Creía que tenía que ir a la universidad para ello. Creía que tenía que aprender allí durante muchos años. Gracias a que los socios de mi antigua empresa me dieron una oportunidad, pude aprender a programar. Al menos empezar.

Mi nivel es muy básico. Trabajé haciendo principalmente modificaciones del código, adaptándolo a las necesidades específicas de cada cliente. Nunca hice desarrollo en sí. Los objetos se me quedan grandes. Ignoro las cosas más complejas y avanzadas de los lenguajes de programación. Pero oye, puede crear un post en WordPress desde un script de Python.

“Un pequeño paso para un hombre, un gran paso para la humanidad”.

Despedida y cierre: Wie geht es weiter?

El siguiente paso natural sería conectar el script en bash con el script en python, de modo ejecutando por ejemplo el primero, cuando tenga el número del nuevo episodio se lo pase al script en python para que lo aproveche para crear el nuevo post ya con ese número de episodio. Con esto estaría, en principio, esta automatización terminada.

Ahora, Dani me ha pasado ya algunos requerimientos de cómo quiere formatear específicamente sus apuntes, así que me voy a poner a trabajar en eso hoy.

Al margen de este asunto, este jueves comienzo por fin el curso de orientación laboral. Seguiré informando.

Nos quedamos todavía un día más en Múnich para recordar:
¡siempre hay un camino!
2

#aprender#bash#programación#python#script#trabajo

Contribuciones:

  1. Julia - 25 de noviembre de 2020 @ 14:44

    Muy útiles estos últimos posts técnicos como tutoriales para iniciarse en cuestiones técnicas. ¡Enhorabuena!

    ¿Te interesa recibir feedback sobre tu código? Si es así te puedo comentar un par de cositas. Pero pregunto primero por si acaso 😉

    • Javier - 25 de noviembre de 2020 @ 16:10

      Gracias, Julia 🙂

      ¡Claro que me interesa el feedback! Soy un completo aprendiz. Todo comentario es bienvenido 🙂

      PD: ¡Qué sopresa! No me imaginaba que programaras.

      • Julia - 25 de noviembre de 2020 @ 16:32

        Ay, me alegro. Yo también tengo vena docente, sobre todo en temas de python, que me encanta. Así que aquí van mis comentarios, que espero te interesen.

        Te sugiero que te pases a python3, ya que el soporte a python2 ya finalizó y se recomienda portar a python3. https://www.zdnet.com/article/goodbye-python-2-programming-language-this-is-the-final-python-2-7-release/

        No vas a notar muchos cambios, pero uno de los más evidentes es que print se tiene que escribir ya siempre con paréntesis: https://docs.python.org/3/whatsnew/3.0.html#print-is-a-function

        Otra cosa que te va a encantar son las f-strings, que te permiten formatear líneas de texto de manera mucho más elegante –> post.title = f’Podcast Ep. {num_capitulo}: ‘
        http://zetcode.com/python/fstring/

        Para parsear los argumentos desde la línea de comando te recomiendo argparse https://docs.python.org/3/howto/argparse.html
        Te deja especificar argumentos requeridos o no, con su valor por defecto, y su tipo, de manera que no tienes que hacer lo de if sys.argv[1] ni llevar la cuenta de cuántos argumentos tienes para encontrar la posición en el array de sys.argv. Ya verás que en cuanto lo pruebes, no vuelves a usar sys.argv.

        Por último, para variables booleanas basta con usar “if success” para comprobar si es True. “if not success” para False. Queda un poco más conciso y en mi opinión más pythonico.

        Gracias por el recurso para vim que enlazas ahí abajo, lo voy a probar!

        Para contestar a tu pregunta, ahora mismo hago cosas de ciencia de datos pero python también lo he aprendido por mi cuenta y practicando.

        • Javier - 25 de noviembre de 2020 @ 17:09

          Me interesan tus comentarios. Gracias.

          Tengo instalado python3, hasta donde yo sé. Lo que ocurre es que el poco python que sé lo aprendí hace mucho tiempo. Hace un par de años estuve refrescando y me sorprendió ver lo que dices del print. Me ajusto entonces, gracias.

          De las f-strings sí que no tenía ni idea. Voy a leer algo al respecto. Gracias.

          Es la primera vez que parseo cosas desde la línea de comandos. He tenido que buscar un poco para documentarme. Me estudio el argparse. Gracias.

          Lo de la variable booleana sí que lo sabía. Creía que la función iba a devolver el identificador del post y me encontré con que devolvía un booleano, así que lo aproveché a manopla. Pero sí, como tú lo propones es más pythonico y más elegante. Gracias.

          ¡Oh, qué interesante lo que haces! ¿Algo de Machine Learning?

          • Julia - 25 de noviembre de 2020 @ 17:28

            Me alegra que te interesen estos comentarios.

            No sé qué instalación tienes pero con python3 tu línea del print da SyntaxError:

            python3
            Python 3.8.6 (default, Oct 8 2020, 14:07:53)
            Type “help”, “copyright”, “credits” or “license” for more information.
            >>> print “Creando nuevo post para el podcast a ESDLV…”
            File “”, line 1
            print “Creando nuevo post para el podcast a ESDLV…”
            ^
            SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(“Creando nuevo post para el podcast a ESDLV…”)?

            En cambio a python2 le gusta:

            python
            Python 2.7.16 (default, Jan 27 2020, 04:46:15)
            Type “help”, “copyright”, “credits” or “license” for more information.
            >>> print “Creando nuevo post para el podcast a ESDLV…”
            Creando nuevo post para el podcast a ESDLV…

            Con python –version en la terminal ves qué versión estás usando. Quizá tengas python3 también instalado pero el intérprete se llame python3 y python a secas sea el alias para python2. En Windows no sé muy bien cómo va la instalación.

            Más que ML hago cosas de análisis clásico de datos y reports.

            • Javier - 25 de noviembre de 2020 @ 18:46

              Python 2.7.18

              Creía que tenía la 3. Me parece que la confusión viene de pip, que tengo que escribir pip3 para que funcione. Creía que venía a juego con la versión de Python. Me voy a instalar la versión 3.

              Gracias 🙂

              Análisis clásico de datos y reports… Todo lo que me quieras contar acerca de eso me interesa 🙂

            • Javier - 25 de noviembre de 2020 @ 18:51

              Vaya, justo como indicabas:

              jmalonda@DESKTOP-GRM5DFV:~$ sudo apt install python3 python3-pip
              Reading package lists… Done
              Building dependency tree
              Reading state information… Done
              python3 is already the newest version (3.8.2-0ubuntu2).
              python3 set to manually installed.
              python3-pip is already the newest version (20.0.2-5ubuntu1.1).
              0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
              jmalonda@DESKTOP-GRM5DFV:~$ python –version
              Python 2.7.18
              jmalonda@DESKTOP-GRM5DFV:~$ python3 –version
              Python 3.8.5

  2. Ed - 25 de noviembre de 2020 @ 15:23

    La tecnología puede ser muy adictiva y mas si los scripts son para uno mismo. Yo he llegado a “viciarme” horas mejorando hojas de cálculo que solo uso yo.

    Yo soy mas de “vim” que de “IDE”, pero he de reconocer que Visual Studio Code es una delicia y últimamente lo uso para tocar ficheros de 10 lineas (ficheros .yaml donde el formato y los espacios en blanco son tan importante). No se como consiguen que algo tan potente arranque tan rápido. Mi enhorabuena a Microsoft

    • Julia - 25 de noviembre de 2020 @ 15:42

      Ed, ¿conoces algún buen recurso para aprender vim bien, o sea dominar los atajos de teclado y toda esa magia?
      ¿O no queda otra más que practicar y practicar hasta que “los dedos aprendan”?

      Gracias!

      • Javier - 25 de noviembre de 2020 @ 16:17

        Para aprender vim jugando tienes “vim adventures”:

        https://vim-adventures.com/

        Hasta una cierta lección es gratuito, y luego hay que pagar. Pero es una pasada lo entretenido que se hace aprender así los atajos de teclado. Está muy bien hecho y es un concepto muy interesante.

        Si me dices qué nivel tienes podemos hacer aquí un tutorial desde ahí. Precisamente hace un momento estaba aprendiendo acerca de las macros de vim.

        Por cierto, ¿a qué te dedicas?

    • Javier - 25 de noviembre de 2020 @ 16:12

      Completamente de acuerdo con el vicio. Importante encontrar ese equilibrio entre el tiempo dedicado y el beneficio obtenido.

      A mí me encanta vim. Visual Studio Code funciona muy bien, aunque apenas acabo de instalarlo. Y sí, es sorprendente lo que comentas.

  3. Ed - 25 de noviembre de 2020 @ 17:42

    Creo que por defecto vim, viene con el comando “vimtutor” que es un manual rápido.
    Para aprender online https://www.openvim.com/

Deja una respuesta

Tu direción de email estará oculta.
Los campos requeridos tienen un asterisco (*).

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.