Arxiu de la categoria: Informàtica i comunicacions

Notes sobre programació, sistemes operatius, comunicacions

Patró gestió connexions a base de dades

Ja he parlat alguna altra vegada de SQLAlchemy.

Com sabreu els que us hi heu dedicat alguna vegada, la gestió de les connexions a les bases de dades és un punt crític a les aplicacions amb diversos usuaris simultanis. Bé, és extensible a qualssevol recursos escassos.

Una solució que proposen (i deixen ben clar que no és l’única) és la següent:

from contextlib import contextmanager

sessions = sessionmaker (...) 

@contextmanager
def entorn_sessio ():
    sessio = sessions()
    try:
        yield sessio
        sessio.commit()
    except:
        sessio.rollback()
        raise
    finally:
        sessio.close() 

def fer_feina():
    # En acabar-se el WITH el bloc torna a entorn_sessio, just després del YIELD. 
    # Farà el commit
    # Si hi ha un error rebrem l'excepció
    # En tot cas allibera la connexió a la base de dades

    try:
        with entorn_sessio() as una_sessio:
            # El que hi ha dins del WITH pot fer l'accés a base de dades

            llibre_nou = Llibre(autor="Pierre Lemaître", titol="Couleurs de l'incendie")
            una_sessio.add (llibre_nou)

    except:
        # Tractar els errors des del punt de vista funcional, sense amoïnar-se per la connexió a la base de dades

    # I aquí seguim fent coses que no necessiten base de dades
    fer_mes_feina_sense_base_dades ()

L’he trobat molt elegant i a més m’agrada perquè:

  • Queda clar en quin bloc es fa accés a base de dades (el que és dins del with). Això convida a fer-lo curt i, si no ho és, a repensar-ho una mica.
  • Fa una gestió global del recurs (l’accés a base de dades) de forma bastant còmoda, que em sembla fàcil d’estandarditzar en tota una aplicació o en un equip de treball.
  • En cap cas es queden connexions obertes (si se segueix el patró a tot arreu, és clar).
  • M’ha permès aprofundir en el yield (no l’havia fet servir mai, encara… i és que m’agrada el Python, però vaig aprendre a programar amb BASIC i Pascal, que són molt tradicionals).

L’he començat a fer servir per una aplicació d’ús personal, amb una variant: un “entorn_sessio” per a actualitzacions (com el que hi ha a l’exemple de dalt) i un altre només per consultes, que incondicionalment fa un rollback() al final.

Si bé aquest mètode em sembla bo, no hi ha solució universal a aquests problemes. I gairebé és tan important assegurar-se que dins d’una aplicació es fa a tot arreu de la mateixa manera com la correcció de la solució per ella mateixa.

22/3/2019: Exemple retocat.

Renovació certificat web

Acabo de renovar el certificat del domini.

Poca gent deu dedicar 1 hora del primer matí de l’any a una activitat com aquesta, però he vist el correu d’avís de caducitat (a final de gener) i m’hi he posat.

I, mireu, feina feta!

Ah, sort de les notes que vaig prendre en el seu moment. No recordava com es generava el CSR (per renovar el certificat se n’ha de generar un de nou).

FreeBSD 12

Publicada fa uns dies la versió 12 de FreeBSD. Sistemes actualitzats aquest cap de setmana.

No sé quants anys de vida li queden a aquest sistema operatiu. La quota de mercat que té és baixa (menys de l’1% de les webs d’Internet), tot i que té alguns usuaris molt potents (Netflix, per exemple).

M’hi sento més còmode que amb Linux, sense ser un expert en cap dels dos, però sóc conscient que pot quedar arraconat del tot d’aquí a uns anys.

Canviador de pàgina

Per un projecte particular he pensat bastant en com ha de ser un canviador de pàgines per a web.

L’he deixat així quan hi ha moltes pàgines (aquestes 38 són el màxim):

I més senzill quan n’hi ha poques (menys de 10):

Podríem escriure moltes digressions sobre com han de ser els canviadors de pàgina.

23/12/2018: Ara, ni jo mateix sóc coherent amb aquestes coses, en una altra aplicació ho tinc diferent:

Aquest segon té un problema: qui vulgui avançar 300 pàgines perdrà la paciència.

“lang=ca” a FreeBSD

Fins ara deixava això al fitxer /etc/login.conf dels servidors FreeBSD:

:charset=UTF-8:\
:lang=en_US.UTF-8:

Però he vist que una de les opcions vàlides és 

:lang=ca_ES.UTF-8:

Ho he canviat i ara les dates dels fitxers surten en català:

Dates dels fitxers amb lang=en_US.UTF-8

Dates dels fitxers amb lang=ca.ES.UTF-8

i fa servir la coma pels decimals:

Decimals amb coma

Potser hi haurà algun altre detall canviat que trobaré els propers dies.

Servidor casolà

El servidor casolà que substitueix el venerable Zino ja està muntat, més o menys com comentava:

  • Processador i3.
  • 2 discos 2,7 TB (per mi 1 TB és la quarantena potència de 2, no la dotzena potència de 10 com fan servir els fabricants de discos).
  • 1 “disc” M.2 per al sistema operatiu.

Hi instaŀlo FreeBSD 11.1. Munto ZFS tant per al sistema operatiu com per als discos (que deixo en mirall). Per al sistema operatiu em fio del procés guiat d’instaŀlació, m’ho fa prou bé. Pel mirall vaig més a poc a poc, tot i que m’he documentat força.

El disc de l’anterior ordinador funciona bé, això m’estalvia feina en la recuperació de dades. També tenia força ben documentada la configuració de diferents serveis (samba, sobretot), amb això vaig bastant de pressa.

Tres errors amb què puc conviure, però que miraré d’esmenar:

  • He comprat una caixa massa gran. Hauria d’haver demanat a la botiga que me l’ensenyessin en comptes de comprar per foto de catàleg.
  • Tinc 95 GB no usats en les particions del mirall. Primer vaig pensar a ampliar-les, però potser ja em va bé tenir aquest espai no particionat. Al cap i a la fi, si mai em falten 95 GB hauré de pensar ja a buscar altres discos.
  • Al revés, la partició del sistema operatiu és massa gran (250 GB), amb una tercera part hauria fet.

Alguns d’aquests errors no els hauria comès (o els hauria arreglat refent la feina) si hagués tingut uns dies més relaxats, però hi ha qüestions laborals d’aquestes darreres setmanes que em prenen força energies i temps.