Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre python (publicaciones antiguas, página 78)

The Future of PyQt by Example


Th­ree years ago, I started a se­ries of long pos­ts ca­lled "P­y­Qt by Exam­ple". It rea­ched fi­ve pos­ts be­fo­re I aban­do­ned for a se­ries of rea­sons that do­n't ma­tter an­y­mo­re. That se­ries is co­ming ba­ck star­ting next week, rew­ri­tten, im­pro­ved and ex­ten­de­d.

It wi­ll do so in a new si­te, and the "ol­d" pos­ts wi­ll be re­ti­red to an ar­chi­ve pa­ge. Wh­y? We­ll, the te­ch­no­lo­gies us­ed in so­me of them are ob­so­le­te or do­n't qui­te wo­rk no­wa­da­ys. So, the new ver­sions wi­ll be the pre­fe­rred ones.

And whi­le I am not pro­mi­sing an­y­thin­g, I ha­ve enou­gh wri­tten to make this so­me­thing qui­te lon­ge­r, mo­re ni­ce­ly la­youte­d, mo­re in­te­res­ting and make it co­ver mo­re groun­d. BU­T, whi­le doing so­me che­cks on the tra­ffic sta­tis­ti­cs for the old pos­ts, so­me things po­pped ou­t.

This was very popular

About 60% of my si­te's tra­ffic goes to tho­se fi­ve pos­ts. Out of about 1200 pos­ts over 12 year­s, 60% of the viewers go to the 0.4% of the pa­ges. That is a lo­t.

It's a long tail

The tra­ffic has not de­crea­sed in th­ree year­s. If an­y­thin­g, it has in­crea­sed

https://p.twimg.com/Aw0MHhoCAAAXmro.png:large

A long and ta­ll tai­l.

So, all this means the­re is a de­si­re for Py­Qt do­cu­men­ta­tion that is not sa­tis­fie­d. I am not sur­pri­s­e­d: Py­Qt is grea­t, and the re­co­m­men­ded book is not free, so the­re is bound to be a lot of de­man­d.

An­d, he­re's the no­t-­so­-­ro­sy bi­t: I had unob­tru­si­ve, re­le­van­t, ou­t-o­f-­the-wa­y-­bu­t-­vi­si­ble ads in tho­se pa­ges for mo­re than two year­s. Of the 70000 uni­que vi­si­tor­s, not even one cli­cked on an ad. Do­n't wo­rr­y, I was not ex­pec­ting to get mo­ney out of them (al­thou­gh I would lo­ve to so­me day co­llect a $100 che­ck ins­tead of ha­ving google hold my mo­ney for me ad eter­nu­m).

But rea­ll­y? Not even one ad cli­ck? In mo­re than two year­s, thou­san­ds of peo­ple? I ha­ve to won­der if I just attract cheap peo­ple ;-)

PyCamp Empieza el Viernes

Así que va a es­tar bue­ní­si­mo. Pa­ra mí es una ra­ra opor­tu­ni­dad de po­der pa­sar unos días dán­do­le ma­ni­ja a pro­yec­tos per­so­na­le­s, sin que me in­te­rrum­pan pa­va­das co­mo fa­mi­lia, tra­ba­jo, co­ci­na­r, o so­cia­li­za­r, ex­cep­to con otros ner­d­s.

Se­gu­ro, pue­de lle­gar a ha­ber al­gún oca­sio­nal pa­seo en mo­no­ci­clo, lec­cio­nes de ma­la­ba­res, o prác­ti­ca de ti­ro, pe­ro en se­rio, tres o cua­tro días só­li­dos de ha­ckin­g.

Mi idea es tra­ba­jar en pro­yec­tos re­la­cio­na­dos con Niko­la mi ge­ne­ra­dor de si­tios es­tá­ti­co­s, así que si te in­te­re­sa y vas a py­cam­p, ha­ble­mo­s.

Y si te in­te­re­sa pe­ro no vas a py­cam­p, no hay mo­ti­vo pa­ra no ha­cer un sprint vir­tua­l. Hay in­ter­ne­t. Hay IR­C. Voy a te­ner tiem­po. ¡Es un fin de se­ma­na lar­go! Por fa­vor com­par­tí ideas en el gru­po niko­la-­dis­cuss y ve­re­mos qué po­de­mos im­ple­men­ta­r, o por lo me­nos em­pe­za­r.

Un Verificador de links simple para Nikola

Es­te script es un muy sim­ple ve­ri­fi­ca­dor de li­nks que se ase­gu­ra que las pá­gi­nas que Niko­la ge­ne­ra no ten­gan li­nks ro­to­s. Va a ser par­te de Niko­la pro­pia­men­te di­cho una vez que es­té más pu­li­do y doit so­por­te lis­tar los tar­ge­ts

Para probarlo, bajalo y ejecutálo desde el mismo lugar donde está tu conf.py, inmediatamente después de un doit.

import os
import urllib
from urlparse import urlparse

import lxml.html

def analyze(filename):
    try:
        # Use LXML to parse the HTML
        d = lxml.html.fromstring(open(filename).read())
        for l in d.iterlinks():
            # Get the target link
            target = l[0].attrib[l[1]]
            if target == "#":  # These are always valid
                continue
            parsed = urlparse(target)
            # We only handle relative links.
            # TODO: check if the URL points to inside the generated
            # site and check it anyway
            if parsed.scheme:
                continue
            # Ignore the fragment, since the link will still work
            # TODO: check that the fragment is valid
            if parsed.fragment:
                target = target.split('#')[0]
            # Calculate what file or folder this points to
            target_filename = os.path.abspath(
                os.path.join(os.path.dirname(filename), urllib.unquote(target)))
            # Check if it exists, or report it
            if not os.path.exists(target_filename):
                print "In %s broken link: " % filename, target
    except Exception as exc:
        # Something bad happened, report
        print "Error with:", filename, exc

# This is hackish: we use doit to get a list of all
# generated files. Minor modifications would let you check
# the non-generated files as well.

for task in os.popen('doit list --all', 'r').readlines():
    task = task.strip()
    if task.split(':')[0] in (
        'render_tags',
        'render_archive',
        'render_galleries',
        'render_indexes',
        'render_pages',
        'render_site') and '.html' in task:
            # It looks like a generated HTML file
            analyze(task.split(":")[-1])

Sobre Códigos de Conducta, Carteles y Modales.

-- Ta­to (mi hi­jo, a los 4 año­s)

Úl­ti­ma­men­te se ha ha­bla­do mu­cho so­bre có­di­gos de con­duc­ta en con­fe­ren­cia­s. No ten­go mu­chas res­pues­ta­s, pe­ro ten­go mu­chas pre­gun­tas en la ca­be­za, y al­gu­nas co­sas me ha­cen rui­do, así que quie­ro vol­car un po­co lo que ten­go aden­tro, y vea­mos si sur­ge al­go de cla­ri­da­d.

Lo prin­ci­pal pa­re­ce ser que es­tos có­di­gos de con­duc­ta pro­pues­tos apun­tan a ha­cer que los even­tos sean in­clu­si­vo­s, y más di­ver­so­s, y que gen­te que en el pa­sa­do no se sen­tía bien­ve­ni­da aho­ra lo sea. Que en­tre esa gen­te se cuen­te a las mu­je­res de­be­ría ser un lla­ma­do de aten­ció­n. ¿Mu­je­res? ¡Son la mi­tad del mun­do! Y apa­ren­te­men­te con in­ten­ción o no, las es­ta­mos ex­clu­yen­do.

En­ton­ce­s, en prin­ci­pio, si adop­tar un có­di­go de con­duc­ta ayu­da con eso, va­mos con eso. Lo mis­mo so­bre ga­ys, les­bia­na­s, tran­se­xua­le­s, etc. No son el 50% de la gen­te, pe­ro son ti­po el 10%, así que es un mon­tón de gen­te, y agre­gar­los a nues­tro gru­po es una op­ti­mi­za­ción fá­ci­l.

Sin em­bar­go, me preo­cu­pa un po­co que es­tos có­di­gos de con­duc­ta con­ten­gan len­gua­je co­mo és­te:

Aco­so in­clu­ye co­men­ta­rios ver­ba­les ofen­si­vos re­la­cio­na­dos con gé­ne­ro, orien­ta­ción se­xua­l, dis­ca­pa­ci­da­des, apa­rien­cia fí­si­ca, ta­ma­ño del cuer­po, ra­za, re­li­gió­n, imá­ge­nes se­xua­les en lu­ga­res pú­bli­co­s, inti­mi­da­ción de­li­be­ra­da, sta­lkin­g, se­gui­mien­to, fo­to­gra­fía o gra­ba­ción no au­to­ri­za­da o ina­pro­pia­da, in­te­rrup­ción sos­te­ni­da de char­las u otros even­to­s, con­tac­to fí­si­co ina­pro­pia­do, y aten­ción se­xual no bien­ve­ni­da.

Al­gu­nos son com­ple­ta­men­te ob­vio­s, gen­te que in­te­rrum­pe las char­las en las con­fe­ren­cias hay que echar­la, la inti­mi­da­ción es abo­mi­na­ble, el sta­lking es una ca­ga­da, etc. ¿Pe­ro "co­men­ta­rios ver­ba­les ofen­si­vos re­la­cio­na­dos con [to­do]"?

Y acá ten­go que ha­cer un des­vío y mos­trar­les un car­te­l. Cuan­do es­tu­ve en Lon­dres una co­sa que me lla­ma­ba la aten­ción eran los car­te­les en las ca­lle­s. Ejem­plo:

http://s0.i1.picplzthumbs.com/upload/img/9b/be/1e/9bbe1e8c53e414b0c1c652b6e8684586ddbe9d3e_400r.jpg

¿En otros paí­ses di­ría "No se per­mi­ten pe­rro­s", no?

¿Y por­qué son así? Es pro­ba­ble que sea por­que son gen­te muy muy muy edu­ca­da. Tam­bién por­que los car­te­les ofen­si­vos son cas­ti­ga­dos con pe­na de pri­sió­n.

Ten­go la in­fun­da­da sos­pe­cha de que pri­me­ro fue­ron edu­ca­do­s, y des­pués vino el de­re­cho a que na­die te ofen­da, que ter­mi­nó sien­do le­y, y aho­ra te­nés que ser edu­ca­do o si no vas a ve­r.

Soy un ateo bas­tan­te rui­do­so, pe­ro só­lo lo men­ciono afue­ra de es­te blog si otro men­cio­na su re­li­gión pri­me­ro. Por ejem­plo, si al­guien di­ce "me­nos ave­ri­gua dios y per­do­na", ca­paz que le di­go "e­so es por­que no exis­te", co­mo una bro­ma. De aho­ra en más ten­go que asu­mir que eso pue­de ser ofen­si­vo y no lo pue­do ha­ce­r. Y es­tá bien, pue­do vi­vir con eso, pue­do es­tar unas ho­ras sin ofen­der a na­die. Ha­ce mu­cho que no tra­to, pe­ro creo que pue­do.

Y en un even­to pri­va­do, co­mo es una con­fe­ren­cia, no hay una li­ber­tad inhe­ren­te de ex­pre­sió­n, por­que tie­nen de­re­cho de ad­mi­sión y me pue­den ra­jar cuan­do quie­ran sin ex­pli­ca­cio­nes, y es­toy de acuer­do con eso, por­que me re­ser­vo el de­re­cho de ra­jar gen­te de mi ca­sa.

Así que ok, de­ja­mos la re­li­gión afue­ra. No tie­ne lu­gar en una con­fe­ren­cia téc­ni­ca de to­dos mo­do­s, y co­mo pro­tes­ta voy a po­ner­me mi re­me­ra del uni­cor­nio ro­sa in­vi­si­ble (pa­re­ce una re­me­ra gris cue­llo en v).

Y no me jo­de no mo­les­tar gen­te por su gé­ne­ro o pre­fe­ren­cias se­xua­le­s. Soy lo bas­tan­te vie­jo y pa­jue­rano co­mo pa­ra que si dos ti­pos se dan un be­so al la­do mío, me mo­les­ta un po­co. Por suer­te soy lo bas­tan­te adul­to co­mo pa­ra de­cir­me a mí mis­mo "sos un vie­jo pa­jue­ra­no" y mi­rar pa­ra otro la­do. Des­pués de to­do, he vis­to gen­te a la que le mo­les­ta que be­se a mi es­po­sa en pú­bli­co, y ha­cer­lo me gus­ta, así que ca­da uno a be­sar a lo su­yo, y to­dos con­ten­to­s. Por otro la­do, a mí me gus­tan las mu­je­res, a mi es­po­sa le gus­to yo, así que pue­do en­ten­der ca­si cual­quier gus­to.

Por otro la­do, en­tien­do que la me­ra pre­sen­cia de al­guien pue­de ser ofen­si­vo pa­ra otro­s. Co­noz­co gen­te que pre­fie­re pa­sar dos ho­ras pa­ra­do que sen­tar­se al la­do de un tran­se­xua­l, o ba­jar­se del bon­di en cual­quier la­do an­tes que "so­por­tar­lo­". Y soy lo bas­tan­te vie­jo y pa­jue­rano que los en­tien­do. Así que ofen­der no es la co­sa, por­que ofen­der se ofen­de cual­quie­ra por cual­quier co­sa, si con so­lo es­tar ofen­dé­s, no quie­ro que no es­té­s. Lo que que­re­mos es que no se ofen­dan, o que se ofen­dan y se la aguan­ten ca­lla­do­s, o que se ofen­dan y no le im­por­te a na­die.

Y sí, in­vi­tar gen­te a en­fies­tar­se cuan­do te los cru­zás en los pa­si­llos es mu­cho (yo nun­ca in­vi­to a tríos an­tes de la cuar­ta ci­ta por­que es ma­la edu­ca­ció­n). Tra­tar de le­van­tar­se gen­te en un bar a la no­che no es tan gra­ve, a me­nos que mo­les­tes, en cu­yo ca­so es­pe­ro un cír­cu­lo pro­tec­tor de gen­te co­pa­da pa­ra que el de­su­bi­ca­do no arrui­ne su pro­pia no­che ni la del otro. Pe­ro bue­no, no sé, nun­ca en­ca­ré ni me en­ca­ra­ron en un ba­r, ex­cep­to otros ti­po­s, por­que ten­go esa suer­te.

Lo que que­re­mos es que sean edu­ca­do­s. Que­re­mos que se tra­ten to­dos bien los unos a los otro­s. Que­re­mos que to­dos sean tan edu­ca­dos co­mo pue­dan con la ma­yor canti­dad de gen­te que pue­dan. Es­pe­cial­men­te quie­ro que to­dos sean muy edu­ca­dos con la gen­te que peor les cai­ga. Por­que con la gen­te que te lle­vás bien, ca­paz que no im­por­ta.

Por otro la­do de­be ha­ber al­go acá que no es­toy vien­do, por­que es­to de la to­le­ran­cia y el res­pe­to no es lo mío, yo es­toy a fa­vor del pro­se­li­tis­mo, la fal­ta de res­pe­to, la mo­les­tia in­ge­nio­sa y po­ner in­có­mo­da a la gen­te. Pe­ro en ge­ne­ral tra­to de no ha­cer­lo per­so­nal­men­te, si no de ti­rar co­sas a la tri­bu­na y ver que pa­sa.

A mí me han fo­to­gra­fia­do sin pe­dir­me per­mi­so. ¡Me han es­ca­nea­do la re­me­ra sin pe­dir­me per­mi­so! (O­k, ad­mi­to que te­ner un có­di­go de ba­rras en la re­me­ra es un per­mi­so im­plí­ci­to­), me han pues­to nom­bres feo­s, pe­ro yo sé que co­mo di­jo un es­cri­to­r, es­toy ju­gan­do la vi­da en el ni­vel fá­ci­l, por­que soy un va­rón blan­co, re­la­ti­va­men­te sano, he­te­ro­se­xua­l, de cla­se me­dia pa­ra arri­ba con un buen la­bu­ro. No sé qué se sien­te ser ga­y, o atrac­ti­vo, o atrac­ti­vo a los ga­ys, ni na­da. No soy aco­sa­ble por­que la ca­ra me sal­va el cu­lo. Y sé que otros no tie­nen esa suer­te.

Así que si bien esa cla­se de có­di­gos me lle­na de du­da­s, y me ha­ce pen­sar en qúe cla­se de co­mu­ni­dad he es­ta­do mo­vién­do­me es­tos año­s, ig­no­ran­do to­das es­tas co­sas que aho­ra sa­len a la lu­z, lo voy a se­gui­r. Nun­ca los rom­pí in­ten­cio­nal­men­te an­tes (bue­no, una vez sa­qué una fo­to ina­pro­pia­da pe­ro fué un chis­te, la vió una so­la per­so­na, y la bo­rré, y me arre­pien­to, ¿o­k?).

Así que oja­lá en los pr­óxi­mos even­tos que va­ya ha­ya mu­cha gen­te que no co­noz­co. Oja­lá no ofen­da a na­die de for­ma irre­pa­ra­ble. Voy a tra­tar de ser tran­qui. Voy a ser abier­to e in­clu­si­vo. Voy a ser co­pa­do. Peor acor­dáte, si soy muy muy co­pa­do ca­paz que es por­que no te ban­co. De na­da.

Nikola 3.0.1 Available for Testing

Ver­sion 3.0.1 of Niko­la my stat­ic site gen­er­a­tor is ready for ini­tial us­er test­ing.

I have merged a bunch of patch­es from Kay Hayen and Kade­for:

  • dis­­qus_de­vel­op­er is gone

  • ad­dthis but­­tons are op­­tion­al (con­trolled by a new op­­tion)

  • You can have more than one stat­ic files fold­er to be merged in­­­to out­­put.

  • Im­age gal­­leries sup­­port up­­per­­case ex­ten­­sion­s.

  • Tem­­plates can not link to CSS that is em­p­­ty/mis­s­ing

  • Bet­ter Google Sitemaps

  • Pre­serve (some) meta­­da­­ta when copy­­ing files, like time­s­tamps

  • Don't over­write ex­ist­ing posts with doit new_­­post

  • Gen­er­ate valid URLs from uni­­code ti­­tles

So, if you want to try it out:

http­s://github.­com/ralsi­na/niko­la/zip­bal­l/3.0.1

I will make it a re­al re­lease if noth­ing bad shows up be­fore sun­day or mon­day.


Contents © 2000-2023 Roberto Alsina