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

Una clase para usuarios no informáticos de WordPress

El siguiente artículo no está pensado para ser leído por informáticos sino por no-informáticos. De todas formas, se agradece la lectura por parte de informáticos y sus comentarios para mejorarlo. El texto es una adaptación de un correo electrónico que le envié a un amigo luego de solucionar un problema que tenía con su blog alojado en wordpress.com.

Suele pasar, y esto lo se de leer tantas veces consultas en foros especializados, que sin aparente causa algunos blogs hechos con WordPress de repente se ven mal: la disposición (layout) de los elementos se rompe, cambia el color de fondo, la barra lateral aparece abajo de todo. ¿Cuál es la razón? Este "efecto indeseable" puede ser provocado de distintas maneras, pero una suele ser la causa en la mayoría de los casos: un error al crear entradas (o posts) para el sitio. Otro dato a tener en cuenta es que el error se suele manifestar cuando se utiliza la etiqueta especial 'more' (seguir leyendo).

En forma particular el problema se suele dar cuando el código HTML que conforma una entrada no es correcto; hay etiquetas (o 'tags') que abren pero no cierra o que están mal anidados. Se dice que un tag "abre" cuando es de la forma <NOMBRE> y "cierra" cuando es de la forma </NOMBRE>. Lo que está en el medio de esas marcas es su contenido.

<NOMBRE>Contenido</NOMBRE>

Estas etiquetas se utilizan para definir todo lo que se ve (y no se ve) en una página web. Un ejemplo sencillo: la etiqueta 'b' sirve para mostrar un texto (el contenido) en negrita (o bold). <b>esto aparece en negrita</b> es mostrado por un navegador así: esto aparece en negrita. De la misma forma existen etiquetas para mostrar texto en itálica, poner colores, insertar imágenes y muchísimas cosas más.

Si te interesa aprender HTML podés leer este tutorial. Seguimos.

El siguiente es un ejemplo de tags mal anidados:

<div>

texto

<p>

texto

</div>

texto

</p>

En uno de los posts del sitio que revisé había un párrafo de esta forma:

<div>

palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras palabras

</p>

Se abría un tag 'div' y se cerraba uno 'p'. Este error era el que causaba el problema en este sitio en particular. Fue solucionado cambiando <div> por <p>. Puede ocurrir que el error no sea tan trivial, pero en la mayoría de los casos será de la misma familia, aunque esté más oculto.

La siguiente lista enumera 3 reglas para tener en cuenta como forma de prevensión de estos errores.

Reglas prácticas para no tener problemas al publicar en WordPress:

1) Antes de publicar, pasar de la vista Visual a la vista HTML y ver que no haya problemas como el que describí arriba con las etiquetas.

2) Insertar la etiqueta 'more' la vista HTML para asegurarse de que no sea insertada dentro de otras etiquetas:

<div>

texto

<!--more-->

</div>

está mal.

<div>

texto

</div>

<!--more-->

está bien.

3) Es una fuente de errores de este estilo copiar y pegar texto desde otras páginas web o documentos de Word (ya que traen atachadas muchas etiquetas de formato). Una práctica para estar seguros de que no traemos de esas marcas es pasar el texto por el bloc de notas antes de pegarlo en el editor de WordPress. Luego en el editor mismo podemos darle formato (negrita, itálica, etc...)


Zinnia

Planta anual vistosa. Necesita suelo fértil y un buen verano. Las flores, tipo margaritas, pueden ser simples, semidobles o dobles. Las más grandes de 15 cm de diámetro. Los tallos robustos no necesitan soporte y las flores cortadas y puestas en agua duran mucho.

Crece mejor a pleno sol y en suelo enriquecido con compost.

Comienza a florecer en principio de verano-otoño.

Se siembra en almácigo y se trasplanta al exterior cuando pasa el período de heladas.

Cuando estaba volviendo de mi semana de vacaciones tomé estas fotografías en la casa de Juanita. Salieron lindas, así que no quería dejar de compartirlas:

[gallery]

El texto con el que abrí el post es cortesía de la Ing. Susana de Conti, mi madre.


La historia de Python: El principio del diseño y desarrollo del lenguaje

El siguiente texto es una traducción del artículo Early Language Design and Development Guido van Rossum publicado en http://python-history.blogspot.com/.

El principio del diseño y desarrollo del lenguaje

De ABC a Python

La primera y principal influencia de Python fue ABC, un lenguaje diseñado a principios de los 80 por Lamber Meertens, Leo Geurts y otros en CWI. El objetivo de ABC era ser un lenguaje de enseñanza, un reemplazo para BASIC, y un lenguaje y entorno para computación personal. Fue diseñado en un principio haciendo un análisis de la tarea de programar y luego haciendo varias iteraciones que incluían pruebas de usuario a conciencia. Mi rol en el grupo de ABC era principalmente implementar el lenguaje y su entorno integrado de edición.

El uso que Python hace de la identación viene directamente de ABC, pero esta idea no se originó con ABC (ya había sido promovida por Donald Knuth y era un concepto bien conocido de estilo de programación). (El lenguaje de programación occam también lo usaba). Si embargo, los autores de ABC sí inventaron el uso de los dos puntos que separa la cláusula inicial del bloque identado. Luego de las primeras pruebas con usuarios sin los dos puntos, se descubrió que el significado de la identación no le quedaba claro a los principiantes que tomaban sus primeras lecciones de programación. Agregar los dos puntos clarificó su significado: los dos puntos de alguna formar guiaban la atención a lo que seguía y unía lo anterior con lo siguiente de forma correcta.

Los principales tipos de datos de Python también vienen de ABC, aunque con algunas modificaciones. Las listas en ABC eran en realidad bags o multisets, que siempre se mantenían ordenadas utilizando una implementación modificada de árboles B. Sus tablas eran arrays asociativos que se mantenían ordenados en forma similar mediante claves. Encontré que ningún tipo de dato era preciso para representar, por ejemplo, la secuencia de líneas leídas de un archivo, el cual anticipé que sería un caso de uso común (en ABC tenías que usar una tabla con el número de línea como clave, pero eso complicaba las inserciones y los borrados). Entonces convertí el tipo lista en un array flexible con operaciones de inserción y borrado, dándole a los usuarios control total sobre el orden de los elementos en una lista. Un método sort soportaba la necesidad ocasional de resultados ordenados.

También reemplacé las tablas ordenadas implementando una tabla hash. Elegí una tabla hash porque creía que sería más rápida y fácil de implementar que el árbol B de ABC. Estaba teóricamente probado que los árboles B eran asintóticamente óptimos en tiempo y espacio para una gran variedad de operaciones, pero en la práctica se volvieron difíciles de implementar correctamente debido a la complejidad de sus algoritmos. Por la misma razón, la performance tampoco era óptima para tablas pequeñas.

Mantuve el tipo de dato inmutable de ABC llamado tupla (las operaciones de empaquetado y desempaquetado en Python vienen directamente de ABC). Ya que las tuplas son implementadas mediante arrays, decidí agregarles indexación y rebanado.

Una consecuencia de añadirle una interfaz de tipo array a las tuplas fue que tuve que pensar en una forma de resolver los casos límites de tuplas de longitud 0 ó 1. Una de las reglas que tomé de ABC fue que cada tipo de datos, al ser impreso o convertido a string, debía ser representado por una expresión que sea una entrada válida para el parser del lenguaje. De esto siguió que necesitaba notaciones para las tuplas de longitud 0 y 1. Al mismo tiempo no quería perder la distinción entre una tupla y una expresión entre paréntesis, entonces utilicé un enfoque feo pero pragmático en el cual una coma final convertiría una expresión en una tupla de un elemento y "()" representaría a una tupla de cero elementos. Vale la pena mencionar que los paréntesis por lo general no son necesarios en la sintaxis de Python, excepto aquí (representar la tupla vacía con "nada" podría fácilmente enmascarar errores genuinos).

Los strings de Python empezaron con una semántica (inmutable) muy parecida a los strings de ABC, pero con una notación diferente e indexación basada en 0. Ya que ahora tenía tres tipos indexables -listas, tuplas y strings- decidí generalizar todo en un concepto común, la secuencia. Esta generalización hizo que ciertas operaciones básicas como obtener la longitud (len(s)), indexar (s[i]), rebanar (s[i:j]) e iterar (for i in s) funcionen de la misma forma en cualquier tipo que sea una secuencia.

Los números son uno de los puntos en los que más en desacuerdo estuve con ABC. ABC tenía dos tipos de números en tiempo de ejecución; los números exactos que eran representados como números racionales de precisión arbitraria y los números aproximados que eran representados mediante punto flotante binario con un rango de exponente extendido. Los números racionales no encajaban en mi visión del tema (anécdota: una vez intenté computar mis impuestos usando ABC. El programa, que parecía bastante directo, estaba demorando mucho en computar unos pocos números. Luego de investigar descubrí que estaba haciendo aritmética con números con miles de dígitos de precisión, que tenían que ser redondeados a florines -pie 100 centavos holandeses - y centavos para ser impresos). Es por esto que para Python elegí un modelo más tradicional con enteros de máquina y punto flotante binario de máquina. En la implementación de Python, estos números son representados simplemente con los tipos de datos de C long y double respectivamente.

Creyendo que también había un caso de uso importante para números exactos sin límite, agregué un tipo de dato bignum, que llamé long. Ya tenía una implementación de bignum que había sido el resultado de un intento inconcluso por mejorar la implementación de ABC unos años antes (la implementación original de ABC, una de mis primeras contribuciones, usaba una representación decimal internamente). Sonaba lógico usar este código en Python.

A pesar de haber agregado bignums a Python, es importante enfatizar que no quería usar bignums para todas las operaciones entre enteros. De extrapolar lo que veía en programas escritos por mí y por colegas en CWI, sabía que las operaciones entre enteros representaban una porción significativa del total del tiempo que la mayoría de los programas corrían. El uso más común de los enteros es indexar secuencias que entran en memoria. Así, decidí usar enteros de máquina para los casos de uso más comunes y el rango extra de bignums solo para hacer "matemática seria" o calcular la deuda externa de Estados Unidos en peniques.

El problema con los números

La implementación de números, especialmente enteros, es un área en la que cometí varios errores de diseño serios, pero también aprendí lecciones importantes sobre el diseño de Python.

Ya que Python tiene dos tipos diferentes de enteros, necesitaba una forma de distinguir entre los dos tipos en un programa. Mi solución era pedirle a los usuarios que explícitamente digan cuando querían usarlos agregando una L al final de los números (por ejemplo 1234L). Esta es un área en la que Python violaba la filosofía inspirada en ABC de no necesitar que los usuarios se encargar de detalles de implementación que no les importaban.

Lamentablemente, este era solo el menor detalle de un problema mayor. Un error más ilustre fue que mi implementación de enteros y longs ¡tenía una ligera diferencia semántica en algunos casos! Ya que el tipo int era representado como un entero de máquina, las operaciones que desbordaban silenciosamente recortaban el resultado a 32 bits o a la precisión que el tipo long de C tuviera. Además, el tipo int, que normalmente se considera tiene signo, era tratado como sin signo por las operaciones bitwise y shift y en la conversión desde/hacia octales o hexadecimales representados como int o long. Los longs, por otro lado, siempre se consideraban con signo. Por lo tanto, algunas operaciones producían un resultado diferente, dependiendo de si un argumento era representado como int o como long. Por ejemplo, en una aritmética de 32 bits, 1<<31 (1 shift a izquierda 31 bits) produciría el entero negativo más grande de 32 bits y 1<<32 produciría cero, mientras que 1L<<31 (1 representado como long shift a izquierda 31 bits) produciría un entero enorme igual a 231 y 1L<<32 produciría 232.

Para resolver algunos de estos asuntos hice un arreglo simple. En lugar de tener operaciones entre enteros que recorten silenciosamente el resultado, cambié la mayoría de las operaciones aritméticas para que lancen una excepción OverflowError cuando el resultado no encaje. (La única excepción a este control eran las operaciones de "bit-wise" mencionadas anteriormente, ya que asumí que los usuarios esperarían que estas operaciones se comporten como en C). Si no hubiese añadido este control, los usuarios de Python indudablemente hubiesen empezado a escribir código dependiente de la semántica de la aritmética binaria con signo de módulo 2**32 (como hacen los usuarios de C), y arreglar el error hubiese sido una transición mucho más dolorosa para la comunidad.

A pesar de que la inclusión del control de desborde pueda parecer un detalle de implementación menor, una dolorosa experiencia de debugging me hizo dar cuenta que era una característica útil. Como uno de mis primeros experimentos en Python, intenté implementar un algoritmo matemático simple, el computo de los "Números de Meertens", un poco de matemática recreativa inventada por Richard Bird al celebrar los 25 añosen WCI del principal autor de ABC. Los primeros números de Meertens son pequeños, pero al traducir el algoritmo en código no me había dado cuenta de que los resultados intermedios del computo eran mucho más grandes que 32 bits. Me llevó una larga y dolorosa sesión de debugging descubrir esto, y decidí entonces manejar el asunto controlando todas las operaciones entre enteros y lanzando una excepción siempre que el resultado no pueda ser representado como un long de C. El costo extra del control de desborde no se notaría junto a la sobrecarga que ya tenía con la decisión de implementación de crear un nuevo objeto para el resultado.

Lamentablemente, siento decir que lanzar una excepción por desborde ¡tampoco era la solución correcta! En ese entonces, estaba trabado por la regla de C "las operaciones con tipos numéricos T retornan un resultado de tipo T". Esta regla también era la razón de mi otro gran error en la semántica de los enteros: truncar el resultado de la división entre enteros, que discutiré en una de las próximas entradas. En retrospectiva, debí hacer que las operaciones entre enteros que desbordaban cambien el tipo de su resultado a long. Esta es la forma en que Python funciona hoy, pero completar esta transición llevó mucho tiempo.

A pesar del problema con los números, una cosa muy positiva salió de esta experiencia. Decidí que no debía haber valores de retorno no definidos en Python, en lugar de esto, siempre se lanzarían excepciones cuando un valor de retorno no correcto podía ser computado. Así, los programas escritos en Python nunca fallarían debido a que valores no definidos se estén pasando silenciosamente por detrás. Este es aún un principio importante del lenguaje, tanto en el lenguaje propiamente dicho como en las librerías.

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.


¿Me recomendás un libro para leer?

Me gustaría recibir recomendaciones de libros para leer.

Hace unos días que en realidad fueron semanas abandoné Los miserables de Victor Hugo, me resultó muy pesado y no pude continuar leyendo la historia. Pero no me gusta estar sin nada sobre la mesita de luz, por lo que me propongo encontrar un buen libro para que sea el siguiente.

En la sección Cosas que leo, de este blog, podés darte una idea del tipo de lectura que me gustó. Así mismo, sé algunas cosas que creo tiene que tener el próximo libro que lea:

    <li>puede ser una novela, pero no es necesariamente una novela.</li>
    
    <li>me gustaría aprender algo de él y no especificamente algo técnico.</li>
    
    <li>los capítulos no tienen que ser muy largos.</li>
    
    <li>preferiría un autor latinoamericano o español contemporáneo.</li>
    
    <li>me gustaría conseguir una edición por menos de $50.</li>
    

    Ojo! lo anterior es solo una guía, espero recomendaciones que no encajen en la lista de items. Si pensás en uno que puede gustarme, no dejes de comentarlo.

    Muchas personas pasan a diario por este blog, pero pocos se animan a comentar una entrada. Si leíste hasta acá te agradezco mucho que me dejes una recomendación.

    Gracias,

    PS: el viernes me decido por uno y lo compro en la librería.


    La historia de Python: Microsoft distribuye código Python... en 1996

    El siguiente texto es una traducción del artículo Microsoft Ships Python Code... in 1996 de Greg Stein publicado en http://python-history.blogspot.com/.

    Microsoft distribuye código Python... en 1996

    ¡Muchas gracias a Guido por permitirme compartir mi propia historia de Python!

    Me guardo mi iniciación en Python para otro post, pero el resultado final fue su introducción en un emprendimiento que co-fundé en 1991 con otras personas. Estábamos trabajando en un gran sistema cliente/servidor de comercio electrónico entre empresas y consumidores. Protocolos TCP propios operando sobre la vieja red X.25 y todo eso. Vieja escuela.

    En 1995 nos dimos cuenta, contrariamente a nuestra primera impresión, que la mayoría de los consumidores no estaban en Internet, y que necesitábamos un sistema para nuestros clientes (los vendedores) para que lleguen a sus clientes basados en Internet. Tuve la tarea de definir nuestro enfoque y elegí Python como mi herramienta de prototipado.

    Nuestro primer problema fue cambiar a una solución basada totalmente en el navegador. Nuestro cliente a medida ya no era viable, necesitamos una experiencia de compra nueva para los clientes e infraestructura de servidores para soportarla. En ese entonces, hablarle a un navegador significaba escribir scripts de CGI para los servidoes Apache o Netscape HTTP. Usando CGI, me conectaba a nuestro servidor existente para procesar las ordenes, mantener el carrito de compras y obtener información de los productos. Estos scripts producían HTML plano (¡no había AJAX en 1995!).

    Este enfoque era menos que ideal ya que cada petición tomaba tiempo y creaba un nuevo proceso CGI. La velocidad de respuesta era muy pobre. Luego, en diciembre de 1995, mientras asistía al Python Workshop en Washington DC, me introdujeron a algunos módulos para Apache y Netscape (de Digital Creations, mejor conocidos como Zope) que corrían en forma persistente en el proceso del servidor. Estos módulos usaban un sistema RPC llamado ILU para comunicarse contra otros procesos por detrás. Con este sistema funcionando, la sobrecarga del CGI desapareció y la experiencia de compra ¡se podía disfrutar bastante! Empezamos a convertir el prototipo en código real. Mientras más lejos íbamos, mejor lucía y más personas se unían al proyecto. El desarrollo se movió muy rápido durante los siguientes meses (¡gracias Python!).

    En enero de 1996 Microsoft llamó a nuestra puerta. Su esfuerzo interno por crear un sistema de comercio electrónico no tenía éxito y necesitaban personas que conocieran la industria (nosotros habíamos estado haciendo comercio electrónico ya por varios años en ese momento) y que fueran ágiles. Continuamos desarrollando el software durante la primavera mientras las negociaciones se llevaban a cabo y luego la adquisición finalizó en junio de 1996.

    Una vez que llegamos a Microsoft con nuestra pequeña pila de código Pyhon, tuvimos que resolver como distribuir el producto en Windows NT. El equipo al que nos unimos tenía mucha experiencia y creó un plug-in para IIS que permitía comunicarse mediante tuberías nombradas al servidor que estaba por detrás, un servicio de NT con el código de nuestro servidor Python embebido. Con una primavera loca empezando en julio, distribuimos Microsoft Merchant Server 1.0 en octubre de 1996.

    Y si... si mirabas bajo la alfombra, en algún lugar escondido, había un intérprete de Python, algunas DLLs y un montón de archivos .pyc. Ciertamente Microsoft no se dio cuenta de este hecho, pero estaba ahí si sabías dónde mirar.

    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.


    3 features de SQLite que no conocía

    SQLite es (o se debate entre si es o no) un motor de base de datos liviano. No requiere configuración, no usa un servidor, su código ocupa poco espacio y una base de datos ocupa un solo archivo. Tal vez por estas características es usado no solo en aplicaciones de escritorio y sitios web, sino también dentro de: el lenguaje de programación PHP, el navegador web Firefox y muchos dispositivos móviles (más). Hace unos días lo estoy usando para una aplicación Django mono-usuario. Hoy leyendo su página web, descubrí 4 características que no conocía, me llamaron la atención y me gustaron mucho.

    La siguiente es una traducción libre de la página web de la herramienta.

    El archivo de la base de datos se mantiene en distintas plataformas

    El formato de archivo de SQLite es cross-platform. Un archivo de base de datos escrito en una máquina puede ser copiado a y usado en una máquina diferente con una arquitectura diferente. Big-endian o little-endian, 32-bit o 64-bit, no importa. Todas las máquinas usan el mismo formato de archivo. Más aún, los desarrolladores han mantenido el formato estabe y compatible hacia atrás, entonces versiones nuevas de SQLite pueden leer y escribir archivos de base de datos más viejos

    La mayoría de los otros motores SQL requieren que bajes y restaures la base de datos al cambiar de una plataforma a otra y a menudo al actualizar a una nueva versión del software.

    Tipado manifesto

    La mayoría de los motores SQL usan tipado estático. Un tipo de dato es asociado con cada columna en una tabla y solo valores de ese tipo en particular se pueden guardar en esa columna. SQLite relaja esta restricción usando tipado manifiesto. En este tipo de tipado, el tipo de dato es una propiedad del valor en si mismo, no de la columna en el que el valor es almacenado. SQLite así permite que el usuario almacene cualquier valor de cualquier tipo de dato en una columna sin importar el tipo declarado de esa columna. (Hay algunas excepciones a esta regla: una columna de tipo INTEGER PRIMARY KEY solo almacenará enteros. Y SQLite intentará acomodar los valores al tipo de dato declarado en la columna cuando pueda).

    Creemos que la especificación del lenguaje SQL permite el uso de tipado manifiesto. De todas formas, la mayoría de los otros motores SQL son estáticamente tipados y por eso algunas personas creen que el uso de tipado manifiesto es un bug en SQLite. Pero los autores de SQLite están convencidos de que esto es una característica valiosa. El uso de tipado manifiesto en SQLite es una decisión de diseño deliberada que ha probado en la práctica hacer que SQLite sea más confiable y fácil de usar, especialmente cuando se usa en combinación con lenguajes de programación dinámicamente tipados como Tcl y Python.

    Registros de tamaño variable

    La mayoría de los otros motores de base de datos SQL reservan una cantidad fija de espacio en disco por cada fila en la mayoría de las tablas. Hacen algunos trucos para manejar BLOBs y CLOBs que pueden tener un tamaño muy variable. Pero para la mayoría de las tablas, si declarás una columna de tipo VARCHAR(100), entonces el motor de base de datos reservará 100 bytes de espacio en disco sin importar cuanta información realmente guardes en esa columna.

    SQLite, en contraste, usa dolo la cantidad de espacio en disco que realmente se necesita para almacenar la información en la fila. Si guardás un solo carácter en un columna de tipo VARCHAR(100), solo un byte de espacio en disco será consumido. (En realidad 2 bytes - hay cierta sobrecarga el principio de cada columna para guardar su tipo de dato y longitud).

    El uso de registros de tamaño variable en SQLite tiene varias ventajas. Resulta en archivos de base de datos más pequeños, obviamente. También hace que la base de datos corra más rápido, ya que hay menos información que mover desde y hacia el disco. Y, el uso de registros de tamaño variable hace posible que SQLite use tipado manifiesto en lugar de tipado estático.

    Más características

    Una lista de todas las características de SQLite puede encontrarse en http://www.sqlite.org/different.html


    Cocarroy

    Los cocarroy son un plato de origen mallorquí que lleva muchos años en mi familia. Como usamos nuestros propios repollos,  la preparación del plato constituye una tradición que empieza en la huerta eligiendo un repollo que esté en el punto justo para utilizar. El texto de esta receta es parte del archivo personal de la Ing. Susana Garaü de Conti (mi mamá).

    Ingredientes

    • Para la masa: 3 tazas de harina, 1 chorrito de aceite, sal y  agua
    • 1 repollo
    • 2 cucharitas de pimentón
    • Sal
    • Aceite
    • Pimienta
    • 1 chorizo parrillero
    • Una rodaja de panceta

    Preparación

    • Sacar el nervio central de cada hoja, lavarlas y cortarlas en cuadradito. Colocar en ensaladera y condimentar con sal, aceite, pimentón y algo de pimienta si se desea.
    • Preparar la masa mezclando los 3 elementos. Cuando la masa está suave, armar bollos y estirar hasta tener el tamaño de un plato.
    • Colocar en la mitad de la masa un poco de la ensalada y agregar cubitos de chorizo y de la panceta.
    • Tapar con la otra mitad armando empanadas grandes con el repulgue.
    • Pinchar y humectar con un poco de agua y al HORNO !!!

    [gallery]


    Empanadas mediterraneas

    Hoy tenemos una nueva receta para compartir. Estas ricas empanadas fueron preparadas por mi hermana Marisú. Las cantidades que se utilizan son para preparar una docena de empanadas. Fieles a nuestro estilo: muchas fotos, poco texto, rico y sano.

    Cortar 3 tomates grandes en cubitos, picar 10 hojas de albaca, condimentar con sal y aceite, mezclar los ingredientes y reservar.

    Distribuir los discos de empanada sobre la mesa y colocar sobre cada uno un trozo de queso cuartirolo.

    Agregar a cada disco el relleno preparo en primera instancia y completar el relleno con trozitos de aceituna negra.

    Realizar el repulge y hornear por 25 minutos en una asadera acietada.

    Y a disfrutar en la mesa:


    Tuya, de Claudia Piñeiro

    Hace unos minutos terminé de leer Tuya, un policial por Claudia Piñeiro. Es una novela corta (al rededor de 160 páginas que se leen en 4 horas). El relato es muy ágil y más que la historia (que es entretenida y original) me gustó mucho más la forma de contarla.

    En este libro la autora usa un estilo moderno:

      • Todos los capítulos son cortos (entre 3 y 5 páginas).
      • La mayoría de los capítulos están contados en una vertiginosa primera persona. La protagonista nos hace partícipes de cada uno de sus pensamientos mientras cuenta los hechos en los que se vio involucrada. En algunas partes se nota un libre fluir de la conciencia (recuerda las palabras de su madre, las enseñanzas de su profesora de inglés, momentos con su pareja, postula sus ideas sobre el criado de los hijos y la crisis en la que vive la juventud actual y hace cuadros sinópticos para aclarar sus pensamientos y decidir sus próximos pasos).
      • El siguiente grupo de capítulos (si ordenamos los grupos por cantidad) cuenta una historia paralela, la de la hija de la protagonista. Lo llamativo es que cada uno de estos capítulos está formado íntegramente por diálogos planos sin aclaraciones:
        —Hola... —... —¿Está Iván? —¿Quién le habla? —Una amiga. —Las amigas de mi hijo tienen nombre. —Laura...
      • Otros capítulos (menos que los anteriores) parecen partes de una investigación policial: notas periodísticas, citas de libros sobre medicina forense y otros textos similares.
      • El resto de los capítulos (muchos menos) están contados por una voz en off que relata al lector hechos que no son vividos por la protagonista.
      • En los dos tipos de capítulos que no son enteramente diálogos (los contados en primera persona y los de la voz en off) los diálogos también se expresan en una forma ágil, pero distinta:
    Dejó la valija a un costado. "Tengo una parva de cosas para lavar ahí adentro". "Mintras no me hagas lavarle un corpiño a esa", pensé.
    • Así como la novela está mechada con capítulos que son solo diálogos, hay un capítulo de los de la voz en off que está mechado por párrafos que en primera instancia no tienen nada que ver con lo que se está relatando pero que ayudan a marcar el ritmo de la novela: descripciones de lugares y significados de nombre.

    Yo suelo consumir muchas novelas, no exageradamente muchas pero si más (creo) que la media (sin hacer muchas cuentas diría que entre 10 y 20 al año). Y nunca me había encontrada con una organizada de esta forma. Me encantó.

    Algo que suele pasarme es que cuando me encuentro a un autor que me gusta, empiezo a deborarme toda su obra. Me pasó con Tolkien, Coelho, Rowling, Cortazar, Sábato y tal vez algún otro que no recuerdo. A lo mejor agrego a Piñeiro a mi lista. Hoy voy a devolver este libro a la biblioteca y traerme Las viudas de los jueves.


    Goodreads review: Tuya (Claudia Piñeiro)

    https://viejoblog.juanjoconti.com.ar/2009/03...

    Hace unos minutos terminé de leer Tuya, un policial por Claudia Piñeiro. Es una novela corta (al rededor de 160 páginas que se leen en 4 horas). El relato es muy ágil y más que la historia (que es entretenida y original) me gustó mucho más la forma de contarla.

    En este libro la autora usa un estilo moderno:

    * Todos los capítulos son cortos (entre 3 y 5 páginas).
    * La mayoría de los capítulos están contados en una vertiginosa primera persona. La protagonista nos hace partícipes de cada uno de sus pensamientos mientras cuenta los hechos en los que se vio involucrada. En algunas partes se nota un libre fluir de la conciencia (recuerda las palabras de su madre, las enseñanzas de su profesora de inglés, momentos con su pareja, postula sus ideas sobre el criado de los hijos y la crisis en la que vive la juventud actual y hace cuadros sinópticos para aclarar sus pensamientos y decidir sus próximos pasos).
    * El siguiente grupo de capítulos (si ordenamos los grupos por cantidad) cuenta una historia paralela, la de la hija de la protagonista. Lo llamativo es que cada uno de estos capítulos está formado íntegramente por diálogos planos sin aclaraciones:

    —Hola…
    —…
    —¿Está Iván?
    —¿Quién le habla?
    —Una amiga.
    —Las amigas de mi hijo tienen nombre.
    —Laura…

    * Otros capítulos (menos que los anteriores) parecen partes de una investigación policial: notas periodísticas, citas de libros sobre medicina forense y otros textos similares.
    * El resto de los capítulos (muchos menos) están contados por una voz en off que relata al lector hechos que no son vividos por la protagonista.
    * En los dos tipos de capítulos que no son enteramente diálogos (los contados en primera persona y los de la voz en off) los diálogos también se expresan en una forma ágil, pero distinta:

    Dejó la valija a un costado. "Tengo una parva de cosas para lavar ahí adentro". "Mintras no me hagas lavarle un corpiño a esa", pensé.

    * Así como la novela está mechada con capítulos que son solo diálogos, hay un capítulo de los de la voz en off que está mechado por párrafos que en primera instancia no tienen nada que ver con lo que se está relatando pero que ayudan a marcar el ritmo de la novela: descripciones de lugares y significados de nombre.

    Yo suelo consumir muchas novelas, no exageradamente muchas pero si más (creo) que la media (sin hacer muchas cuentas diría que entre 10 y 20 al año). Y nunca me había encontrada con una organizada de esta forma. Me encantó.

    Algo que suele pasarme es que cuando me encuentro a un autor que me gusta, empiezo a deborarme toda su obra. Me pasó con Tolkien, Coelho, Rowling, Cortazar, Sábato y tal vez algún otro que no recuerdo. A lo mejor agrego a Piñeiro a mi lista. Hoy voy a devolver este libro a la biblioteca y traerme Las viudas de los jueves.


    Rating: 4/5

    Original: https://www.goodreads.com/review/show/843440141