Arxiu de la categoria: Informàtica i comunicacions

Notes sobre programació, sistemes operatius, comunicacions

Python: eliminació espais superflus

Python no té una funció específica per eliminar espais superflus (és a dir, eliminar tots els espais del principi i del final d’un text, i entre paraules deixar-hi només un espai).

Hi ha una manera molt pythònica de fer-ho:

" ".join(text_amb_espais.split())

I això és ràpid? Doncs comparem 3 alternatives amb timeit:

  • Aquesta de join i split
  • Un bucle pas a pas: mirar caràcter a caràcter si hauríem de posar-lo al resultat final, depenent de si aquest o l’anterior són espais.
  • Amb tantes substitucions com calgui de dos espais seguits a un.

El codi per mesurar-ho és:

from timeit import timeit

def eliminar_espais_split_join (text: str) -> str:
    return " ".join(text.split())

def eliminar_espais_posicio_a_posicio (text: str) -> str:
    anterior_es_espai = True
    sense_espais_redundants = ""
    for x in text:
        if x == " ":
            if not anterior_es_espai:
                sense_espais_redundants += x
                anterior_es_espai = True
        else:
            sense_espais_redundants += x
            anterior_es_espai = False

    if len(sense_espais_redundants) > 0:
        if sense_espais_redundants [-1] == " ":
            sense_espais_redundants = sense_espais_redundants[:-1]
    return sense_espais_redundants

def eliminar_espais_replace (text: str) -> str:
    r2 = text
    while (r1:= r2.replace("  ", " ")) != r2:
            r2 = r1
    if len(r2) > 0:
        if r2[0] == " ":
            r2 = r2[1:]
    if len(r2) > 0:
        if r2[-1] == " ":
            r2 = r2[:-1]
    return r2

TEXT_PROVA = "      Vivamus       quis        lacus     quis  sapien    elementum     finibus   et    sollicitudin nisi.   "

assert (eliminar_espais_posicio_a_posicio (TEXT_PROVA) == eliminar_espais_split_join(TEXT_PROVA))
assert (eliminar_espais_replace (TEXT_PROVA) == eliminar_espais_split_join(TEXT_PROVA))

EXECUCIONS = 100_000

temps = (timeit (lambda: eliminar_espais_split_join (TEXT_PROVA), number=EXECUCIONS),
         timeit (lambda: eliminar_espais_posicio_a_posicio (TEXT_PROVA), number=EXECUCIONS),
         timeit (lambda: eliminar_espais_replace(TEXT_PROVA), number=EXECUCIONS))

temps_minim = min(temps)

print (f"eliminar_espais_split_join: {temps [0] / temps_minim:.2f} vegades el mínim")
print (f"eliminar_espais_posicio_a_posicio: {temps [1] / temps_minim:.2f} vegades el mínim")
print (f"eliminar_espais_replace: {temps [2] / temps_minim:.2f} vegades el mínim")

I el resultat:

eliminar_espais_split_join: 1.00 vegades el mínim
eliminar_espais_replace: 2.25 vegades el mínim
eliminar_espais_posicio_a_posicio: 8.83 vegades el mínim

He provat algunes variants, sense que influeixin significativament en els resultats:

  • Sense fer servir l’operador walrus (notació := al while) a eliminar_espais_replace.
  • Amb substitucions de 2 i 3 espais concatenades a eliminar_espais_replace.
  • Amb un índex per accedir als diferents caràcters a posicio_a_posicio.

O sigui, he deixat l’split_join al codi, la manera més genuïna del Python és alhora la més ràpida.

Dades EXIF en imatges WhatsApp

Una fotografia que m’ha arribat per WhatsApp i que m’he passat a l’ordinador no té cap dada EXIF, ni la data / hora.

D’entrada m’ha xocat, després he vist que no està mal pensat, per privacitat. Desconec qui ho esborra: el sistema operatiu en posar-la al xat, l’aplicació WhatsApp o el meu telèfon en rebre-la o desar-la. Tampoc no sé amb quin telèfon va ser feta.

Sqlite

He passat la base de dades de fotografies a Sqlite. Fins ara havia fet servir Sqlite molt poc.

El canvi ha estst fàcil perquè tinc l’aplicació amb Sqlalchemy. He pogut canviar noms de columnes tocant només el fitxer de configuració (definició d’entitats Sqlalchemy). Traspàs de dades amb select de MySQL i insert a Sqlite.

L’aplicació funciona de meravella, i podria deixar-la així, però segueixo amb MySQL. Sqlite no em fa el pes per dos detalls, irrellevants en una aplicació com aquesta:

  • Camps de tipus text sense longitud màxima. M’agrada que el motor de base de dades comprovi aquestes restriccions, atès que en ser violades poden ser símptoma d’errors de programació.
  • Mancança de camps de tipus data, de nou “massa” responsabilitat per desenvolupador. Val a dir que amb Sqlalchemy les possibilitats que es degradi són baixes.

I potser ho passo a Firebird.

Actualització 1/10/25: Descarto Firebird, la creació de la base de dades amb Sqlalchemy no funciona.

PyQt6

M’he dedicat una part de les vacances a ordenar fotografies, fins que m’he cansat del sistema que tenia muntat a mitges amb CherryPy i MySQL: m’hi falta la part de les persones, les cerques i per la incorporació de fotos faig servir un altre programa en TKinter.

Miro opcions amb altres entorns, acabo amb PyQt6.

Amb els anys hauré passat per:

  • Base de dades Access
  • Java amb Swing. No recordo si la BD era amb Access o ho vaig passar a MySQL
  • CherryPy i MySQL
  • PyQt6 i MySQL

Segueixo amb MySQL, tot i que més endavant ho passaré a Sqlite.

Tinc la base feta (edició de les dades d’una foto). Em falten moltíssimes coses, però amb aquesta base ja és cosa d’anar completant les funcionalitats a mida que tingui humor i temps per fer-ho.

M’agrada PyQt6.

Canvi ordinador: molta feina

Doncs això del canvi d’ordinador porta una feinada de nassos.

A 11/3/2025 20:15 ho tinc així

Feina feta

  • Activació del windows i actualitzacions
  • Vivaldi i comptes de correu (faig servir el client de correu de Vivaldi)
  • Còpia de fitxers de l’ordinador antic al nou
  • Activar Microsoft Office
  • Programa de comunicacions ZOC
  • Winbox (gestió dels routers Mikrotik)
  • Ultraedit
  • Certificat idcat: em dona molta feina perquè no puc exportar el de l’ordinador antic. Haig de fer servir el pfx de quan el vaig demanar; per sort tenia la clau d’encriptació.
  • Nou: WinStep de Nexus, de moment per provar-lo. He comprat la versió Ultimate, sobretot per accés ràpid a programes.
  • Gestor de contrasenyes
  • Python
  • Winrar
  • Vuescan
  • Qobuz
  • Gestor IP dinàmica
  • DXO Photolab (aprofito per actualitzar-lo a la versió 8)
  • Qobuz
  • JRiver Mediacenter
  • Photoshop Elements 2024
  • Cyberlink Power Director
  • Nero
  • Configurar RustRover
  • Configurar Datagrip
  • Configurar Pycharm
  • Calibre
  • Adobe Digital Editions
  • Audacity
  • Imagemagick
  • Utilitats impressora Epson. M’agradaria saber per què dimonis necessiten les opcions d’ubicació activades.
  • Ultracompare: no tinc l’instal·lable i és una versió de sis o set anys enrere. No vull comprar versió nova, perquè el faig servir molt poc. El suport tècnic (ultredit) em proporciona la versió 18, que és la que vaig comprar en el seu moment. Gràcies.
  • Passar Office a català

Em falta

  • Phantom (CD/DVD virtual)
  • Configurar algunes utilitats

i segur que me’n deixo algun, falta un darrer repàs.

He canviat aquesta entrada a mida que he avançat.

Canvi de portàtil

Forçat pel final del suport a Windows 10 canviaré de portàtil, perquè el Dell Inspiron 5547 del 2014 no suporta el Windows 11.

Aquest ordinador m’ha funcionat molt bé, sobretot del 2017 ençà, quan li vaig posar un disc SSD. Malgrat que té un parell de limitacions (xarxa lenta, i lentitud d’alguns programes de tractament d’imatges que no poden aprofitar la targeta gràfica AMD Radeon, bateria poc fiable) l’hauria pogut fer servir més temps.

Probablement li donaré una segona vida amb linux per experimentar algunes coses.

El nou és un HP ZBook Firefly 16 G11. Si em dona el mateix resultat que aquest potser ja no me’n compraré mai més cap. No m’atreveixo a dir si d’aquí a 15 anys encara tindrem portàtils.

100 anys EAJ-1

Avui fa 100 anys va començar a funcionar la primera emissora de ràdio a Catalunya, la EAJ-1 (Ràdio Barcelona).

Hi tingué una participació destacada el badaloní Joan Vidal i Prat, que més endavant va fundar Ràdio Badalona, que amb el temps esdevingué Ràdio Miramar. Hi ha un carrer amb el seu nom al barri de Montigalà.

Els meus avis van viure els primers anys de la seva vida sense ràdio. Ara no concebem el món sense els telèfons mòbils i totes les aplicacions que els acompanyen.

L’evolució tecnològica d’aquests 100 anys, accelerada sobretot a partir de la invenció del transistor, fa posar els pèls de punta.

Transistor popularment es va fer servir per designar el receptor de ràdio que funcionava amb aquests components en comptes de vàlvules, i que en va permetre reduir les mides i fer-los mòbils.

Cables de xarxa

Dues pèrdues de connexió amb el “servidor” que tinc a casa, ni un SSH amb IP respon (per tant no és del DNS).

Al log del router veig moltes connexions i desconnexions:

He aplicat aquella regla que diu que, abans que res, comprova els cables i he canviat el cable de xarxa que va de l’ordinador al router. D’ençà que l’he canviat no hi ha hagut desconnexions.

Uns dies enrere he tingut un altre incident d’aquest tipus, l’streamer també es desconnectava. En aquest cas el cable quedava molt forçat a la boca del router. Ho vaig canviar de boca i no m’ha tornat a donar problemes.