De otra galaxia

Si el sábado a la noche antes de rendir tu última materia en vez de estar estudiando estás emborranchandote por ahí, sos un inconciente y/o la tenés muy clara. Si en cambio no estás estudiando ni emborrachando, pero te ponés a pensar ejercicios para el curso de python que estás dando, sos un nerd. Mereces un brindis de chocolatada a tu salud de todos los de este foro.

Si encima blogueas al respecto, sos un nerd intergaláctico. Te explico por qué.

Resulta que tenés este archivo de datos. Cada número representa la intensidad de luz de un punto y te informan que la imágen es cuadrada. Se supone que son datos que te dió un profesor una vez, para que resuelvas este mismo problema en ¡ensamblador!

Hacerlo en Python, con Numpy y Matplotlib, significa estas líneas

import numpy as np
import matplotlib.pyplot as plt

data = np.fromfile ('data.txt', sep=' ')
SIZE = int(len(data) ** .5)
data.shape = SIZE, SIZE
plt.imshow (data)
plt.show ()

Y se obtiene este resultado:

System Message: WARNING/2 (<string>, line 38)

Explicit markup ends without a blank line; unexpected unindent.

Se puede limitar los valores de luz a un valor entre 0 y 255 (truncando valores de saturación extrema), haciendo :

plt.imshow (data.clip(0,255) )

Obtenemos este resultado:

Voto electrónico e ingenieros analógicos

Con mucho esfuerzo propio y ajeno, estoy terminando la carrera Ingeniería en Computación en la Universidad Nacional de Córdoba.

Una particularidad de mi carrera, entre varias, es que hay mucha discusión y participación estudiantil. Una herramienta estratégica para esto ha sido un grupo de correo en el que participan estudiantes, profesores y graduados.

Allí he mantenido algunas discusiones con compañeros y/o profesores sobre temas diferentes. Los más interesantes, para mí, son los que evidencian concepciones filosóficos, ideológicas y políticas de cada uno.

La última, que empezó el lunes, comenzó con una discusión sobre le voto electrónico (a raiz de la charla relámpago de Federico Heinz en la PyConAr ) que fue derivando a una más de fondo, sobre la concepción de ingeniero que yo quiero ser y la que los profesores con los que discuto en el hilo (y casi todos los otros) me enseñan.

Como ya casi tiene telarañas, y además porque allí están todas las discusiones previas (las que me parecieron interesantes, bah), lo publiqué en mi otro blog.

GPEC 2010: El poster

Otra cosa que hice en PyConAr fue presentar un poster sobre GPEC 2010, mi proyecto integrador para recibirme de ingeniero en computación, originalmente pensado para presentar en Riteq la semana que viene. El poster fue presentado en coautoría con Martín Cismondi y Gustavo Wolfmann, los directores del trabajo.

image0 Como no tuve tiempo, la de PyCon es una versión que (espero) será mejorada para la semana que viene, con algunas figuras más.

|image2|
Poster GPEC 2010 Formato A4 (reducido)

También un resumen extendido (2 páginas) aprobado por los revisores de RITEQ, que explica algún detalle más.

|image4|
Resumen aprobado Riteq 2010

Los fuentes están disponibles en en el repo:

svn checkout https://gpec2010.googlecode.com/svn/trunk/docs/poster

Ipython, la interactividad al poder

A lo largo de esta vida he amado, he llorado y reído, me han salido canas y dí algunas charlas y talleres.

Me gusta la docencia, probable herencia de una grosa. Me gusta compartir lo que sé, instarme a aprender para compartir con otros y aprender cuando enseño. Educación horizontal, educación popular.

|image1|

El viernes pasado, en la PyConAr debía dar una de las primeras charlas, `IPython, la interactividad al poder <http://ar.pycon.org/2010/conference/schedule/event/91/>`_ . Entró al cronograma en una segunda tanda de selección, con más sorpresa que el chino Garcé a Sudáfrica 2010. El problema es que para cuando me invitaron yo ya había descartado mi participación en PyCon y aceptado dar una en mi facu, también sobre Python pero otra. Ergo, ¡tenía que preparar 2 charlas!

En el medio, solucionar horribles bugs de GPEC para la release de la semana que viene, un casamiento a 1500 km de mi casa (por suerte no mío), aprender a diseñar hardware, malabarear estres con las remeras de PyAr y terminar el poster que se me ocurrió presentar.

El contexto no favoreció a preparar la charla con anticipación. De hecho, pude hacerme lugar el jueves de 0:05 a 4 am para leer el manual y escribir lo poco que escribí. Mucha audacia teniendo en cuenta que algunas de las cosas que quería (de alguna manera debía) mostrar, no las uso/aba realmente (eso de instarme a aprender es posta) y más aun, considerando que las presentaciones con "demo" incluída son una fiesta orgiástica para Murphy

Por eso, para descompimir la ansiedad y la casi certeza de que algo podía salir mal, lo primero que hice fue echarle la culpa a John Lenton, que fue el que incitó a la vergüenza. La charla comienza con este disclaimer:

Disclaimer
-----------------

Todo lo que sigue es culpa de John Lenton:


    2010/7/28 John Rowland Lenton :
    > Hola!
    >
    > Estamos organizando PyConAr. Viste? La conferencia de Python en
    > Argentina (...) te vas a dar cuenta cuando
    > estés acá en Córdoba que podrías haber presentado tu charla, y te vas
    > a sentir muy zonzo.

Para colmo de riesgos, descubrí algo que supongo que es un bug (TODO: check and report this) con la utilidad Demo de IPython que usé, en la versión estable (0.10) y la que está en desarrollo (0.11). Por eso tuve que hacer un downgrade a la 0.9, que no tiene algunas cosas interesantes que quería mostrar (%paste, por ejemplo).

Por supuesto, Murphy vino y se divirtió, pero no se burló sarcasticamente. Hasta que alguien me muestre un video y me ponga rojo de vergüenza voy a quedarme con la idea de que no estuvo tan mal. Alguno seguro no descrubrió nada nuevo, pero otros parecieron satisfechos y probablemente jueguen un ratito con IPython.

Archivos / Descarga

Como es una presentación interactiva, no hay "diapositivas". O sí, pero es un módulo python.

Todo lo que usé (con nimios retoques respecto a lo mostrado el viernes) se puede bajar (o forkear) de GitHub .

git clone git@github.com:nqnwebs/IPython-interactive-talk.git

O desde este Zip

PyConAr 2010, el orgullo de pertenecer

Ya está, ya pasó. Y estoy muy feliz de eso que pasó.

Conocí Python oliendo la pasión con la que hablaban de este lenguaje gente a la que admiro mucho y empujado demandas del trabajo, la academia y el hartazgo, de poner un pie fuera de la web, cosa que PHP permite de mentirita.

Me acerqué al lenguaje facilmente (simple is better than complex) pero no tan fácil a la comunidad. De hecho, acabo de fijarme en gmail y encontré el mail de un bonito bot y mi feo hola mundo a la lista de Python Argentina fechados el 17 de enero de 2007. Es bastante tiempo para saber tan poco de Python y para que Python sepa tan poco de mí.

Lamentablemente nunca pude ir a los PyCamp, que parecen ser el ámbito ideal para encontrar y fortalecer esa cuestión humana que a mi me faltaba para pertenecer y disfrutar, no sólo del lenguaje sino de su comunidad. Así que el año pasado, despues de la PyCon 2009 en Buenos Aires, me propuse tomar alguna responsabilidad si se hacía de nuevo.

Cumplí a medias: me anoté como revisor y ni siquiera revisé la mía. Pero (haciendo volar libres dos pajaros de un sueño, hospedé a Manu, presenté un poster más grandote que grandioso y di una charla que salió no demasiado mal.

La alegría, más allá de las poquitas charlas que logré ver, viene por el lado social. Conocí, conversé, me reí y casi que me emborraché con gente muy linda, mucha de la cual no sólo es técnicamente brillante sino humanamente querible.

Como apasionado de la tecnología sé que no es neutral. La tecnología, en esta época, es parte de la ideología.

Elegir una tecnología, un lenguaje de programación, y meterle tiempo, ingenio y muchas veces plata a su difusión y mejora, para que muchos se beneficien (y se tienten a meterle tiempo, ingenio ...) es un gesto de solidaridad que hay que aplaudir de pie.

En un sistema cuyo leitmotiv es "vos o yo" hay gente que dice "vos y yo", y mejor aún, dice "nosotros".

Grosa

From: Elena Del Balzo Date: 2010/10/15 Subject: Conferencia!!! To: Martín Gaitán

Hijo Queridísimo!!!

Hoy estuvimos en la universidad porque Juli recibió un título de postgrado. Charlando con tu padre me recordó que hoy das tu conferencia. Cuántas cosas lindas nos pasan!!! Deseo que logres transmitir todo lo que te apasiona y defiendas siempre, en cada circunstancia de la vida, tus convicciones, tus valores y principios. Tenemos obligación de llegar a muchos con nuestros conocimientos. El saber es poder. Vos tenés en tu "poder" una hermosa herramienta y Sé de tu capacidad para socializarla.¡¡ A multiplicar, a Sumar, a Compartir!!! Abrazo. te amo. Ma´

Me cago en vos, AFIP

El lunes a las 8am empecé mis trámites de (re)empadronamiento al Monotributo. Recién a las 12hs pude saber que ese día fracasaría, porque las "pruebas" de mi domicilio fiscal no eran válidas.

El martes, flamantemente concubinado con Nati para que me sirvan las facturas a su nombre, después de esperar que el burócrata que te saca la fotito y te hace firmar en el sensor (datos "biométricos", le llaman, pomposos) se parara cada 5 minutos, jugara con el aire acondicionado a su espalda y mandara mensajitos por celular mientras la gente de la cola (yo incluído) se inflaba de rabia, pude obtener la inscripción y la clave, la rebuscada combinación alfanumérica "hola1234", que es igual para todos (podrían, ya que están, imprimirla en el formulario, cierto?).

Se suponía que con ese trámite de sólo 2 mañanas, al otro día (porque la era digital lleva su tiempo) podría terminar los trámites via web. Pero se suponía nomás, porque la plataforma virtual-> de AFIP no funciona con navegadores que no sean Internet Explorer. En Firefox (o cualquiera de los navegadores libres) uno hace click y el formulario nunca se envía.

System Message: WARNING/2 (<string>, line 25)

Explicit markup ends without a blank line; unexpected unindent.

Esto es, por supuesto, porque está programada fuera de estándares. Vean qué boludez:

Element referenced by ID/NAME in the global scope. Use W3C standard document.getElementById() instead.

Este chorizo tira Firebug:

System Message: WARNING/2 (<string>, line 37)

Explicit markup ends without a blank line; unexpected unindent.

Es un doble esfuerzo indignarse con los burócratas (que llenan formularios de papel o scripts javascript erróneos) y también con los que en la cola, indignados, bociferan en voz alta frases noventistas como "esto no va a mejorar hasta que lo privaticen", buscando alguna complicidad, imagino.

Pero me niego a naturalizar que las cosas del Estado deban andar mal. No sólo porque las pagamos entre todos (mucha veces, más de lo que valen) sino porque necesitamos un Estado que funcione para que todas las demás cosas funcionen bien.

El discurso (y el avance) privatizador, comprobadamente perjudicial para el pueblo, ya no tiene tanta cancha como antes. Pero es hora de que empecemos, como Estado, pero sobre todo como ciudadanos concientes de que lo necesitamos, a sanarlo, quererlo, exigirlo y fortalecerlo.

Charla: python a los bifes

Víctima de la ausencia de tiempo y la mala costumbre, a ultísimo momento terminé de preparar las diapositivas para la charla que dí hoy en el marco de las Conferencias de Ingeniería en Computación, Electrónica y Biomédica 2010 de mi facu.

La charla se tituló Python a los bifes: casos reales de aplicación en Ingeniería. Las diapositivas se pueden ver acá.

(F11 para ver a pantalla completa)

El resúmen de dos líneas decía:

Basta de hablar y hablar de lo bueno que está Python: en la cancha se ven los pingos. Mostraré problemas reales de la carrera resueltos con este poderoso (y simple) lenguaje. Trabajos de Sistemas de Computación, Sistemas Operativos II, Paradigmas de programación y mi proyecto integrador en curso

Hubo unas 40 personas, y estuvo, creo, bastante bien. Como no practiqué (me siento estúpido hablando solo, y mi novia me mira desorbitada — aburrida — cuando le hablo de computadoras) no calculé bien el tiempo y los ejemplos, que era el quid de la cuestión, fueron a paso raudo. Pero creo que a la gente le gustó y ojalá alguno se sienta motivado para leer el tutorial de python y sumarse a PyAr.

Fuentes

La presentación fue escrita en RST y procesada con la herramienta rst2s5.

Tiene una licencia cc-By-NC-SA. Podés descargar todos los fuentes con las imágenes y algunos ejemplos de este tar:

Integración de DineroMail en SimpleCart (js)

Continuando con el artículo anterior hay tener en cuenta que cuando decimos "sistema de e-commerce simple" implica que tiene que ser simple también para el comprador.

En Argentina (y varios otros paises de latinoamérica) PayPal o GoogleCheckout no son de uso masivo, porque el e-commerce no es una práctica común y desde nuestro país es realmente imposible "poner" plata en una cuenta de esas — salvo que sea un pago efectuado desde el extranjero — , y es bastante engorroso sacarla. Además, quizas lo más importante, no aceptan pagos la mayoría de las monedas locales latinoamericanas.

|image1|

Por eso he integrado a SimpleCart (js) el sistema de pagos virtuales Dineromail.com que es similar a los otros pero orientado al mercado latinoamericano. Se puede utilizar desde Argentina, Brasil, Chile, México y (al parecer) próximamente Colombia, pagando en moneda local de cada país o en dólares.

La implementación está integrada al código original en javascript, no sobre SPIP, por lo que puede ser útil para usarlo independientemente o integrarlo con otro CMS.

El código está disponible en GitHub

Instalación rápida

Obviamente, se incluye el código javascript en la cabecera de la página HTML.

System Message: WARNING/2 (<string>, line 40)

Literal block expected; none found.

y se definen, al menos, las variables requeridas:

</root>

¡Listo! Al hacer Checkout, el contenido del carrito será enviado a DineroMail para procesar el pago.

Otros parámetros

El carrito de DineroMail tiene muchísimos parámetros opcionales que en su mayoría he omitido. Mirá el manual de integración para conocer la API completa. Sin embargo, algunas variables opcionales las tuve en cuenta. Acá listo todas las implementadas:

Variable JS Descripción dmMerchantId Número de cuenta de DineroMail (los primeros 7 digitos sin el dígito verificador /X). (requerido) dmCountryId Código de país del vendedor. 1: Argentina, 2: Brasil, 3: Chile, 4: México. (1 por defecto) dmSellerName Leyenda que el vendedor quiere mostrar en lugar de su email. dmHeaderImage URL de la imagen a mostrar en el Header dmCurrency Moneda de pago. Puede ser USD (dolares) . Si no se define, se usar la moneda local del país del vendedor. dmOkUrl URL donde se re direcciona al comprador en caso de transacción exitosa dmErrorUrl URL donde se re direcciona al comprador en caso de transacción errónea dmPendingUrl URL donde se re direcciona al comprador en caso de transacción pendiente. dmPaymentMethods Cadena de medios de pago permitidos. Por defecto elige todos los medios disponibles para el país, pero se puede configurar específicamente. Por ejemplo para permitir Pago Fácil, Rápipago y Visa en 1, 3 y 6 cuotas: ar_dm;ar_pagofacil;ar_rapipago;ar_visa,1,3,6 Nota: Todas las variables son atributos del objeto simpleCart, por ejemplo simpleCart.dmSellerName = "Vendedor Loco";

Además se puede asignar un código de producto al item.

System Message: WARNING/2 (<string>, line 92)

Literal block expected; none found.

El valor ’X18A’ se envía a DineroMail para futuros controles del vendedor.

Es todo por ahora. ¡A vender!

Actualización

Agregué unos selectores asociados al evento "click" para permitir cambiar dinámicamente el método de pago, de manera de darle más libertad al comprador.

Basta con declarar un elemento que acepte el evento ``onclick `` y asociarlo a alguna de estas clases

System Message: WARNING/2 (<string>, line 104); backlink

Inline literal start-string without end-string.

class descripción simpleCart_to_paypal Activa PayPal como medio de pago simpleCart_to_googlecheckout Activa Google Checkout como medio de pago simpleCart_to_dineromail Activa Google Checkout como medio de pago Un ejemplo de uso podría ser:

Elija su método de pago

SimpleCart(js) para spip

SimpleCart es un sistema para e-commerce muy sencillo íntegramente desarrollado en javascript. Permite realizar ventas mediante PayPal o Google Checkout y es muy extensible para implementar otros sistemas.

En este domingo de procrastinación, decidí integrarlo a SPIP [1]. Lo usaré, espero que pronto, para vender los productos del taller de serígrafía de Mazamorra.

Cómo funciona

Se instala como un plugin común y se configura mediante el plugin CFG. Por ahora sólo soporta PayPal como medio de pago, pero incluiré otros.

SimpleCart usa simples señaladores html, que yo he convertido en balizas.

Baliza Descripción #SIMPLECART_QUANTITY Indica la cantidad de productos #SIMPLECART_ITEMS Muestra los items en el carrito según las cabeceras definidas en la página de configuración #SIMPLECART_TAX_RATE Indica la tasa impositiva indicada en la configuración #SIMPLECART_TAX_COST Indica el total de impuestos #SIMPLECART_SHIPPING_COST Indica el costo de envío en función de la configuración definida #SIMPLECART_TOTAL La suma del precio de los productos en el carrito (Subtotal) #SIMPLECART_FINAL_TOTAL Total considerando impuestos y envío #SIMPLECART_CHECKOUT Genera el botón para finalizar compra (redirige al sistema de pago) #SIMPLECART_EMPTY Genera el botón para vaciar el carrito Con estas balizas puedes armar el carrito en cualquier lado. Los datos del carritos son persistentes usando cookies (incluso se conservan durante un tiempo aunque se abandone la página).

Por ejemplo, este puede ser tu carrito .

<:simplecart:your_cart:> (#SIMPLECART_QUANTITY items)

#SIMPLECART_ITEMS


<:simplecart:subtotal:>: #SIMPLECART_TOTAL<:simplecart:tax_cost:> (#SIMPLECART_TAX_RATE): #SIMPLECART_TAX_COST <:simplecart:shipping_cost:>:  #SIMPLECART_SHIPPING_COST <:simplecart:final_total:>: #SIMPLECART_FINAL_TOTAL

#SIMPLECART_CHECKOUT
#SIMPLECART_EMPTY

Cómo agregar productos

Muy simple. Se sube una imágen como documento definiendo su título y descripción y se la incrusta con el modelo item. El precio se indica con el parámetro price.

Por ejemplo, el documento 111 se vuelve un item si se lo incluye así

<item111|price=23.4>

Un atajo más

El código para el carrito de arriba lo incluí como un modelo para poder incrustarlo directamente desde la redacción de un artículo con ``<cart1> ``.

System Message: WARNING/2 (<string>, line 73); backlink

Inline literal start-string without end-string.

System Message: WARNING/2 (<string>, line 73); backlink

Inline literal start-string without end-string.

Demostración

Si alguien completa la transacción, lo interpretaré como una donación :D.

Descarga

El plugin está en desarrollo sobre spip-zone. Podés hacer un ckeckout SVN