Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

rst2pdf 0.14 released!

It's my plea­sure to an­nounce that I just up­load­ed rst2pdf 0.14 to the site at http://rst2pdf.­google­code.­com.

Rst2pdf is a pro­gram and a li­brary to con­vert re­struc­tured text di­rect­ly in­to PDF us­ing Re­port­lab.

It sup­ports True Type and Type 1 font em­bed­ding, most raster and vec­tor im­age for­mat­s, source code high­light­ing, ar­bi­trary text frames in a page, cas­cad­ing stylesheet­s, the full re­struc­tured text syn­tax and much, much more.

It al­so in­cludes a sphinx ex­ten­sion so you can use it to gen­er­ate PDFs from doc­u­ments built with Sphinx.

In case of prob­lem­s, please re­port them in the Is­sue track­er (http://­code.­google.­com/p/rst2pdf/is­sues/list) or the mail­ing list (http://­group­s.­google.­com/­group/rst2pdf-dis­cuss)

This re­lease fix­es sev­er­al bugs and adds some mi­nor fea­tures com­pared to 0.13.2. Here are some of the changes:

  • Fixed Is­­sue 197: Ta­ble bor­ders were con­­fus­ing.

  • Fixed Is­­sue 297: styles from de­­fault­­.j­­son leaked on­­to oth­­er syn­­tax high­­­light­ing stylesheet­s.

  • Fixed Is­­sue 295: key­­word re­­place­­ment in head­­er­s/­­foot­ers did­n't work if ###­­Page### and oth­­ers was in­­­side a ta­ble.

  • New fea­­ture: odd­­e­ven di­rec­­tive to dis­­­play al­ter­­na­­tive con­­tent on odd­­/even pages (good for head­­er­s/­­foot­er­s!)

  • Switched all stylesheets to more read­­able RSON for­­mat.

  • Fixed Is­­sue 294: Im­ages were de­­formed when on­­ly height was spec­i­­fied.

  • Fixed Is­­sue 293: Ac­­cept left­­/­­cen­ter/right as align­­ments in stylesheet­s.

  • Fixed Is­­sue 292: sep­a­rate style for line num­bers in code­blocks

  • Fixed Is­­sue 291: sup­­port class di­rec­­tive for code­blocks

  • Fixed Is­­sue 104: to­­tal num­ber of pages in head­­er/­­foot­er works in all cas­es now.

  • Fixed Is­­sue 168: linenos and linenothresh­old op­­tions in Sphinx now work cor­rec­t­­ly.

  • Fixed re­­gres­­sion in 0.12 (in­ter­ac­­tion be­tween rst2pdf and sphinx math)

  • Doc­u­­men­t­ed ex­ten­­sions in the man­u­al

  • Bet­ter styling of bul­let­s/items (Is­­sue 289)

  • Fixed Is­­sue 290: don't fail on bro­ken im­ages

  • Bet­ter font find­­ing in win­­dows (patch by tech­­tonik, Is­­sue 282).

  • Fixed Is­­sue 166: Im­­ple­­men­t­ed Sphinx's hlist (hor­i­­zon­­tal list­s)

  • Fixed Is­­sue 284: Im­­ple­­men­t­ed pro­­duc­­tion lists for sphinx

  • Fixed Is­­sue 165: De­f­i­ni­­tion lists not prop­er­­ly in­­­den­t­ed in­­­side ad­­mo­ni­­tions or ta­bles.

  • SVG Im­ages work in­­­line when us­ing the inkscape ex­ten­­sion.

  • Fixed Is­­sue 268: TOCs shift­ed to the left on RL 2.4

  • Fixed Is­­sue 281: sphinx test au­­to­­ma­­tion was bro­ken

  • Fixed Is­­sue 280: wrong page tem­­plates used in sphinx

En­joy!

Si lo vamos a hacer, vamos a hacerlo bien!

Acá es­tá el th­read.

Es la­aaar­go, pe­ro bue­no, re­sul­ta­do fi­na­l, co­mo soy un ner­d, soy un pro­gra­ma­do­r, y los pro­gra­ma­do­res pro­gra­man hi­ce el pro­gra­ma.

Lo que me sor­pren­dió fué que ape­nas lo em­pe­cé a ha­ce­r, es­te pro­gra­ma com­ple­ta­men­te des­car­ta­ble, que no sir­ve pa­ra na­da... es­tu­ve re pro­li­jo.

  • Usé do­c­­trings.

  • Usé do­c­­tes­­ts.

  • Lo hi­­ce con cui­­da­­do con el uni­­co­­­de.

  • Los co­­­men­­ta­­rios son ade­­cua­­dos

  • La fa­c­­to­­­ri­­za­­ción en fun­­cio­­­nes es­­tá bien he­­cha

Ha­ce ape­nas un año no hu­bie­ra he­cho to­do eso. Me pa­re­ce que es­toy ter­mi­nan­do una eta­pa en mi (len­ta, a los tro­pe­zo­nes) evo­lu­ción co­mo pro­gra­ma­do­r, y es­toy pro­gra­man­do me­jor que lo que ve­nía ha­cien­do.

Me pa­sa­ba mu­cho que co­mo py­thon te de­ja ha­cer las co­sas rá­pi­do, las ha­cía rá­pi­do y ma­l, o len­to y bien. Aho­ra las ha­go rá­pi­do y (creo) bien, o por lo me­nos me­jo­r, o al me­nos me­nos peo­r.

De pa­so: és­te es un ex­ce­len­te ejer­ci­cio pa­ra pro­gra­ma­do­res "ju­nio­r"!

  • In­­vo­­­lu­­cra ma­­ne­­jo de strings que pue­­de (o no) re­­so­l­­ve­r­­se con re­­gexps

  • Usar tes­­ts ha­­ce las co­­sas más fá­­ci­­les en vez de más di­­fí­­ci­­les

  • Te ha­­ce "pen­sar en uni­­co­­­de"

  • El al­­go­­­ri­t­­mo en sí no es di­­fí­­ci­­l, pe­­ro es al­­go tra­m­­po­­­so

De pa­so, acá es­tá el (tal vez pa­vo­ta­men­te so­brees­tu­dia­do) pro­gra­ma en cues­tió­n, ga­so­.­py:

# -*- coding: utf-8 -*-

"""
Éste es el módulo gasó.

Éste módulo provee la función gasear. Por ejemplo:

>>> gasear(u'rosarino')
u'rosarigasino'
"""

import unicodedata
import re

def gas(letra):
    '''dada una letra X devuelve XgasX
    excepto si X es una vocal acentuada, en cuyo caso devuelve
    la primera X sin acento

    >>> gas(u'a')
    u'agasa'

    >>> gas (u'\xf3')
    u'ogas\\xf3'

    '''
    return u'%sgas%s'%(unicodedata.normalize('NFKD', letra).encode('ASCII', 'ignore'), letra)

def umuda(palabra):
    '''
    Si una palabra no tiene "!":
        Reemplaza las u mudas de la palabra por !

    Si la palabra tiene "!":
        Reemplaza las "!" por u

    >>> umuda (u'queso')
    u'q!eso'

    >>> umuda (u'q!eso')
    u'queso'

    >>> umuda (u'cuis')
    u'cuis'

    '''

    if '!' in palabra:
        return palabra.replace('!', 'u')
    if re.search('([qg])u([ei])', palabra):
        return re.sub('([qg])u([ei])', u'\\1!\\2', palabra)
    return palabra

def es_diptongo(par):
    '''Dado un par de letras te dice si es un diptongo o no

    >>> es_diptongo(u'ui')
    True

    >>> es_diptongo(u'pa')
    False

    >>> es_diptongo(u'ae')
    False

    >>> es_diptongo(u'ai')
    True

    >>> es_diptongo(u'a')
    False

    >>> es_diptongo(u'cuis')
    False

    '''

    if len(par) != 2:
        return False

    if (par[0] in 'aeiou' and par[1] in 'iu') or \
    (par[1] in 'aeiou' and par[0] in 'iu'):
        return True
    return False

def elegir_tonica(par):
    '''Dado un par de vocales que forman diptongo, decidir cual de las
    dos es la tónica.

    >>> elegir_tonica(u'ai')
    0

    >>> elegir_tonica(u'ui')
    1
    '''
    if par[0] in 'aeo':
        return 0
    return 1

def gasear(palabra):
    """
    Convierte una palabra de castellano a rosarigasino.

    >>> gasear(u'rosarino')
    u'rosarigasino'

    >>> gasear(u'pas\xe1')
    u'pasagas\\xe1'

    Los diptongos son un problema a veces:

    >>> gasear(u'cuis')
    u'cuigasis'

    >>> gasear(u'caigo')
    u'cagasaigo'


    Los adverbios son especiales para el castellano pero no
    para el rosarino!

    >>> gasear(u'especialmente')
    u'especialmegasente'

    """
    #from pudb import set_trace; set_trace()

    # Primero el caso obvio: acentos.
    # Lo resolvemos con una regexp

    if re.search(u'[\xe1\xe9\xed\xf3\xfa]',palabra):
        return re.sub(u'([\xe1\xe9\xed\xf3\xfa])',lambda x: gas(x.group(0)),palabra,1)


    # Siguiente problema: u muda
    # Reemplazamos gui gue qui que por g!i g!e q!i q!e
    # y lo deshacemos antes de salir
    palabra=umuda(palabra)

    # Que hacemos? Vemos en qué termina

    if palabra[-1] in 'nsaeiou':
        # Palabra grave, acento en la penúltima vocal
        # Posición de la penúltima vocal:
        pos=list(re.finditer('[aeiou]',palabra))[-2].start()
    else:
        # Palabra aguda, acento en la última vocal
        # Posición de la última vocal:
        pos=list(re.finditer('[aeiou]',palabra))[-1].start()

    # Pero que pasa si esa vocal es parte de un diptongo?

    if es_diptongo(palabra[pos-1:pos+1]):
        pos += elegir_tonica(palabra[pos-1:pos+1])-1
    elif es_diptongo(palabra[pos:pos+2]):
        pos += elegir_tonica(palabra[pos:pos+2])


    return umuda(palabra[:pos]+gas(palabra[pos])+palabra[pos+1:])

if __name__ == "__main__":
    import doctest
    doctest.testmod()

rst2pdf 0.13 released!

I've just up­load­ed the 0.13 ver­sion of rst2pdf, a tool to con­vert re­Struc­tured text to PDF us­ing Re­port­lab to http://rst2pdf.­google­code.­com

rst2pdf sup­ports the full reSt syn­tax, works as a sphinx ex­ten­sion, and has many ex­tras like lim­it­ed sup­port for TeX-­less math, SVG im­ages, em­bed­ding frag­ments from PDF doc­u­ments, True Type font em­bed­ding, and much more.

This is a ma­jor ver­sion, and has lots of im­prove­ments over 0.12.3, in­clud­ing but not lim­it­ed to:

  • New TOC code (sup­­ports dots be­tween ti­­tle and page num­ber)

  • New ex­ten­­sion frame­­work

  • New pre­pro­ces­­sor ex­ten­­sion

  • New vec­­tor­pdf ex­ten­­sion

  • Sup­­port for nest­ed stylesheets

  • New head­­er­Sep­a­ra­­tor/­­foot­erSep­a­ra­­tor stylesheet op­­tions

  • Fore­­ground im­age sup­­port (use­­ful for wa­ter­­mark­s)

  • Sup­­port tran­s­­paren­­cy (al­pha chan­nel) when spec­i­­fy­ing col­ors

  • Inkscape ex­ten­­sion for much bet­ter SVG sup­­port

  • Abil­i­­ty to show to­­tal page count in head­­er/­­foot­er

  • New RSON for­­mat for stylesheets (J­­SON su­per­set)

  • Fixed Is­­sue 267: Sup­­port :align: in fig­ures

  • Fixed Is­­sue 174 re­­gres­­sion (In­­den­t­ed lines in line block­­s)

  • Fixed Is­­sue 276: Load stylesheets from strings

  • Fixed Is­­sue 275: Ex­­tra space be­­fore lineblocks

  • Fixed Is­­sue 262: Full sup­­port for Re­­port­lab 2.4

  • Fixed Is­­sue 264: Split­t­ing er­ror in some doc­u­­ments

  • Fixed Is­­sue 261: As­sert er­ror with wor­­daxe

  • Fixed Is­­sue 251: added sup­­port for rst2pdf ex­ten­­sions when us­ing sphinx

  • Fixed Is­­sue 256: ug­­ly crash when us­ing SVG im­ages with­­out SVG sup­­port

  • Fixed Is­­sue 257: sup­­port aafig­ure when us­ing sphinx/pdf­builder

  • In­i­­tial sup­­port for graphviz ex­ten­­sion in pdf­builder

  • Fixed Is­­sue 249: Im­ages dis­­­tort­ed when speci­­fiy­ing width and height

  • Fixed Is­­sue 252: math di­rec­­tive con­flic­t­ed with sphinx

  • Fixed Is­­sue 224: Ta­bles can be left­­/­­cen­ter/right aligned in the page.

  • Fixed Is­­sue 243: Wrong spac­ing for sec­ond para­­graphs in bul­let list­s.

  • Big refac­­tor­ing of the code.

  • Sup­­port for Python 2.4

  • Ful­­ly re­­worked test suit­­e, con­t­in­u­ous in­­te­­gra­­tion site.

  • Op­­tion­al­­ly use SWFtools for PDF im­ages

  • Fixed Is­­sue 231 (S­­marter TTF au­­toem­bed)

  • Fixed Is­­sue 232 (HTML tags in ti­­tle meta­­data)

  • Fixed Is­­sue 247 (print­­ing stylesheet)

Cómo encontrar un programador que sepa programar.

¿Ya te asus­tas­te? No lo ha­ga­s, el pro­ble­ma es el pro­ce­so de con­tra­ta­ció­n.

Sí, hay mon­to­nes de per­so­nas que se pre­sen­tan pa­ra tra­ba­jos de pro­gra­ma­dor y no sa­ben pro­gra­ma­r. Eso es nor­ma­l.

Es­tá re­la­cio­na­do con una co­sa que es­cri­bió Joel Spol­sky (ex­tra­ña­men­te, so­cio de Atwood en sta­cko­ver­flo­w.­com).

Su­po­né­te que que­rés con­tra­tar a al­guien en el top 1% de los pro­gra­ma­do­res.

Te­nés 100 pos­tu­lan­tes, de ellos 99 no pue­den pro­gra­ma­r. 1 pue­de, y lo con­tra­tá­s.

Des­pués la em­pre­sa de al la­do ne­ce­si­ta lo mis­mo. Tie­nen 100 pos­tu­lan­tes, 99 no pue­den pro­gra­ma­r... ¡y 80 son los mis­mos que la otra com­pa­ñía re­cha­zó!

Así que no, con­tra­tar al me­jor de 100 no es la ma­ne­ra de te­ner un pro­gra­ma­dor "top 1%", es sim­ple­men­te tu in­tui­ción es­ta­dís­ti­ca que te ha­ce equi­vo­ca­r.

No que­rés con­tra­tar a al­guien en el top 1% de los pos­tu­lan­tes, que­rés uno en el top 1% de pro­gra­ma­do­res. Di­fe­ren­tes uni­ver­so­s.

Es­tas dos co­sas son los dos la­dos de la mis­ma mo­ne­da. 99% de los pos­tu­lan­tes son inú­ti­le­s, por eso son pos­tu­lan­tes, por­que no pue­den con­se­guir tra­ba­jo y no tie­nen tra­ba­jo por­que son inú­ti­les co­mo pro­gra­ma­do­res.

Juz­gar a los pro­gra­ma­do­res por el stan­dard de los pos­tu­lan­tes que se pre­sen­tan es co­mo juz­gar la ca­li­dad de un res­tau­ran­te la­mien­do su ta­cho de ba­su­ra.

Aho­ra, ha­bien­do en­ten­di­do es­to, ¿có­mo se en­cuen­tra un pro­gra­ma­dor que pue­da pro­gra­ma­r?

¡Fá­ci­l! ¡Bus­cás uno que ten­ga pro­gra­mas pa­ra mos­trar­te!

Nun­ca con­tra­ta­ría a un pro­gra­ma­dor que no me pue­da mos­trar có­di­go. Tie­ne que te­ner un pro­ble­ma por­que los pro­gra­ma­do­res pro­gra­man.

Es lo que ha­ce­mo­s. ¿Si no lo ha­ce­mos que so­mo­s? ¿Teó­ri­co­s?

Vea­mos al­gu­nas ob­je­cio­nes ob­via­s:

  1. Pro­­­gra­­mó pa­­ra su tra­­ba­­jo an­­te­­rior y no lo pue­­de mo­s­­tra­­r.

    Ok, lohi­­zo. ¿Qué más es­­cri­­bió? ¿A­l­­go open sou­r­­ce? ¿fra­g­­men­­tos en un blo­­­g? ¿Res­­pues­­tas en sta­­cko­­­ve­r­­flo­­w?

    ¿Na­­da? ¿No es­­cri­­bió na­­da sin co­­­bra­­r? No es el que quie­­ro. Si só­­­lo pro­­­gra­­ma por di­­ne­­ro no tie­­ne pa­­sión por la pro­­­gra­­ma­­ció­­n, o no lo dis­­fru­­ta. Pro­­­ba­­ble­­men­­te no es muy bue­­no ta­m­­po­­­co.

  2. Es­­tá te­r­­mi­­nan­­do la uni­­ve­r­­si­­da­­d, to­­­da­­vía no es­­cri­­bió mu­­cho.

    ¿Po­r­­qué? ¿Qué es­­tá es­­pe­­ran­­do? ¿Qué lo de­­tie­­ne? Lle­­va años es­­tu­­dian­­do co­­­mo pro­­­gra­­ma­­r! ¿Qué hi­­zo con el co­­­no­­­ci­­mien­­to que fué ad­­qui­­rien­­do? ¿Lo gua­r­­da pa­­ra cuan­­do cu­m­­pla 25? ¿No pra­c­­ti­­có su ar­­te? No es el pro­­­gra­­ma­­dor que bus­­ca­­mo­­s.

Pe­ro con­se­guir al­guien que te mues­tre có­di­go no es su­fi­cien­te por su­pues­to. Tam­bién tie­ne que ser buen có­di­go, si es­tás se­ria­men­te tra­tan­do de con­tra­tar pro­gra­ma­do­res ex­ce­len­tes.

Así que aquí hay unos cri­te­rios ex­tra:

  1. Fi­­já­­te en qué len­­guakes pro­­­gra­­ma. Si pro­­­gra­­ma CO­­­BOL por gus­­to pue­­de o no ser lo que ne­­ce­­si­­tá­s.

  2. Open sou­r­­ce == bo­­­nus poi­n­­ts: quie­­re de­­cir que no lo ave­r­­güen­­za su có­­­di­­go, y ha­­ce que sus cre­­den­­cia­­les sean tri­­via­­les de ve­­ri­­fi­­ca­­r.

  3. Si es el lí­­der de un pro­­­ye­c­­to con múl­­ti­­ples co­­­la­­bo­­­ra­­do­­­res y lo ha­­ce bien, es­­tá a mi­­tad de ca­­mino de ser un pro­­­gra­­ma­­do­­­r/­­ma­­na­­ge­­r, mu­­chos bo­­­nus poi­n­­ts!

  4. Pro­­­ye­c­­tos con un his­­to­­­rial de co­­­m­­mi­­ts la­r­­go mues­­tran res­­po­n­s­a­­bi­­li­­dad y cri­­te­­rio.

  5. Lis­­tas de co­­­rreo de de­s­a­­rro­­­llo te pe­r­­mi­­ten es­­ti­­mar su pe­r­­so­­­na­­li­­da­­d. ¿Es irri­­tan­­te? ¿Es sen­­si­­ble? ¿Es mo­­­le­s­­to?

Y des­pués es­tá lo ob­vio, re­fe­ren­cia­s, en­tre­vis­ta­s, ejer­ci­cio­s, pe­ro esos son fil­tros se­cun­da­rio­s, lo im­por­tan­te es que pue­da pro­gra­mar, y mos­trar­te su có­di­go es la for­ma de ha­cer­lo.


Contents © 2000-2024 Roberto Alsina