Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre programming (publicaciones antiguas, página 67)

Quick hack: rss2epub -- hace lo que dice

Por ejem­plo, Aran­duka es­tá cer­ca de po­der sin­cro­ni­zar mi co­lec­ción de li­bros con my te­lé­fono. Pe­ro­... que pa­sa si lo que quie­ro leer en el tren no es un li­bro sino un blo­g?

Bue­no, los blogs te dan fee­d­s. Y un feed es una co­lec­ción de pe­da­zos de HT­ML pe­go­tea­dos en una es­truc­tu­ra más unos da­tos co­mo au­tor y co­sas así.

Y hay un mó­du­lo ex­ce­len­te pa­ra par­sear­lo­s, qu se lla­ma fee­dpar­se­r. Y yo no es­cri­bí uno, ni do­s, ni tres, sino cua­tro pro­gra­mas pa­ra leer RSS!

En­ton­ce­s, por­qué no con­ver­tir el feed en al­go que mi te­lé­fono pue­da di­ge­ri­r? [#] Es di­fí­ci­l?

Bue­no­... no mu­cho. Fue cues­tión de to­mar un do­cu­men­to ePub chi­qui­to de ejem­plo (ge­ne­ra­do con Ca­li­bre), es­cri­bir al­gu­nos tem­pla­tes, dar­le los da­tos de fee­dpar­se­r, y zi­pear to­do.

Por ejem­plo, es­te ar­chi­vo es es­te blog co­mo ePub y así se ve FBRea­der le­yén­do­lo.

Share photos on twitter with Twitpic

Co­mo siem­pre, el co­di­go es abier­to, y es­tá acá en el mer­cu­rial de aran­duka.

No es có­di­go in­te­re­san­te, y re­quie­re tem­pli­te fee­dpar­ser y quién sa­be que ma­s.

El ePub pro­du­ci­do no va­li­da, y pro­ba­ble­men­te nun­ca lo ha­ga, ya que tie­ne pe­da­zos de los fee­ds ori­gi­na­les aden­tro, por lo que la va­li­da­ción no de­pen­de de rss2e­pu­b.

Ade­más no te­nés imá­ge­nes. Eso im­pli­ca­ría par­sear y arre­glar to­dos los ele­men­tos img o al­go así y no ten­go ga­nas en es­te mo­men­to.

[#] Es­te fea­tu­re lo ví por pri­me­ra vez en plu­cker ha­ce aña­res, y sé que Ca­li­bre lo tie­ne.

eBooks y PyQt: una linda pareja

Pe­ro en­ton­ces pen­sé... se­rá di­fí­cil leer ePu­b? Bue­no, es re fá­ci­l!

Acá hay una ex­pli­ca­ción en sta­cko­ver­flo­w.­com <http://s­ta­cko­ver­flo­w.­co­m/­ques­tion­s/1388467/­rea­din­g-e­pu­b-­for­mat>`_ pe­ro la ver­sión cor­ta es... es un zip con XML aden­tro.

Uno de esos XML te di­ce adon­de es­tá ca­da co­sa, otro es el ín­di­ce, el res­to es una co­lec­ción de HT­M­L/­CSS/i­má­ge­nes.

En­ton­ce­s: es­tos son los in­gre­dien­tes pa­ra co­ci­nar­te un lec­tor ca­se­ro de ePub en 150 lí­nea­s:

  • Usá el mó­­­du­­lo zi­­pfi­­le pa­­ra no ex­­pan­­dir el zip (e­­so es be­­­rre­­ta)

  • Usá Ele­­ment Tree pa­­ra pa­r­­sear el XM­­L.

  • Usá QtWe­­bkit de Py­­Qt pa­­ra mo­s­­trar esa co­­­le­c­­ción de XM­­L/­­CSS/I­­ma­­ges

  • Usá es­­ta re­­ce­­ta pa­­ra que QtWe­­bkit te avi­­se que quie­­re al­­go del zi­­p.

En­chu­fá una co­sa con otra, sa­cu­dí, y ter­mi­nás con es­to:

Share photos on twitter with Twitpic

Acá es­tá el có­di­go (has­ta aho­ra) <http://­co­de.­google.­co­m/­p/a­ran­duka/­sour­ce/­bro­wse/sr­c/e­pub­viewe­r.­p­y?­r=1­d5­df32­bf717651e5e­d5­d1­d22012666ee06­d63a2>`_ y el ar­chi­vo UI fi­le que ne­ce­si­tás.

Que le fal­ta:

  • No mues­­tra la ta­­pa.

  • Só­­­lo mues­­tra el pri­­mer ni­­vel del ín­­di­­ce.

  • Só­­­lo lo pro­­­bé en dos li­­bros ;-)

  • Ne­­ce­­si­­ta re­­fa­c­­to­­­ri­­zar a mo­­­ri­­r.

Nin­gu­na de esas co­sas es te­rri­ble­men­te di­fí­cil de ha­ce­r!

Presentando Aranduka

Y... es­te no lo es­toy ha­cien­do so­lo, lo que lo ha­ce más di­ver­ti­do.

Es un ad­mi­nis­tra­dor de eBooks (o de li­bros en ge­ne­ra­l?) que te ayu­da a te­ner tus PDF/­Mo­bi/­FB2/­lo­que­sea or­ga­ni­za­do­s, y de­be­ría even­tual­men­te sin­cro­ni­zar­los con el dis­po­si­ti­vo que que­rés usar pa­ra leer­lo­s.

¿Qué fun­cio­na? ¡Mi­rá el vi­deo!

Por si eso no tie­ne sen­ti­do pa­ra vo­s:

  • Po­­­dés ba­­jar li­­bros de Fee­­dBooks. Esos li­­bros se des­­ca­r­­gan, se agre­­gan a la ba­­se de da­­to­­s, se eti­­que­­tan, se ba­­ja la ta­­pa, etc. etc.

  • Po­­­dés im­­po­r­­tar tu ca­r­­pe­­ta ac­­tual de li­­bros en bu­l­­to

    Aran­­duka usa google y otros se­r­­vi­­cios pa­­ra tra­­tar de adi­­vi­­nar (por los no­m­­bres) qué li­­bro es ese y lle­­nar los da­­tos ex­­tra.

  • Po­­­dés "a­­di­­vi­­na­­r" esos da­­tos ex­­tra

    Ma­r­­can­­do co­­­mo co­n­­fia­­bles al­­gu­­nos da­­tos (por eje­m­­plo, el tí­­tu­­lo) Aran­­duka bus­­ca can­­di­­da­­tos que coi­n­­ci­­dan y ele­­gís el co­­­rre­c­­to.

    Por su­­pues­­to que ta­m­­bién se pue­­de edi­­tar los da­­tos ma­­nua­l­­men­­te.

Y eso es to­do por aho­ra. Fea­tu­res pla­nea­do­s:

  • Mu­­chos co­­­mo pa­­ra ha­­cer una lis­­ta.

La me­ta es cla­ra:

  • De­­be ser he­r­­mo­­­so (y no lo es)

  • De­­be ser po­­­ten­­te (y to­­­da­­vía no)

  • De­­be ser me­­jor que la "co­m­­pe­­ten­­cia"

Si no se lo­gran esas tres me­ta­s, es un fra­ca­so. Tal vez sea un fra­ca­so di­ver­ti­do, pe­ro igual es fra­ca­sar.

Diálogo de progreso muy pythónico

Este es un ejemplo que te muestra suficiente para usar progressbar:

progress = ProgressBar()
for i in progress(range(80)):
    time.sleep(0.01)

Sí, eso es to­do, te­nés una lin­da ba­rra de pro­gre­so AS­CII que cru­za la ter­mi­na­l, so­por­ta que la cam­bies de ta­ma­ño y se mue­ve mien­tras ite­rás de 0 a 79.

El módulo progressbar incluso tiene cosas mejores como ETA o velocidades de transferencia, y todo es así de fácil.

¿E­se có­di­go­... no es­tá bue­no? ¿Que­rés una ba­rra de pro­gre­so pa­ra ese lo­op? ¡Lo "en­vol­vé­s" y lis­to! Y por su­pues­to, co­mo yo pro­gra­mo con Py­Q­t, quie­ro que Py­Qt ten­ga al­go igual de bue­no.

Así se ve el re­sul­ta­do:

progress

Es­to lo po­dés ha­cer con cual­quier toolki­t, y pro­ba­ble­men­te de­be­ría­s. Tie­ne un fea­tu­re ex­tra: po­dés in­te­rrum­pir la ite­ra­ció­n, y es­te es el (po­co) có­di­go:

# -*- coding: utf-8 -*-
import sys, time
from PyQt4 import QtCore, QtGui

def progress(data, *args):
    it=iter(data)
    widget = QtGui.QProgressDialog(*args+(0,it.__length_hint__()))
    c=0
    for v in it:
        QtCore.QCoreApplication.instance().processEvents()
        if widget.wasCanceled():
            raise StopIteration
        c+=1
        widget.setValue(c)
        yield(v)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    # Do something slow
    for x in progress(xrange(50),"Show Progress", "Stop the madness!"):
        time.sleep(.2)

Di­viér­tan­se!

Salió el primer número de PET en inglés!


He­ll yeah! It has been a lot of wo­rk but it's out at http://­re­vis­ta.­p­y­tho­n.or­g.ar

So­me arti­cle­s:

  • PyA­­r, The His­­to­­­ry

  • from gc im­­port co­­­m­­mo­n­sen­­se - Fi­­nish Hi­­m!

  • Pai­n­­le­ss Co­n­­cu­­rren­­c­­y: The mu­l­­ti­­pro­­­ce­s­­sing Mo­­­du­­le

  • In­­tro­­­du­c­­tion to Unit Tes­­ting wi­­th Py­­thon

  • Taint Mo­­­de in Py­­thon

  • Applied Dy­­na­­mism

  • De­­co­­­ra­­ting co­­­de (Part 1)

  • We­­b2­­Py for Eve­­r­­y­­body

It's avai­la­ble in pre­tty mu­ch eve­ry for­mat an­yo­ne can rea­d, and if your fa­vou­ri­te is not the­re, we wi­ll make it for you or may I be smo­te by the fl­ying spa­ghe­tti mons­te­r's nood­ly appen­da­ge!

AFAIK the­re is no other Py­thon ma­ga­zi­ne being pu­blis­hed (feel free to co­rrect me), so it's kind of a big thing for us in PyAr (the Ar­gen­ti­na Py­thon co­m­mu­ni­ty) that we are doing one, and in two lan­gua­ges.

But why stop he­re? Want it to be avai­la­ble in your lan­gua­ge? Con­tact us at re­vis­ta­p­ya­r@­ne­t­ma­na­ger­s.­co­m.ar it may be doa­ble!

And of cour­se, ve­ry soon the­re wi­ll be a ca­ll for arti­cles for Is­sue 2, and trust me: that one's going to be epic: this one was just a war­mu­p.


Contents © 2000-2023 Roberto Alsina