Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Clavando un clavo con un zapato I: Do-Sheet.

  1. Te ha­­ce pen­sar di­­fe­­ren­­te.

  2. Es di­­ve­r­­ti­­do.

Lo ma­lo es, por su­pues­to, que el con­te­ni­do de la char­la tie­ne que ser se­cre­to, o no tie­ne nin­gu­na gra­cia. Co­mo el pro­ce­so de re­view pa­ra char­las de Py­Co­nAr es pú­bli­co, no te­nía ma­ne­ra de ex­pli­car de qué se tra­ta­ba.

Co­mo eso sig­ni­fi­ca que pon­go a los re­vi­so­res en el com­pro­mi­so de te­ner que acep­tar mi pa­la­bra de que es­ta char­la es al­go in­te­re­san­te, y eso es injus­to pa­ra ellos y los de­más char­la­ri­nes, can­ce­lé la pro­pues­ta.

La (tal ve­z) bue­na no­ti­cia es que aho­ra to­dos van a po­der ver de qué se tra­ta­ba la char­la. Acá es­tá el cla­vo nú­me­ro 1: Es­cri­bir una ho­ja de cál­cu­lo usan­do doi­t.

Es­ta no es mi pri­me­ra "ho­ja de cál­cu­lo­". To­do em­pe­zó ha­ce mu­cho, mu­cho tiem­po con una fa­mo­sa re­ce­ta de Ra­y­mond He­ttin­ger que he usa­do una y otra y otra vez (ca­paz que fal­ta al­gu­na).

Da­do que ven­go usan­do doit pa­ra Niko­la es­toy im­pre­sio­na­do con lo po­ten­te que es. En bre­ve, doit te per­mi­te crear ta­rea­s, y esas ta­reas de­pen­den de otra­s, ope­ran en da­to­s, dan re­sul­ta­dos que otras ta­reas usan, etc.

¿Se ve adon­de va es­to?

Acá va el có­di­go, con ex­pli­ca­cio­nes:

cells es nuestra hoja. Podés poner cualquier cosa, pero usá siempre el formato "nombre=formula" y la fórmula tiene que ser Python válido ¿ok?

from tokenize import generate_tokens

cells = ["A1=A3+A2", "A2=2", "A3=4"]
values = {}

task_calculate crea una tarea para cada celda, llamada calculate:NOMBRE. La acción que esa tarea realiza es evaluar la fórmula. Pero para hacer eso de manera exitosa, necesitamos saber qué otras celdas hay que evaluar primero.

Eso lo im­ple­men­té usan­do las cal­cu­lated de­pen­den­cies de doi­t, con la ta­rea "ge­t_­de­p:­FOR­MU­LA" pa­ra la fór­mu­la de es­ta cel­da.

def evaluate(name, formula):
    value = eval(formula, values)
    values[name] = value
    print "%s = %s" % (name, value)

def task_calculate():
    for cell in cells:
        name, formula = cell.split('=')
        yield {
            'name':name,
            'calc_dep': ['get_dep:%s' % formula],
            'actions': [(evaluate, (name, formula))],
            }

Por ejemplo, nuestra A1 depende de A3 y A2 que no dependen de nada. Para parsear esto, usé el módulo tokenize, y tomo nota de cuales cosas son "nombres". Existen maneras más soisticadas ;-)

la función task_get_dep es una tarea de doit que crea tareas llamadas "get_dep:NOMBRE" para cada nombre de celda en cells.

A su vez, get_dep devuelve una lista de tareas de doit. Para nuestra celda A1, eso sería ["calculate:A2", "calculate:A3"] o sea que para poder calcular A1 primero tenemos que terminar esas tareas.

def get_dep(formula):
    """Given a formula, return the names of the cells referenced."""
    deps = {}
    try:
        for token in generate_tokens([formula].pop):
            if token[0] == 1:  # A variable
                deps[token[1]] = None
    except IndexError:
        # It's ok
        pass
    return {
        'result_dep': ['calculate:%s' % key for key in deps.keys()]
        }

def task_get_dep():
    for cell in cells:
        name, formula = cell.split('=')
        yield {
            'name': formula,
            'actions': [(get_dep, (formula,))],
            }

Y eso es todo. Veámoslo en acción. Podés obtener tu propia copia acá y probarlo instalando doit, editando cells y usándolo así:

ralsina@perdido:~/dosheet$ doit -v2 calculate:A3
.  get_dep:4
{}
.  calculate:A3
A3 = 4
ralsina@perdido:~/dosheet$ doit -v2 calculate:A2
.  get_dep:2
{}
.  calculate:A2
A2 = 2
ralsina@perdido:~/dosheet$ doit -v2 calculate:A1
.  get_dep:A3+A2
{'A3': None, 'A2': None}
.  get_dep:4
{}
.  calculate:A3
A3 = 4
.  get_dep:2
{}
.  calculate:A2
A2 = 2
.  calculate:A1
A1 = 6

Co­mo po­dés ve­r, siem­pre ha­ce el mí­ni­mo es­fuer­zo po­si­ble pa­ra cal­cu­lar el re­sul­ta­do de­sea­do. Si que­ré­s, hay al­gu­nas co­sas me­jo­ra­ble­s, que de­jo co­mo ejer­ci­cio pa­ra el lec­to­r. Por ejem­plo:

  1. Usar up­­to­­­da­­te pa­­ra no re­­ca­l­­cu­­lar de­­pen­­den­­cias inu­­ti­l­­men­­te.

  2. Eli­mi­nar la va­ria­ble glo­bal va­lues y usar los com­puted va­lues de doit en su lu­ga­r.

Acá es­tá el lis­ta­do com­ple­to, buen pro­ve­cho!

The Coldest War (The Milkweed Triptych, #2)

Cover for The Coldest War (The Milkweed Triptych, #2)

Review:

This tril­o­gy is a tricky read. Most char­ac­ters just suf­fer through hor­ri­ble things.

Al­so, the way the or­a­cle's pow­er works is fair­ly ob­vi­ous, and there are (a­gain) ob­vi­ous coun­ter­mea­sures that could have been tak­en by the oth­er par­ties in or­der to ren­der her
pow­er use­less (ex­am­ple: killing her).

On the oth­er hand, it de­scribes a world that feels as if it ex­ists or ex­ist­ed, which is some­thing I re­al­ly like in sci­ence fic­tion.

Apple uses skeuomorphism, but it's not because they are idiots.


Eve­ry day the­re is a new post de­cr­ying Apple's tas­te­le­ss use of skeuo­mor­phism (you kno­w, making cal­cu­la­tor pro­gra­ms look like cal­cu­la­tors and no­te-­taking apps look like note­pa­d­s?).

I to­ta­lly agree that skeuo­mor­phic apps are ugly and stu­pi­d. I said that in 2-­thou­san­d-­freakin­g-­four. But just looking at the la­test abo­mi­na­tion (it see­ms to be a sound re­cor­der that looks like a ree-­to­-­ree­l, of all things) and snee­ring is wor­se, be­cau­se that means you do­n't ha­ve any ideas of whe­re de­sign co­mes fro­m, and I say this being a per­son wi­th as mu­ch tas­te as a wa­l­rus.

De­sign co­mes from peo­ple. The­re is a gran­der de­sign be­hind that spe­ci­fic de­sig­n, whi­ch you could ca­ll a gui­de­li­ne, or a phi­lo­so­ph­y, or in so­me ca­ses a zei­tgeis­t. For 50 year­s, the­re has exis­ted a con­sen­sus about clean­li­ness of de­sign being a good thin­g. It started in so­me spe­ci­fic ni­ches whi­le others went in other di­rec­tions (car fin­s!) and la­ter ea­ch area of de­sign has mo­ve­d, like a pen­du­lu­m, to­war­ds clean­li­ness or "s­pe­cial­ness".

On­ce you go "clean", and eve­r­yo­ne goes "clean" the­re is ve­ry li­ttle you can do to make your pro­duct dis­tinc­ti­ve, and a ten­sion is created to make it le­ss clean and mo­re "s­pe­cia­l".

Google's en­try pa­ge us­ed to be ab­so­lu­te­ly clean. A pla­ce to en­ter tex­t, and two bu­tton­s. Now it has a me­nu wi­th 11+ ite­ms, 3 bu­tton­s, and an ico­n. Apple's OS9 was as­ce­ti­c, and now OSX is a sea of boun­cy co­lor­ful things shou­ting at you.

The skeuo­mor­phism and other in­di­ca­tions of over­de­sig­n, of com­pli­ca­tio­n, in apple's apps is not unin­ten­tio­na­l, it's an in­ten­tio­nal attempt at making the appli­ca­tions spe­cia­l, appea­lin­g, and dis­tinc­ti­ve. It is ugly and aw­fu­l, but it is so in­ten­tio­na­lly, be­cau­se the ve­ry con­cep­ts of ugli­ness and aw­ful­ness are just a va­gue con­sen­sus among the user­s, and Apple su­re­ly felt con­fi­den­ce that user­s, ac­cos­tu­med to Apple's ro­le as kings of tas­te, would chan­ge their tas­te to fi­t. And as far as I can see that is exac­tly what has ha­ppe­ne­d.

Users are not the ones com­plai­ning about Apple's de­sign sty­le, other de­sig­ners are com­plai­nin­g. That sig­nal­s, to me, a dis­con­nect be­tween the tas­te of de­sig­ners and the tas­te of user­s. And ho­nes­tl­y, the tas­te of de­sig­ners is on­ly of va­gue aca­de­mic in­te­rest to com­pa­nies tr­ying to se­ll pro­duc­t.

Apple's har­dwa­re sta­ys mi­ni­ma­lis­tic be­cau­se they ha­ve suc­ce­ss­fu­lly bran­ded it. If you see a squa­rish slab of bla­ck gla­ss wi­th a bu­tto­n, you thi­nk iPad or iPho­ne de­pen­ding on si­ze, not "ge­ne­ric mi­ni­ma­lis­tic tou­ch de­vi­ce". On so­ftwa­re, that did not wo­rk. The­re was no­thing in­te­res­ting or in­no­va­ti­ve, or dis­tinc­ti­ve in mi­ni­ma­lis­tic de­sign for appli­ca­tion­s.

So they started wi­th co­lor­ful gu­m­drop­s, mo­ved on­to brus­hed me­ta­l, and then in­to fake sti­tched lea­the­r, be­cau­se they are tr­ying to find so­me­thing that can be as suc­ce­ss­fu­lly and po­wer­fu­lly bran­ded as "sil­ve­ry slim we­dge wi­th bla­ck ke­ys" is no­w.

De­sig­ners appa­ren­tly seem to be­lie­ve the­re is cer­tain spe­ci­fic "clean­li­ness" that is the ha­ll­ma­rk of "good" de­sig­n, and that ri­pped pa­per and other skeuo­mor­phic affec­ta­tions are sig­ns of bad tas­te. That is si­lly and ahis­to­ri­c. Clean­li­ness is just a fas­hio­n, ree­l-­to­-­reel di­gi­tal re­cor­ders are an attempt at crea­ting a tas­te. It's am­bi­tious, and res­pec­ta­ble.

On the other han­d, it is ugly as he­ll.

Year Zero

Y un abo­ga­do que se lla­ma Ni­ck Car­te­r, que no es es­te Ni­ck Car­te­r:

Si les ex­pli­ca­ra el ar­gu­men­to, sue­na co­mo si es­tu­vie­ra lo­co, que es­tá bue­no pe­ro no ayu­da, así que les de­jo el trai­ler del li­bro:

¿Al­gu­na vez leís­te a Dou­glas Ada­ms y de­seas­te que el ar­gu­men­to tu­vie­ra al­go de sen­ti­do? ¿Al­gu­na vez leís­te a Te­rry Pra­tche­tt y qui­sis­te que hu­bie­ra más de una bro­ma ho­rri­ble­men­te es­ti­ra­da en el li­bro? [1]

Si es tu ca­so, en­ton­ces te re­co­mien­do que prue­bes Year Ze­ro Es muy gra­cio­so, tie­ne al­go que pa­re­ce un ar­gu­men­to, y por lo me­nos tres bro­mas dis­tin­ta­s. Un va­go co­no­ci­mien­do de mú­si­ca pop de los 80s ayu­da pe­ro no es ho­rri­ble­men­te ne­ce­sa­rio.

Le doy cin­co es­tre­llas [2] y se lo re­co­mien­do a ca­si to­do el mun­do.

Tus Amigos

Sor­ry, span­ish on­ly.


http://www.pescadopodrido.com/imagenes/politica/principal/DICTADOR%20costa%20pobre.jpg

Miren la ban­da.

No ten­go mu­chos ami­gos. Ten­go tres o cu­a­tro, ponéle. Se­guro no más de 10. Ten­go mu­chos cono­ci­dos, ten­go mucha gente que me cae bi­en, habrá al­guno que le cai­go bi­en, habrá otros que me cono­cen. He tenido ami­gos que nun­ca ví, ten­go ami­gos que nun­ca veo, ten­go ami­gos que nun­ca voy a ver porque tu­vieron la mala idea de morirse antes que los vea.

Ten­go ami­gos que quiero mu­cho, ten­go ami­gos que me ca­gan de risa, ten­go ami­gos y ten­go ami­gas, ten­go al­gu­na her­mana pos­ti­za que la quiero co­mo si fuera mi hí­gado, ten­go mi es­posa que es más ami­ga, ten­go ami­gos que quisiera ver más.

Hay ami­gos que no me cono­cen, pero si al­guien te re­gala un li­bro que te cam­bia la vi­da, o una can­ción que te lev­an­ta a la mañana, o un pro­gra­ma de ra­dio que te hace olvi­dar to­das las noches la bosta que fué el día, es­os son ami­gos míos, aunque yo no sea ami­go suy­o.

Hay gente que no conoz­co que me ha agrade­ci­do al­gu­na cosa que hice y supon­go que yo seré ami­go suyo aunque no sean ami­gos míos. A el­los les di­go que son ami­gos míos tam­bién.

No ten­go ami­gos de la in­fan­ci­a, no ten­go ami­gos de la ado­les­cen­ci­a, ten­go al­gún ami­go de mis vein­tipi­co, ten­go más de mis trein­tas, to­davía no ten­go uno de los cuarentayp­i­co. Ten­go ami­gos en otros país­es, ten­go ami­gos acá al la­do. Ten­go pocos pero son vari­a­dos. Ten­go pocos pero son los mejores.

Y cuan­do me muer­a, si me ha­cen la gaucha­da de no morirse antes el­los, ojalá ten­ga una coro­na que di­ga: Tus Ami­gos. Y se la destapen y se la tomen, los putos.


Contents © 2000-2024 Roberto Alsina