Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Redes Antisociales

Lo que nun­ca fué pa­ra mí es una red so­cia­l. Es­ta­ría igual de fe­liz si el si­tio es­tu­vie­ra ha­bi­ta­do por un mi­llón de ex­tra­ños anó­ni­mos de cu­yo buen gus­to me pu­die­ra apro­ve­cha­r.

Hoy en día ten­go unos cuan­tos ami­gos ahí, pe­ro ca­si nun­ca ha­go al­go "so­cia­l" mas allá de acep­tar pe­di­do­s, y po­ner re­views que no creo que na­die lea.

Me gus­ta Fli­ckr don­de pon­go la ma­yo­ría de mis fo­tos (al­gún día, to­das mis fo­to­s). Es ba­ra­to y pue­do su­bir prác­ti­ca­men­te fo­tos ili­mi­ta­da­s, y pue­do com­par­tir­las (a ve­ce­s) con ami­gos re­pos­teán­do­las a twi­tter o fa­ce­book.

¡Has­ta fue­ron tan ama­bles de guar­dar to­das las fo­tos que su­bí co­mo usua­rio free has­ta que les pa­gué por el es­pa­cio que ocu­pa­ban 5 años más tar­de!

Me gus­ta Twi­tter pa­ra pos­tear co­sas chi­cas que no me­re­cen en­trar al blo­g, bo­lu­dear con ami­gos y no tan­to, co­no­cer gen­te, y per­der un ra­ti­to to­dos los día­s.

Una de esas co­sas no es co­mo las otra­s. Ona de esas co­sas "so­cia­le­s" la uso por­que es so­cia­l, las otras no, y la ver­dad que sean so­cia­les o no no me in­te­re­sa mu­cho.

Tal vez hoy pa­ra que una red so­cial ten­ga éxi­to de­be­ría pres­tar aten­ción a los anti­so­cia­le­s, pa­ra que al me­nos al prin­ci­pio, cuan­do no co­no­cés a na­die, sir­va pa­ra al­go. No voy a Goodrea­ds a char­la­r. No voy a Fli­ckr a dis­cu­ti­r. Voy a po­ner fo­tos y li­bro­s. Y por eso si­go ahí, y aho­ra co­noz­co gen­te.

Los Blogs Que No Escribo

  • Co­­sas que creés o te pa­­re­­cen bien só­­­lo po­r­­que lo di­­jo tu vie­­ja

  • Pis­­tas pa­­ra Via­­je­­ros Te­m­­po­­­ra­­les

  • Plan­­tas si­m­­pá­­ti­­cas y sus aven­­tu­­ras

  • 1001 fo­r­­mas de pe­­lar un ga­­to

  • Co­­sas que di­­cen los fu­­ne­­bre­­ros

  • Via­­jes pa­­ra Pis­­te­­ros Te­m­­po­­­ra­­les

  • Mo­­­ne­­das del mun­­do y sus sa­­bo­­­res

  • Co­­sas ha­­lla­­das en na­­ri­­ces de la gen­­te

  • ¡So­r­­pre­s­a, no era po­­­llo!

  • Te­m­­po­­­ra­­les pa­­ra via­­je­­ros des­­pis­­ta­­dos

  • El mun­­do de la pe­­lu­­sa

Kill the Dead (Sandman Slim, #2)

Cover for Kill the Dead (Sandman Slim, #2)

Review:

This is not a book. It's the sec­ond half of "Sand­man Slim". Read that and then de­cide if you ac­tu­al­ly want to read this sec­ond half or not.

Me, I liked it, thank you very much.

PyQt Quickie: Que no te lleve el basurero

Qt tie­ne sus me­ca­nis­mos pa­ra crear y eli­mi­nar ob­je­tos (el ár­bol de QOb­jec­ts, smart poin­ter­s, etc.) y Py­Qt usa Py­tho­n, así que tie­ne gar­ba­ge co­llec­tio­n.

Con­si­de­re­mos un ejem­plo sim­ple:

from PyQt4 import QtCore

def finished():
    print "El proceso termino!"
    # Salir de la aplicación
    QtCore.QCoreApplication.instance().quit()

def launch_process():
    # Hacer algo asincrono
    proc = QtCore.QProcess()
    proc.start("/bin/sleep 3")
    # Cuando termine, llamar a finished
    proc.finished.connect(finished)

def main():
    app = QtCore.QCoreApplication([])
    # Lanzar el proceso
    launch_process()
    app.exec_()

main()

Si eje­cu­tás eso, te va a pa­sar es­to:

QProcess: Destroyed while process is still running.
El proceso termino!

Encima el script no termina nunca. ¡Diversión! El problema es que proc está siendo borrado al final de launch_process porque no hay más referencias a él.

És­ta es una me­jor ma­ne­ra de ha­cer­lo:

from PyQt4 import QtCore

processes = set([])

def finished():
    print "El proceso termino!"
    # Salir de la aplicación
    QtCore.QCoreApplication.instance().quit()

def launch_process():
    # Hacer algo asincrono
    proc = QtCore.QProcess()
    processes.add(proc)
    proc.start("/bin/sleep 3")
    # Cuando termine, llamar a finished
    proc.finished.connect(finished)

def main():
    app = QtCore.QCoreApplication([])
    # Lanzar el proceso
    launch_process()
    app.exec_()

main()

Al agregar un processes global y meter ahí proc, mantenemos siempre una referencia, y el programa funciona. Sin embargo, sigue teniendo un problema: nunca eliminamos los objetos QProcess.

Si bien en es­te ca­so la pér­di­da de me­mo­ria es muy bre­ve por­que el pro­gra­ma ter­mi­na en­se­gui­da, en un pro­gra­ma de ver­dad es­to no es bue­na idea.

Así que necesitamos agregar una manera de sacar proc de processes cuando no lo necesitemo. Esto no es tan fácil como parece. Por ejemplo, esto no funciona bien:

def launch_process():
    # Hacer algo asincrono
    proc = QtCore.QProcess()
    processes.add(proc)
    proc.start("/bin/sleep 3")
    # Sacamos el proceso del global cuando no lo necesitamos
    proc.finished.connect(lambda: processes.remove(proc))
    # Cuando termine, llamar a finished
    proc.finished.connect(finished)

¡En esta versión, todavía tenemos un memory leak de proc, aunque processes esté vacío! Lo que pasa es que el lambda contiene una referencia a proc.

No tengo una my buena respuesta para este problema que no involucre convertir todo en miembros de un Qbject y usar sender para saber cuál proceso es el que termina, o usar QSignalMapper. Esa versión la dejo como ejercicio para el lector ;-)


Contents © 2000-2023 Roberto Alsina