Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

Pan lactal

Después de la Rosca de pascua, les presentamos más recetas de pradería. La razón es que compramos levadura en cantidad y para no tirarla preparamos recetas que uno generalmente no hace. Hoy: Pan lactal. Las fotos con las que ilustramos la preparación fueron tomadas por mi hermana con su celular mientras cocinaba (doble mérito!!).

Ingredientes

  • Levadura fresca 30g
  • Azúcar 1 cucharada
  • Leche 150cc
  • Harina 0000 350g
  • Sal una pizca
  • Manteca 30g

Preparación

Primero formar el fermento. Incorporar a la harina en forma de corona la sal, la manteca pomada, el fermento y la leche:

Formar una masa homogénea y lisa. Dejar levar el doble. Desgasificar. Estirar un rectángulo del largo del molde (tipo budín ingles):

Enrrollar la masa y colocar en molde enmantecado y enharinado. Dejar levar. Pintar con huevo batido:

Finalmente, hornear:

Excelente para el desayuno!

En la próxima receta, otra idea para aprovechar la levadura: Tortitas negras.


Guerra y TA-TE-TI

Hoy miramos WarGames, de 1983. Muy buena.

[after playing out all possible outcomes for Global Thermonuclear War]

Joshua: Greetings, Professor Falken.

Stephen Falken: Hello, Joshua.

Joshua: A strange game. The only winning move is not to play. How about a nice game of chess?


Rosca de Pascua

Hoy celebramos la Pascua Cristiana. Un postre típico de esta época es la Rosca de Pascua. Para ajasajear a nuestros familiares con algo diferente, decidimos hacer nosotros mismos este postre. A continuación un listado de ingredientes necesarios y los pasos necesarios para su preparación y fotografías ilustrativas.

Ingredientes

Fermento

  • 30 g de levadura fresca
  • 1 cucharada de azúcar
  • 2 cucharadas de harina
  • 60 cc de leche tibia

Masa

  • 1/2 kilo de harina 0000
  • 1 cucharadita de sal
  • 100 g de azúcar
  • 1 cucharada de ralladura de limón y naranja
  • 2 huevos
  • 1 cucharada de miel
  • 1 cucharadita de esencia de vainilla
  • 90 g de mantec pomada
  • leche tibia C/N

Crema pastelera

  • 250 cc de leche
  • 1 huevo
  • 80 g de taza de azúcar
  • 30 g de harina
  • 1 cucharadita de esencia de vainilla
  • Cerezas en almíbar C/N

Glasé

  • Jugo de limón (una parte)
  • Azúcar impalpable (9 partes)

Preparación

Fermento

Poner en un bol la levadura con la leche tibia y el azúcar. La leche no debe estar muy caliente por que puede matar a la levadura. Disolver bien y agregar la harina, tapar el recipiente y dejar que leve.


Masa

Poner en un bol los huevos, el azúcar, la ralladura, la miel, la vainilla, la manteca y leche tibia. Mezclar bien.




En otro recipiento más amplio, poner la harina en forma de corona previamente cernida con la sal en el borde más externo (para que cuando se agregue la levadura no entre en contacto directo con la sal), hacer un hueco y volcar la primera preparación en el centro junto con la levadura ya levada.


Ir incorporando la harina hasta formar una masa homogenea, agregándole más leche tibia si es necesario o de lo contraria un poco más de harina.

Amasarla bien hasta lograr una masa consistente y que no se pegue al recipiente. Hacer un bollo y tapar con un paño (también puede ser una bolsa de plástico) y dejar descansar hasta que esté bien levada.

Crema pastelera

Primero hervir la leche, luego poner en una cacerola chica el huevo y el azúcar, mezclar bien e incorporar la harina, mezclando nuevamente. Verter de a poco la leche caliente y continuar revolviendo.


Llevar a fuego suave, hasta que la crema comience a espesar. Retirar y agregar la esencia de vainilla. Dejar enfriar, revolviendo cada tanto.



De nuevo la masa

Una vez levada la masa, ponerla en una mesada espolvoreada con harina, desgacificarla y comenzar a estirarla con el palote en forma rectangular, hasta que la masa quede fina (calcular el largo de la masa similar al diámetro de la placa en la que se horneará).


Rellenar con una línea de dulce de leche y enrollar la masa.


Luego unir las puntas, formando la rosca. Poner sobre una placa enmantecada (se puede colocar un marcador metálico también enmantecado y enharinado en el centro para que la rosca no se cierre), tapar con un paño y dejar que doble su volumen.

Una vez levado, decorar con la crema pastelera y las cerezas a gusto.


Llevar al horno hasta que se dore y al introducir un palillo salga limpio (apróximadamente 40 minutos).

Glasé

Mezclar el jugo de limón con la azucar impalpable en una compotera hasta que la mezcla tome cuerpo y esté espesa. Utilizar el glasé para pintar la rosca ya horneada y fría. También se puede decorar con nueces.

Felices Pascuas!


Shell Python administrativo sobre SSH para tu servidor Twisted en 10 líneas

entre tu reactor.listeTCP(puerto, factory) y reactor.run():

from twisted.conch import manhole, manhole_ssh

from twisted.cred import portal, checkers

def getManholeFactory(namespace, **passwords):

realm = manhole_ssh.TerminalRealm()

def getManhole(_): return manhole.Manhole(namespace)

realm.chainedProtocolFactory.protocolFactory = getManhole

p = portal.Portal(realm)

p.registerChecker(

checkers.InMemoryUsernamePasswordDatabaseDontUse(**passwords))

f = manhole_ssh.ConchFactory(p)

return f

reactor.listenTCP(2222, getManholeFactory(globals(), admin='aaa'))

Los aplausos para este tutorial.


Servidor SSH con Twisted

Actualicé este ejemplo, tamibién incluido en el libro de Twisted para que no tire Deprecation Warnings:

from twisted.cred import portal, checkers, credentials

from twisted.conch import error, avatar, recvline, interfaces as conchinterfaces

from twisted.conch.ssh import factory, userauth, connection, keys, session, common

from twisted.conch.insults import insults

from twisted.application import service, internet

from zope.interface import implements

import os

class SSHDemoProtocol(recvline.HistoricRecvLine):

def __init__(self, user):

    self.user = user



def connectionMade(self) :

    recvline.HistoricRecvLine.connectionMade(self)

    self.terminal.write("Welcome to my test SSH server.")

    self.terminal.nextLine()

    self.do_help()

    self.showPrompt()



def showPrompt(self):

    self.terminal.write("$ ")



def getCommandFunc(self, cmd):

    return getattr(self, 'do_' + cmd, None)



def lineReceived(self, line):

    line = line.strip()

    if line:

        cmdAndArgs = line.split()

        cmd = cmdAndArgs[0]

        args = cmdAndArgs[1:]

        func = self.getCommandFunc(cmd)

        if func:

           try:

               func(*args)

           except Exception, e:

               self.terminal.write("Error: %s" % e)

               self.terminal.nextLine()

        else:

           self.terminal.write("No such command.")

           self.terminal.nextLine()

    self.showPrompt()



def do_help(self, cmd=''):

    "Get help on a command. Usage: help command"

    if cmd:

        func = self.getCommandFunc(cmd)

        if func:

            self.terminal.write(func.__doc__)

            self.terminal.nextLine()

            return



    publicMethods = filter(

        lambda funcname: funcname.startswith('do_'), dir(self))

    commands = [cmd.replace('do_', '', 1) for cmd in publicMethods]

    self.terminal.write("Commands: " + " ".join(commands))

    self.terminal.nextLine()



def do_echo(self, *args):

    "Echo a string. Usage: echo my line of text"

    self.terminal.write(" ".join(args))

    self.terminal.nextLine()



def do_whoami(self):

    "Prints your user name. Usage: whoami"

    self.terminal.write(self.user.username)

    self.terminal.nextLine()



def do_quit(self):

    "Ends your session. Usage: quit"

    self.terminal.write("Thanks for playing!")

    self.terminal.nextLine()

    self.terminal.loseConnection()



def do_clear(self):

    "Clears the screen. Usage: clear"

    self.terminal.reset()

class SSHDemoAvatar(avatar.ConchUser):

implements(conchinterfaces.ISession)



def __init__(self, username):

    avatar.ConchUser.__init__(self)

    self.username = username

    self.channelLookup.update({'session':session.SSHSession})



def openShell(self, protocol):

    serverProtocol = insults.ServerProtocol(SSHDemoProtocol, self)

    serverProtocol.makeConnection(protocol)

    protocol.makeConnection(session.wrapProtocol(serverProtocol))



def getPty(self, terminal, windowSize, attrs):

    return None



def execCommand(self, protocol, cmd):

    raise NotImplementedError



def closed(self):

    pass

class SSHDemoRealm:

implements(portal.IRealm)



def requestAvatar(self, avatarId, mind, *interfaces):

    if conchinterfaces.IConchUser in interfaces:

        return interfaces[0], SSHDemoAvatar(avatarId), lambda: None

    else:

        raise Exception, "No supported interfaces found."

def getRSAKeys():

if not (os.path.exists('public.key') and os.path.exists('private.key')):

    # generate a RSA keypair

    print "Generating RSA keypair..."

    from Crypto.PublicKey import RSA

    KEY_LENGTH = 1024

    rsaKey = RSA.generate(KEY_LENGTH, common.entropy.get_bytes)

    publicKeyString = keys.Key(rsaKey).toString()

    privateKeyString = keys.makePrivateKeyString(rsaKey)

    # save keys for next time

    file('public.key', 'w+b').write(publicKeyString)

    file('private.key', 'w+b').write(privateKeyString)

    print "done."

else:

    publicKeyString = file('public.key').read()

    privateKeyString = file('private.key').read()

return publicKeyString, privateKeyString

if name == "main":

sshFactory = factory.SSHFactory()

sshFactory.portal = portal.Portal(SSHDemoRealm())

users = {'admin': 'aaa', 'guest': 'bbb'}

sshFactory.portal.registerChecker(

checkers.InMemoryUsernamePasswordDatabaseDontUse(**users))

pubKeyString, privKeyString = getRSAKeys()

sshFactory.publicKeys = {

    'ssh-rsa': keys.Key.fromString(pubKeyString)}

sshFactory.privateKeys = {

    'ssh-rsa': keys.Key.fromString(privKeyString)}



from twisted.internet import reactor

reactor.listenTCP(2222, sshFactory)

reactor.run()</pre></body></html>

Pan de salvado

Hoy les acerco una receta para hacer pan de salvado casero. Tanto el texto como las fotos son de mi hermana Marisú.

Ingredientes

  • Harina Pureza con levadura: 1/2 Kg
  • Harina integral: 1/2 Kg
  • Agua tibia: 600 mml
  • Grasa, manteca o aceite: 50 gm
  • Sal: 20 gm

Preparación

1- Poner todos los ingredientes, excepto el agua en un bol agregando la materia grasa al final.

2- Agregar el agua tibia de a poco y mezclar.

3- Amazar hasta que quede con textura lisa.

4- Dividir la masa en bollos, cubrirlos con papel film y dejarlos reposar 30 minutos.

5- Desgasificar la masa y formar bollitos del tamaño deseado.

6- Colocarlos en una placa formando varillas y con un objeto cortante hacer 2 cortes en la parte superior.

7- Tapar con papel film y dejar reposar 10 minutos.

8- Hornear hasta que queden dorados y al introducir un palillo salga limpio.


Mañana: Voto electrónico en Santa Fe

El próximo martes 7 de abril, desde las 19:30, en ATE Central, San Luis 2854, tercer piso, Salón de Conferencias, realizaremos una charla abierta de presentación del libro "Voto Electrónico. Los riesgos de una ilusión" en la Ciudad de Santa Fe de la Vera Cruz. Del diálogo y debate participarán Beatriz Busaniche de Fundación Vía Libre y el periodista Juan Carlos Bettanin, de LT10 Radio Universidad Nacional del Litoral. Durante la presentación entregaremos ejemplares del libro en forma gratuita a los asistentes.

Fuente: Vía Libre

UPDATE: un panfleto de difusión


La historia de Python: El uso de tipado dinámico

El siguiente texto es una traducción del artículo Python's Use of Dynamic Typing de Guido van Rossum publicado en http://python-history.blogspot.com/.

El uso de tipado dinámico en Python

Una diferencia importante entre ABC y Python es el estilo general del sistema de tipos. ABC es estáticamente tipado, lo cual significa que el compilador de ABC analiza el uso de tipos en un programa y decide si están siendo usados consistentemente. Si no, el programa es rechazado y su ejecución no puede comenzar. A diferencia de la mayoría de los lenguajes con tipado estático de esos días, ABC usaba inferencia de tipos (no distinto que Haskell) en lugar de declaraciones explícitas de tipos como en C. En contraste, Python es dinámicamente tipado. El compilador de Python ignora felizmente los tipos usados en un programa y todo el control de tipos es hecho en tiempo de ejecución.

Aunque esto pueda parecer muy distinto de ABC, no es tan diferente como uno imaginaría. A diferencia de otros lenguajes de tipado estático, ABC no depende (¿dependía? es prácticamente histórico hoy : - ) exclusivamente de controles de tipado estático para evitar que el programa termine abruptamente, también tiene una librería en tiempo de ejecución que controla los tipos de los argumentos en todas las operaciones nuevamente cada vez que son ejecutadas. Esta verificación no estaba de más para los algoritmos de control de tipos del compilador, que no estaban totalmente implementados en el primer prototipo del lenguaje. La librería en tiempo de ejecución también servía como una ayuda para la depuración, ya que el control de tipos explícito en tiempo de ejecución puede producir lindos mensajes de error (algo requerido por los implementadores), en lugar de los vuelcos de memoria que sucederían si el intérprete siguiera ciegamente con una operación sin controlar si los argumentos tienen sentido.

Sin embargo, la razón más importante por la que ABC tenía control de tipos en tiempo de ejecución, además de control de tipado estático, es su naturaleza interactiva. En una sesión interactiva, el usuario tipea sentencias de ABC y definiciones que son ejecutadas tan pronto como son completadas. En una sesión interactiva, es posible crear una variable y asignarle un número, borrarla y luego volver a crearla (en otras palabras, crear otra variable con el mismo nombre) y asignarle un string. Dentro de un solo procedimiento, sería un error de tipado estático usar el mismo nombre de variable primero como un número y luego como un string, pero no sería razonable forzar ese control entre diferentes sentencias entradas en una sesión interactiva, mientras que la creación accidental de una variable llamada x a la que se le asigna un número, !prohiba para siempre la creación de una variable x con otro tipo!. El compromiso de ABC es usar control de tipos dinámico para las variables globales, pero estático para las locales. Para simplificar la implementación, las variables locales obtienen control de tipo dinámico también.

Así, hay solo un pequeño paso desde el enfoque usado en la implementación de ABC para el control de tipos al de Python; Python simplemente deja todo el control de tipos en tiempo de compilación. Esto se alinea completamente con la filosofía de Python de "tomar atajos", ya que simplifica la implementación y no afecta la eventual seguridad, ya que todos los errores de tipo son atrapados en tiempo de ejecución antes de que causen un mal funcionamiento del intérprete de Python.

Sin embargo, una vez que te decides por el tipado dinámico no hay vuelta atrás. Las operaciones de ABC fueron cuidadosamente diseñadas para que el tipo de los argumentos pueda ser deducido de la forma de los operadores. Por ejemplo, de la expresión "x^y" el compilador deduciría que las variables x e y son strings, así como el resultado. En Python, esa deducción no se puede generalizar. Por ejemplo, la expresión "x+y" puede ser una concatenación de strings, una suma entre números, o una operación sobrecargada sobre tipos definidos por el usuarios.

Traducido por Juan José Conti.

Revisado por César Portela.

Si encontrás errores en esta traducción, por favor reportalos en un comentario y los corregiremos a la brevedad.

Todas las traducciones de esta serie pueden encontrarse en La historia de Python.


FPDF en Django

Si intentás usar FPDF en Django hay algunas cosas que necesitás saber:

    <li>(ya sabés qué) <a href="http://www.fpdf.org/">FPDF</a> está originalmente escrita en PHP y permite generar documentos PDF sin usar PDFLib (C).</li>
    
    <li>(ya sabés qué) hay más de un port de esta librería a Python. Todos son incompletos.</li>
    
    <li>Usá este <a href="http://www.nsis.com.ar/svn/pyfpdf/" target="_blank">http://www.nsis.com.ar/svn/pyfpdf/</a> (parcheado en Argentina para utilizar unicode).</li>
    
    <li>FPDF <a href="http://www.fpdf.org/en/FAQ.php#q7">trabaja con la codificación ISO-8859-1</a>.</li>
    
    <li>Mi código fuente Django usa la cotificación UTF-8 y en los documentos resultantes aparecían caracteres raros en lugar de vocales con tilde o eñes.</li>
    
    <li>Lo soluciné haciendo una modificacicón en el método Output:</li>
    

    self.buffer = buffer.encode('iso-8859-1')


    El segundo color predominante: PIL

    Hace unas semanas necesité hacer un script en Python que genere algunas decenas de imágenes. Básicamente, se tiene como entrada imágenes como estas:

    (un borde con alguna forma y un color en un fondo blanco)

    Las imágenes generadas tienen que tener ciertos números en el centro, pintados en cada caso del mismo color que el borde:

    La primer parte del script tiene que determinar el segundo color predominante de la imagen (el primero es el blanco), esta es la forma en que lo hice usando PIL:

    def get_color(image):
    
    colors = image.getcolors()  # colors is a list of (count, color)
    
    colors.sort(lambda y,x: cmp(x[0], y[0])) # bigger count first
    
    c = colors.pop(0)
    
    while white(c): # find the non-white color most used in the image
    
        c = colors.pop(0)
    
    return c[1]
    

    def white(color):

    color = color[1]
    
    return color[0] == 255 and color[1] == 255 and color[2] == 255</pre></body></html>