miércoles, 4 de mayo de 2016

Diplomatura abierta en Software Libre


El año pasado se inició la Diplomatura en Software Libre que impulsamos en la Universidad del Este (La Plata). La primer promoción de estudiantes ya completaron los cursos, destacándose academicamente los siguientes trabajos finales integradores:
Felicitamos y agradecemos a todos los participantes (tanto estudiantes como docentes, tutores colaboradores, personal de la universidad y ONGs: SoLAr, CAdeSoL, FACTTIC) que hicieron posible la primer edición.
Como contribución a la comunidad y para aquellos interesados, a continuación se detalla más información sobre la misma, incluyendo la Edición 2016 que está comenzando este mes (próximo encuentro 14/05).

Organización

La diplomatura son cursos de extensión universitaria orientados a un público en general (estudiantes, docentes, desarrolladores en empresas públicas o privadas y miembros de la comunidad), y no requiere experiencia previa en estas tecnologías. Por ello, abarca distintos módulos con contenidos para cada nivel (desde principiantes a usuarios intermedios/avanzados) y se distribuyen en una serie de 8 cursos a lo largo de un año para contemplar la dedicación mínima necesaria.

Primer cuatrimestre (Mayo, Junio, Julio, Agosto):

Seminario Sw. Libre
(1 mes)
Bases de Datos PostgreSQL
(1 mes y medio)
Redes de computadoras GNU/Linux (1 mes y medio)
Programación I Python
(4 meses)

Segundo cuatrimestre (Septiembre, Octubre, Noviembre, Diciembre):

Ingeniería de Sw. Libre (1 mes)
Sistemas Operativos GNU/Linux
(1 mes y medio)
Desarrollo Web HTML web2py
(1 mes y medio)
Programación II C C++ Python
(4 meses)

Los temarios tentativos y planificaciones iniciales pueden descargarse desde nuestro portal, con información sobre los objetivos, unidades temáticas (generalmente una por semana), metodología, criterios de evaluación, actividades, referencias y bibliografía.

Son 4 cursos por cuatrimestre, pero el único en paralelo es el de programación (contemplando los tiempos necesarios para presentar los contenidos y reforzar conocimientos de aquellos que no tengan una base en estos temas).
Los encuentros presenciales son un sábado vez por mes (opcionales) y la mayor parte de los trabajos y prácticas se realizan a distancia por el campus virtual u otros medios.

Los contenidos por el campus virtual son para una cursada completamente "asincrónica" según la disponibilidad del estudiante (documentos PDF de lectura, enlaces páginas, foros y actividades que no requieren un horario específico). Eventualmente se coordinan sesiones de chat o hangouts para tratar algún tema en particular.

Académicamente, la carga horaria aproximada mínima es 4 hs de dedicación por semana por curso, más los encuentros presenciales y desarrollo de trabajos prácticos.

Encuentros Presenciales:

Se llevan a cabo 8 encuentros presenciales (optativos y recomendados), donde se dictan clases presenciales y talleres sobre los módulos de cada mes, generalmente en cuatro tramos (horario de 8.00 a 16.00):
  • Presentación expositiva de los temas teóricos
  • intervalo (cafe) 
  • Trabajo práctico individual y grupal en PC
  • almuerzo libre
  • Laboratorio de programación en PC
  • intervalo (cafe)
  • Actividad sobre el trabajo final integrador y cierre
Frecuentemente las charlas en los intervalos y almuerzo complementan la parte académica con interesantes debates sobre temas de actualidad relacionados al software libre, aportando experiencias y reflexiones útiles sobre muchos de los contenidos teóricos, en un ambiente distendido, cordial y ameno.

Materiales libres y abiertos:

Todos los contenidos están fuertemente orientados al Lenguaje de Programación Python, por lo que se utiliza el material de Algorítmos y Programación I (Apunte FIUBA)

También como referencias se pueden ver algunas presentaciones Universidad Carlos III de Madrid (OCW UC3M) y la documentación oficial / sitios de las comunidades locales, como Python ArgentinaPostgreSQL Argentina, web2py, etc.
Para los estudiantes más avanzados, se incluyen artículos optativos sobre el kernel de linux, optimización de consultas, firewalls, etc.

Como complemento se recorren apuntes propios y trabajos académicos (desarrollados al cursar la Maestría de Software Libre de la UOC):
Para el curso "Ingeniería del Software Libre" se presentan metodologías ágiles ("Scrum y XP desde las Trincheras"), el Proceso de Software Personal (materiales de estudio autodidacta), entre otros materiales y recursos.
A modo de ejemplo, se utilizan como referencia varios de los temas investigados en mi tesis de la maestría: "Desarrollo rápido de software libre de alta calidad", entre otras lineas de trabajo.

Actividades y Trabajos Prácticos:

Para una cursada más dinámica y flexible, adaptamos la mayor parte de las actividades optativas para ser realizadas por el Campus Virtual de la Universidad, mediante los Foros y en ocasiones Wiki / Glosario. Este año planteamos incrementar el uso de las herramientas de Cuestionarios de Auto-Evaluación y Chats para mejorar las cuestiones de virtualidad y seguimiento.

En el campus de la universidad se desarrollan debates diversos, por ej: "Licenciamiento de Software (Libre)", "Estructura y funcionamiento de internet", "Comparativas entre motores de bases de datos", etc. También aquellos estudiantes que lo crean conveniente, pueden publicar internamente sus exámenes resueltos para compartirlos y discutir las alternativas / correcciones, comentar dudas, etc.

Se proveen ejercicios modelos y ejemplos concretos, como la Bases de Datos Dell DVD Store 2, tutoriales de programación, sitios y herramientas interactivas, etc.

Estamos analizando materiales de estudios de reconocidos MOOCs y certificaciones, avanzando en contenidos comunes que permitan a los estudiantes certificarse luego en esas tecnologías.

Para las prácticas más técnicas (programación, bases de datos, redes/sistemas operativos) hemos implementado un "Laboratorio Virtual de Software Libre" en un portal educativo abierto a la comunidad: www.softwarelibre.org.ar/moodle
Utiliza el módulo "VPL" de Moodle para facilitar las entregas y corrección automatizada ágil, completamente online (con editor de texto, consola de ejecución y depuración completamente vía web, para poder experimentar libremente sin riesgos y sin necesidad de instalar las herramientas en la PC):


En este sentido, estamos avanzando en un curso comunitario masivo y en linea para enseñar programación de computadoras ("Python para Zombis": documento de trabajo y presentación resumen), traducción al Español de materiales como Python Module of The Week, etc. Ver abajo los exámenes resueltos con más información al respecto.

Obviamente al ser una diplomatura en Software Libre, el código fuente resultante de las prácticas es trabajado y se publica de manera abierta en el repositorio en GitHub:  https://github.com/UniversidadDelEste

Exámenes:

Las actividades de evaluación son mixtas, con estrategias tradicionales y alternativas más modernas (incluyendo multimedia), buscando un aprendizaje critico, constructivo y significativo. Se contemplan tanto el desarrollo y participación en el campus / encuentros, como el resultado final.
Generalmente se realizan a distancia vía un examen domiciliario (con entrega por el Campus Virtual):
  1. Seminario de Software Libre: investigación-acción sobre Wikipedia (PDF)
  2. Bases de Datos PostgreSQL: desarrollar un mini-proyecto sobre datos abiertos (PDF)
  3. Redes de computadoras GNU/Linux: redactar un capítulo/sección de libro libre (PDF)
  4. Programación I Python: desarrollar una actividad de evaluación automatizada (PDF)
  5. Sistemas Operativos GNU/Linux: presentación multimedia sobre temas a elección (PDF)
  6. Desarrollo Web: trabajar sobre una aplicación web2py o similar (PDF)
  7. Programación II C+Python: analizar el proyecto hello de la Free Software Foundation  (PDF
  8. Ingeniería de Software Libre: trabajo final en forma de artículo (PDF)
Si bien hay fechas limites, los estudiantes pueden determinar su propio ritmo de cursada y entrega de actividades, dentro de los limites razonables de cada curso (procurando trabajar en grupo y con acompañamiento docente adecuado).

En la carpeta pública se encuentran ejemplo variados de exámenes de programación resueltos (Python), desde ejercicios simples (PDF, ODT), intermedios (ODT, ODT) y más avanzado (PDF). Además de servir como evaluación, documentan la configuración de una actividad automatizada en la plataforma Moodle (VPL: Laboratorio Virtual de Programación, ver arriba) que puede ser útil como tutorial para otros docentes.
También se pueden mencionar exámenes resueltos de bases de datos PostgreSQL (sobre datos abiertos y públicos): "Encuesta Nacional de Gastos de los Hogares " (PDF), "Elecciones CABA 2013" (PDF), "Censo Hogares y Viviendas" (PDF), "Cajeros Automáticos CABA" (PDF) y "Trabajo Práctico" (ZIP), entre otros.

Gracias a los alumnos por compartirlos dentro de los lineamientos de la dipolomatura para generar recursos educativos libres y abiertos.
Recordar que son documentos académicos preliminares (pueden no estar realizadas las correcciones y observaciones realizadas por los docentes), y revisar la licencia de publicación.

Edición 2016:


Para 2016 esta abierta la inscripción

http://ude.edu.ar/extension/diplomaturas/software-libre-combinada/

También buscamos profesores y tutores que estén interesados en colaborar con el equipo docente (para más información ver propuesta académica completa)
Proximamente se publicará un repositorio institucional con todos los trabajos académicos, y anunciaremos más novedades (invitados, eventos, etc.) vía @softlibre y en el portal.
Desde ya se agradece difusión y toda sugerencia es bienvenida

miércoles, 31 de diciembre de 2014

Entrevista para PyDev of the Week

Aprovechando el cierre del año, y a modo de resumen, a continuación transcribo una entrevista (traducida) que me realizó Mike Driscoll para su blog "Mouse vs Python":


"Desarrollador Python" de la Semana: Mariano Reingart


¿Puedes contarme un poco sobre ti (hobbies, educación, etc)?:


Soy programador independiente y docente, casado con dos hijos pequeños.

Comencé a programar cuando era un chico y mi padre compró una ZX Spectrum TK-90 a fines de los '80.
Para 1989, con sólo 11 años, tomé mi primer curso "formal" de programación "Basic I" usando computadoras MSX y "D.O.S." hacia 1991.
Luego de terminar la primaria, en 1992 me anoté en un colegio con orientación de "Bachiller especializado en Informática"  (nivel secundario) donde se enseñaba Visual Basic y Visual Fox Pro en los cursos finales.

Luego de egresar, trabajé en esa escuela como Ayudante de Laboratorio, instalando mi primer servidor Slackware Linux circa 1997 para la conexión de Internet, y programando los sistemas del colegio (usando inicialmente VB + Access).
Mi primer experiencia "open source" fue desarrollando un modulo para el kernel de Linux y así usar la linea telefónica dedicada de 128Kps (incluso tuvimos que importar la placa de comunicaciones); y un controlador de kernel de ucLinux para PiCoTux (una micro-computadora embebida corriendo Linux).
También, di mis primeros pasos en la migración de bases de datos a PostgreSQL y trabajando con los primeros dispositivos "WiFi".

Luego, estudié Ingeniería Electrónica por varios años, pero me dí cuenta que mis habilidades iban más por el lado del software, por lo que me cambié de carrera a una Universidad local para Estudiar Licenciatura en Sistemas.
Finalmente me gradué en 2011 luego de varios años "sabáticos" donde gané experiencia laboral desarrollando pequeños sistemas de gestión administrativa/contable para PyMEs, y una aplicación 911(en colaboración ad-honorem con un amigo de la radio-estación policial local).

Actualmente estoy terminado la Maestría en Software Libre (Universidad Abierta de Cataluña), y el Profesorado en Disciplinas Industriales / Docencia Superior (UTN - INSPT).

¿Por qué comenzaste a utilizar Python?


Empecé a usar python en los '00, buscando alternativas a Visual Basic.
Lo elegí para mi tesis de grado en 2006 "Desarrollo Rápido de Aplicaciones bajo el Proceso de Software Personal"

Desde 2009 enseño Python en un Instituto Terciario. Comenzó en un curso pero luego acordamos (con otros profesores) implementar un Proyecto Curricular Institucional orientado al software libre, principalmente en las siguientes materias:


Basado en ello, con otro colega estamos preparando una "Diplomatura en Software Libre" (programa de cursos de formación profesional de 1 de año de duración con actividades de extensión universitaria, enfocados Python, PostgreSQL and GNU/Linux, para más información ver documento de trabajoarticulo).

Felizmente, laboralmente hoy trabajo principalmente brindando planes de soporte comercial de código abierto gracias a Python, dado que desde 2008 el proyecto PyAfipWs: "factura electrónica", iniciado desde la lista de correo PyAr, la comunidad de Python Argentina, creció, siendo usado por una base de usuarios relativamente grande (incluyendo grandes empresas, PyMEs y profesionales)

¿Que otros lenguajes de programación conoces y cual es tu favorito?


Obviamente Python es mi favorito, y tengo cierta experiencia en PHP, C/C++, Java y otros lenguajes.

Lamentablemente aún tengo que usar Visual Basic Clásico (6.0) para algunos de mis sistemas ERP "legados" (son grandes, alrededor de cientos de miles de líneas de código, y no he tenido tiempo / recursos para migrarlos a Python por el momento)

Ahora estoy investigando vb2py, un proyecto para convertir código VB a Python.
Me intriga por qué  no llegó a juntar masa crítica / tracción (el desarrollo parece estancado desde 2004), teniendo en cuenta que hay mucho código VB dando vueltas...

En el proyecto de factura electrónica, use pywin32 (de Mark Hammond et al) para hacer componentes Python usables desde lenguajes legados (VB, VFP), y bibliotecas como dbf (de Ethan Furman) para interactuar con lenguajes aún más antiguos (Clipper, xBase, etc.).
Recientemente también comencé a experimentar con Jython, para usar proyectos Python desde Java.

¿En que proyectos estás trabajando ahora?


Para mi tésis de grado, comencé a desarrollar rad2py, un entorno integrado de desarrollo (IDE) experimental y herramientas CASE de ayuda al desarrollador , previstas para ser usadas para propósitos comerciales, educativos y académicos.

Ahora estoy terminando la invesigación para mi tesis de maestría "Desarrollo Rápido de Software Libre de Alta Calidad", tratando de facilitar la vida a los desarrolladores integrando enfoques modernos como interfaces basadas en tareas (Eclipse Mylyn) y Ágil ALM (gestión del ciclo de vida de las aplicaciones), con principios disciplinados de la ingeniería de software para aseguramiento de calidad y mejora continua.

¿Que bibliotecas Python son tus favoritas (del núcleo or de terceros)?


Trato de usar solo la Biblioteca Estándar de Python + wxPython y web2py, y adicionalmente pywin32 y dbf para ciertos proyectos, como mencioné antes.

Particularmente encuentro a web2py fascinante, dado que tiene prácticamente una curva de aprendizaje plana, permite prototipado rápido, una interfaz integrada de desarrollo en linea (web), etc.
Sus enfoques no tradicionales también son interesantes para traer otras perspectivas y "pensamiento crítico", especialmente gracias al liderazgo abierto, cordial y reflexivo de Massimo Di Pierro, su creador, y por supuesto, su comunidad afable.
Descargo: soy uno de los desarrolladores "principales", no muy activo estos días debido a la falta de tiempo, pero he contribuido un depurador en linea y otras mejoras, co-escribí el libro "web2py app development cookbook" de Packt, etc.

wxPython también me merece una mención especial, el trabajo de Robin Dunn es grandioso (phoenix py3k!), los widgets agw widgets de Andrea Gavana en puro phyton son realmente impresionantes, solo para mencionar algunos desarrolladores de dicha comunidad.
También veo a wxWidgets más ortogonal y fácil de usar que otras alternativas.
Este año traté de colaborar más en profundidad con una variante experimental wxQt, como becario enmarcado en el Google Summer of Code 2014 (ahora es usable, incluso desde wxPython! y bajo Android al menos la parte C++ ...).

Cuando necesito algo no cubierto por estas opciones, tiendo a mirar hacia soluciones simples (muchas veces influenciadas por extensiones PHP), iniciando, continuando o "forkeando" ("escindiendo") otros proyectos:
  • PySimpleSoap: interfaces ad-hoc livianas para construir clientes y servidores SOAP
  • PyFPDF: clase para la generación simple de PDF basada en FPDF de  PHP y derivados
  • gui2py: un fork (bifurcación) de PythonCard (conjunto de construcción GUI visual "rápido" & simple) para evolucionarlo y modernizarlo 
Más allá de que ciertos desarrolladores los ven como esfuerzos "naif" (por decir lo más leve), la mayoría de los proyectos ha encontrado su nicho y hoy en día varias contribuciones son hechas por otros colaboradores que también los han encontrado útiles .
También ayudan a entender las tecnologías subyacentes, a proveer alternativas implementadas en "puro Python" y a experimentar con la migración a Python 3.

¿Hay algo más que quieras decir?


No, disculpas por las largas respuestas, pero la entrevista es irresistible :-) ...
También, disculpas por mi Inglés (en la entrevista original), dado que hablo español es dificultoso a veces encontrar la traducción correcta.

Gracias a vos Mike por tus esfuerzos y este proyecto sobre artículos de entrevistas, y ¡gracias a toda la comunidad Python!

jueves, 31 de octubre de 2013

PgDay Argentina 2013



4ta Jornada intensiva sobre bases de datos PostgreSQL


http://www.postgresql.org.ar/pgday2013



El encuentro es de entrada libre y gratuita, y se realizarán el 14 de Noviembre en  el edificio de la Secretaría de Gestión y Coordinación Administrativa, Av. Roque Sáenz Peña 511 (Capital Federal), en el marco del Foro de la Agenda Digital Argentina.

Entre los disertantes contará con ponencias de expertos internacionales, autoridades nacionales y funcionarios públicos, docentes y profesionales, entre otros, brindando más de 14 actividades confirmadas (ver agenda), tanto conferencias como talleres prácticos para todos los niveles de conocimiento sobre PostgreSQL, el líder mundial en sistemas de base de datos relacionales de código abierto y software libre.

Para facilitar el ingreso y organización, recomendamos realizar la inscripción via web con anticipación:

http://www.postgresql.org.ar/pgday2013/user/register

Gacetilla de prensa con más información sobre el PgDay:


http://www.postgresql.org.ar/pgday2013/static/gacetilla.pdf

Dossier de Prensa de PostgerSQL 9.3:


http://www.postgresql.org/about/press/presskit93/es/


Desde ya agradecemos difusión por listas de correo, redes sociales o en carteleras de universidades/empresas.

Por consultas, escribir a ar@postgresql.org (contacto regional de PostgreSQL para Argentina)

martes, 22 de octubre de 2013

1er Jornada de Informática en el Instituto Blaise Pascal

El Jueves 31 de Octubre de 2013, se realizará de 18:00 a 21:30 en el Instituto Tecnológico Blaise Pascal (donde soy docente), una Jornada Anual de Informática, en la cual los alumnos compartirán experiencias y presentarán algunos proyectos trabajados en el año:

  • Domótica: Control de una vivienda con una computadora (raspberry pi) 
  • Control de asistencia con lector de códigos de barra (web2py) 
  • Monitor de Anuncios: aplicación web "TV Inteligente" (web2py) 
  • Software de manejo de matrices (python) 
  • Robótica: Robot N6 guiado para recorrer un camino / laberinto (python) 
  • Sistema de gestión académica orientado a web -trabajo final integrador- (web2py) 
También se presentarán otros proyectos sobre análisis de un sistema de orientación vocacional, mercado laboral, idiomas y estadísticas.


La mayoría de los trabajos están enmarcados en un proyecto curricular orientado al software libre que venimos trabajando desde 2009 (tecnicaturas en Análisis de Sistemas y Redes Informáticas).

Para más información sobre el instituto y las carreras, ver: http://www.institutopascal.edu.ar

Cualquier duda quedamos en contacto, desde ya todo aquel que esté interesado puede concurrir, la entrada es libre y gratuita.

Próximamente se publicarán algunos vídeos sobre la jornada.

Se agradece difusión,

jueves, 5 de septiembre de 2013

Aplicación libre para recuento de votos / escrutinio: recuento_web2py


Recientemente he liberado una aplicación web, usada originalmente para el Recuento definitivo de las elecciones provinciales de Rio Negro 2011:


En el Primer Hackaton de Datos Públicos,  que incluyó juegos de datos de elecciones pasadas, trabajé en dicha aplicación para armar y publicar el código de la misma, a modo de demostración que sirviera para procesar los resultados de distintas elecciones.

La aplicación es básica y simple, permite consultar/cargar datos de las planillas (actas / telegramas de cada mesa) y tiene una página de resultados totalizados. Está escrita en el lenguaje de programación Python (framework web2py) y utiliza PostgreSQL como base de datos.

El esquema de base de datos ha sido generalizado para que pueda ser utilizado en cualquier tipo de elección, ya que soporta diferentes cargos, listas internas / partidos, y un árbol jerárquico de ubicaciones (soportando clasificaciones variadas, por ej. en País, Provincia, Departamento, Circuito y Mesa).

Mi idea de publicar el código fuente, fue más que nada por una cuestión educativa / experimental, para poder compartirlo con alumnos y otros interesados, ya que quizás sea de utilidad para tomarlo como base para analizar resultados de elecciones, hacer pruebas de carga y rendimiento, optimización de bases de datos, etc.

Hasta el momento, se procesaron los datos públicos de dos elecciones nacionales:
Esta subido a un repositorio público bajo licencia AGPLv3+ (licencia de software libre similar a la de Linux pero con consideraciones adicionales para aplicaciones web): https://github.com/MSA-Argentina/recuento_web2py

Instalación Rápida:

  • Descargar web2py desde: http://www.web2py.com/ 
  • Descargar la aplicación en un archivo comprimido desde GitHub: master.zip
  • Descomprimir la aplicaión en la carpeta application de web2py (por ej. bajo el nombre recuento)
  • Crear una base de datos en PostgreSQL y ejecutar el esquema.sql para crear las tablas
  • Seguir los pasos siguientes de cada juego de datos (ver carga.sql y migracion.sql)
  • Configurar la cadena de conexión a la base de datos en el modelo app_settings.py

Juegos de Datos Públicos


Ultimamente trabajé en procesar los datos de las P.A.S.O. 2013 -elección primarias para senadores y diputados nacionales en las 24 provincias-, publicados en el Portal de Datos Públicos

Para más información ver carpeta 2013-primarias:
El juego de datos es bastante interesante ya que está a nivel de mesa (fuente de la información), por lo que incluye 88.463 mesas procesadas con 1.846.369 registros de resultado (votos por mesa, por cada lista para los cargos de diputados + sendadores).
Recordar que es un recuento provisorio por lo que los datos no son definitivos y no están todas las planillas cargadas (90.670 mesas habilitadas en total). El total de electores habilitado fue de 30.573.183.
Para ver los datos oficiales, dirigirse a http://www.elecciones.gov.ar/ (recuento definitivo) y http://www.resultados.gob.ar (recuento provisional).

Manejo de Imágenes de actas de mesa (telegramas / faxes):


La página de Consulta de Telegrama / Planilla permite revisar, cargar y corregir los votos por cargo por lista en cada mesa escrutada.
Para el procesamiento de las imágenes se desarrollaron dos programas auxiliares (scripts):
  • faxes.sh: para extraer las imágenes del PDF y convertirlas al formato TIFF optimizado (CCITT grupo 4) se utilizaron las herramientas pdfimages y ppm2tiff
  • faxes.py: para incorporar las imágenes a PostgreSQL (campo BYTEA), usando python, psycopg2 (adaptador BINARY) y una consulta para determinar la mesa según el nombre de archivo.
NOTA: si se utiliza una versión antigua de PIL (Python Imaging Library), es necesario convertir las imágenes a PNG, perdiendo un poco de eficiencia en la compresión, pero ganando compatibilidad.

Para mostrar las imágenes, se obtiene la misma desde la base de datos y se genera una miniatura con PIL (ver thumbnail en definitivo.py) para ser descargada por el navegador web.

El tamaño total de la base de datos, incluyendo las imágenes de las planillas, es de 6.4 GB

Consultas no triviales con el "ORM" de web2py


Gracias a características declarativas del framework web2py, se pueden realizar consultas relativamente complejas y arbitrarias, en este caso con agrupaciones, tablas anidadas y criterios de búsquedas particulares, de manera programada en Python, sin necesidad de recurrir a escribir SQL puro.
A continuación se extrae un ejemplo de código para totalizar los votos dada una ubicación (por la URL se especifican los identificadores de ubicación, cargo y estado de las planillas):

# constantes (jerarquía de ubicaciones)
CLASES = ['Pais', 'Provincia', 'Departamento', 'Circuito', 'Mesa']

# alias de tablas:       

p = msa.planillas
d = msa.planillas_det
l = msa.listas

# armo la consulta base con los criterios de búsqueda
query = p.id_planilla == d.id_planilla
query &= d.id_lista == l.id_lista
query &= p.id_estado == request.args[3]
query &= d.id_cargo == request.args[0]
query &= l.positivo == True

# armo la consulta "recursiva" (árbol) para tener las ubicaciones y planillas

# (up -> ubicación padre, uh -> ubicación hija)
# p/ el alias de cada tabla se usa el nombre de la clase (depto, mesa, etc.)
up = msa.ubicaciones.with_alias(ubicacion.clase)
query &= up.id_ubicacion == id_ubicacion
for clase in CLASES[CLASES.index(ubicacion.clase)+1:]: 
      uh = msa.ubicaciones.with_alias(clase)
      query &= uh.id_ubicacion_padre == up.id_ubicacion
      up = uh
query &= p.id_ubicacion == up.id_ubicacion
        
# campo suma total:
suma_votos = d.votos_definitivos.sum()
    
# ejecuto la consulta:
resultado = msa(query).select( 
              d.id_lista.with_alias("id_lista"),
              l.nro_lista.with_alias("nro_lista"), 
              l.descripcion.with_alias("descripcion"), 
              l.idx_fila.with_alias("idx_fila"), 
              l.descripcion_corta.with_alias("descripcion_corta"),
              l.color.with_alias("color"),
              suma_votos.with_alias("suma_votos"),
              groupby=(d.id_lista |
                        l.nro_lista | 
                        l.descripcion |
                        l.idx_fila |
                        l.descripcion_corta |
                        l.color),
              orderby= ~suma_votos | l.idx_fila
             )


La salida puede observarse en la Página de Resultados por Ubicación  que permite obtener la suma total de votos agrupada por lista y cargo, para un País / Dpto / Mesa):
Esta consulta en Python generará una consulta SQL similar a la siguiente:

SELECT planillas_det.id_lista, listas.nro_lista, listas.descripcion, 
       SUM(planillas_det.votos_definitivos) AS suma_votos 
FROM planillas, planillas_det, listas, 
     ubicaciones AS provincia, 
     ubicaciones AS departamento, 
     ubicaciones AS circuito, 
     ubicaciones AS mesa 
WHERE planillas.id_planilla = planillas_det.id_planilla
  AND planillas_det.id_lista = listas.id_lista 
  AND planillas.id_estado = 'Publicada' 
  AND planillas_det.id_cargo = 1
  AND listas.positivo = 'T' 
  AND provincia.id_ubicacion = 1 
  AND departamento.id_ubicacion_padre = provincia.id_ubicacion
  AND circuito.id_ubicacion_padre = departamento.id_ubicacion 
  AND mesa.id_ubicacion_padre = circuito.id_ubicacion 
  AND planillas.id_ubicacion = mesa.id_ubicacion
GROUP BY planillas_det.id_lista, listas.nro_lista, listas.descripcion 
ORDER BY SUM(planillas_det.votos_definitivos) DESC, listas.nro_lista;

Consultas Recursivas con PostgreSQL:


La consulta anterior, podría escribirse de manera más flexible en PostgreSQL utilizando Expresiones de Tablas Comunes (CTE) para consultas recursivas (clausula WITH).
En el siguiente ejemplo, se utiliza un termino no recursivo para obtener la ubicación base (id_ubicacion =1), unido luego con el termino recursivo que busca las ubicaciones hijas de cada padre:

WITH RECURSIVE U(id_ubicacion, descripcion, clase) AS (
    SELECT UP.id_ubicacion, UP.descripcion, UP.clase 
      FROM ubicaciones UP 
     WHERE UP.id_ubicacion = 1
  UNION ALL
    SELECT UH.id_ubicacion, UH.descripcion, UH.clase
      FROM U, ubicaciones UH 
     WHERE UH.id_ubicacion_padre = U.id_ubicacion 
  )
SELECT L.id_lista, P.id_partido, L.nro_lista, L.descripcion, P.descripcion,
       SUM(PD.votos_definitivos) AS suma_lista
FROM U, planillas PL, planillas_det PD, listas L, partidos P
WHERE PL.id_ubicacion = U.id_ubicacion
  AND PL.id_planilla = PD.id_planilla
  AND PD.id_lista = L.id_lista 
  AND L.id_partido = P.id_partido
  AND PD.id_cargo = 2
GROUP BY P.id_partido, L.id_lista, L.nro_lista, L.descripcion, P.descripcion 
ORDER BY 6 DESC;

Si bien en este caso no cambia el rendimiento ni el resultado, podría ser útil para otras elecciones en que las jerarquías de ubicaciones no tengan los mismos niveles de agrupación (por ej., hay provincias que podrían estar divididas por secciones electorales, municipios, comunas, departamentos, con mayor o menor de detalle, generalmente hasta el establecimiento y mesa)

Es interesante ver con el comando EXPLAIN el análisis del plan de ejecución de la consulta para detectar posibles optimizaciones , como podría ser agregar el siguiente indice:

CREATE INDEX planillas_det_id_cargo_id_idx ON planillas_det(id_cargo, id_planilla)


Funciones de Ventana con PostgreSQL:


Otra característica de PostgreSQL que puede ser útil en estos casos, son las funciones que calculan en base a una partición de los datos (similar a un agrupamiento).
Por ejemplo, para obtener la cantidad de votos por cada partido (además de la suma de cada lista interna), se puede agregar la expresión SUM(SUM(PD.votos_definitivos)) OVER (PARTITION BY L.id_partido) AS suma_partido  a la consulta anterior:

WITH RECURSIVE U(id_ubicacion, descripcion, clase) AS (
    SELECT UP.id_ubicacion, UP.descripcion, UP.clase 
      FROM ubicaciones UP 
     WHERE UP.id_ubicacion = 1
  UNION ALL
    SELECT UH.id_ubicacion, UH.descripcion, UH.clase
      FROM U, ubicaciones UH 
     WHERE UH.id_ubicacion_padre = U.id_ubicacion 
  )
SELECT L.id_lista, P.id_partido, L.nro_lista, L.descripcion, P.descripcion,
       SUM(PD.votos_definitivos) AS suma_lista,
       SUM(SUM(PD.votos_definitivos)) OVER (PARTITION BY L.id_partido) AS suma_partido
FROM U, planillas PL, planillas_det PD, listas L, partidos P
WHERE PL.id_ubicacion = U.id_ubicacion
  AND PL.id_planilla = PD.id_planilla
  AND PD.id_lista = L.id_lista 
  AND L.id_partido = P.id_partido
  AND PD.id_cargo = 2
GROUP BY P.id_partido, L.id_lista, L.nro_lista, L.descripcion, P.descripcion 
ORDER BY 7 DESC, 6 DESC;

Cuyo resultado es:


Agradecimientos y trabajo a futuro


Esta aplicación fue posible gracias a la colaboración de la empresa MSA y al grupo de trabajo de datos públicos / software libre del foro de la Agenda Digital, por haber hecho posible la publicación del código fuente y el acceso a los datasets respectivamente.

En el futuro posiblemente publicaremos un análisis más exhaustivo, extendiendo el apunte sobre optimización de consultas y estadísticas en el sitio del Grupo de Usuarios de PostgreSQL Argentina: http://www.postgresql.org.ar/trac/wiki/OptimizarRendimiento

Seguramente se presentará el trabajo en la próxima jornada PostgreSQL: PgDay Argentina 2013, donde se preparará un taller para experimentar con los datos, analizar el rendimiento y proponer mejoras.

viernes, 21 de junio de 2013

Software Libre aplicado en materias de Analisis de Sistemas y Redes Informaticas

Asignaturas Ciclo Lectivo 2013

Este año, en el Instituto Tecnológico Blaise Pascal estoy dando las siguientes materias, en las cuales usamos software libre como eje de los contenidos:
  • Bases de datos: Modelo Entidad Relación; Modelo Relacional; Lenguajes de de consulta (SQL y Algebra Relacional). Administración y Optimización. Herramientas: PostgreSQL
  • Sistemas Operativos: conceptos básicos e interprete (shell) GNU/Linux; Sistemas de Archivos. Procesos, sincronización e intercomunicación. Manejo de Memoria. Primitivas. Herramientas: Debian/Ubuntu y Python
  • Interconectividad (Redes):  Modelos de Referencia OSI. Ethernet. Pila de Protocolos TCP/IP. Sockets. Aplicaciones. Configuración y administración de routers y gateways. Herramientas: Debian/Ubuntu y Python (entre otras)
  • Práctica Profesional (proyecto final de carrera): Gestión de proyectos. Ingeniería de Software. Herramientas: Python, Mercurial, web2py, PostgreSQL
En las páginas respectivas podrán encontrar la información completa, incluyendo un resumen de la planificación anual, programa de contenidos, referencias bibliográficas, prácticas y modelos de examen.

Las materias corresponden a la "Tecnicatura Superior en Analisis de Sistemas" (Resolución Nº5817/03) y "Tecnicatura superior en Redes Informáticas" (Resolución Nº6164/03).
Junto a otras como Programación I y II dictadas por otros profesores, se inscriben en el Proyecto Curricular Institucional orientado al software libre, en el cual venimos trabajando desde 2010 entre docentes y directivos para organizar y profundizar los contenidos teóricos y prácticos.

"Bases de Datos" no ha sufrido modificaciones significativas desde 2009.
La materia E.D.I. 3, que daba desde 2009 a 2012, se unificó en "Práctica Profesional".  Aquellos alumnos que vayan a rendir el final, por favor contactar con la nueva profesora ya que deben estudiar los contenidos de este año.

Pueden ver algunos proyectos de "Práctica Profesional" del año anterior en el sitio de PyCon Argentina 2012 (Póster de trabajos estudiantiles) y en el repositorio público de la materia.

Referencias bibliográficas libres

La mayoría de los materiales de consulta utilizados son libre y abiertos, pudiendo citar principalmente:
  • Máster Universitario en Software Libre (Universitat Oberta de Catalunya): Si bien es una carrera de postgrado, los contenidos seleccionados son adecuados al nivel terciario y muy bien organizados. La modalidad "virtual" a distancia de la UOC ayuda a una estructura de los documentos simple y gradual, facilitando la lectura y práctica auto-dirigida por parte del alumno, para complementar y profundizar los temas presentados en clase. Además de los contenidos básicos, incluyen lecturas adicionales muy relevantes. Los materiales docentes y programas de estudio pueden consultarse en el sitio  UOC OpenCourseWare. Licencia del sitio: CC BY-NC-SA. Licencia de los documentos: GNU FDL.
  • Proyecto Alqua.org (editorial virtual libre): "Alqua es una comunidad dedicada a la recopilación de libros y material libre. En concreto, han publicado varios libros y manuales de física, matemáticas e informática, que se pueden descargar, modificar y copiar libremente". Los libros son más que nada apuntes de algunas materias, pero lamentablemente algunos han sido retirados por no estar terminados o corregidos. Licencia de los documentos: CC BY-NC-SA
  • Luis Miguel Armendáriz (Güimi): "Elaboración propia utilizando principalmente apuntes de trabajo, de distintas asignaturas universitarias, trabajos del profesor Montañana publicados en RedIRIS y artículos de la wikipedia (http://www.wikipedia.org)". Recopilaciones muy interesantes y completas para utilizar como material de consulta. Licencia del sitio y los documentos: CC BY-SA. Ver su página de documentación para el listado completo.
  • Latinux Press: "Consorcio de Cooperación Internacional que impulsa y desarrolla soluciones basadas en Software Libre y Tecnologías Abiertas". Traducción del libro de web2py al español.
  • Grupo de Usuarios de PostgreSQL Argentina: El sitio incluye una recopilación de articulos y traducciones del manual oficial, que fuí realizando en estos años para la materia Bases de Datos. Ver sección Documentación para más información.
Adicionalmente, los siguientes recursos también han sido útiles (aunque no son usados directamente en estas materias):

Temas a futuro

  • Traducción de la Documentación oficial al Español (Python y PostgreSQL principalmente, las man pages ya están traducidas -la mayoría...-): si bien el inglés es la "lingua franca" en estos temas de tecnología, sería importante tener los manuales oficiales traducidos, sobre todo porque las materias se dan al mismo tiempo que "Inglés Técnico" y por consiguiente puede llegar a ser una complicación, mas que nada si los alumnos usan la traducción automática de google que en la mayoría de las veces es muy imprecisa. En algún momento espero poder retomar la propuesta de internacionalización par Python como punto de partida, y volver a colaborar más activamente con las iniciativas de traducción existentes para PostgreSQL.
  • En el mismo sentido, sería interesante una adaptación de algunos materiales mencionados para el lenguaje Python, unificando los contenidos ya que actualmente estan basados en Java, C o Pascal. También sería útil completar algunos temas (como normalización de bases de datos), de los cuales todavía no se encuentra documentación libre y abierta en castellano. 
  • Python y PostgreSQL tienen herramientas y entornos de desarrollo simples como IDLE y PgAdmin3. Si bien son suficientes para presentar los contenidos de la tecnicatura, posiblemente sería conveniente mejorarlos aún más para que sean más simples y útiles para otros tipos de público. En este sentido, ver el proyecto rad2py en el que busco integrar de los temas de programación (y depuración y diseño de interfases), bases de datos y práctica profesional (repositorios, calidad, etc.). 
  • En paralelo, también estoy trabajando en proyectos como gui2py (fork renovado de PythonCard para desarrollo de interfases visuales), y en seguir mejorando web2py, ambos diseñados no solo para ser utilizados con fines educativos, sino también para brindar herramientas completas más amigables para aquellos que vienen desde otros lenguajes (PHP, Visual Basic, Delphi, etc.) y quieren dar sus primeros pasos con Python.

sábado, 23 de febrero de 2013

Novedades AFIP / ANMAT: WSLPG y TrazaMedV2

AFIP:


Liquidación Primaria Electrónica de Granos:


Esta en desarrollo la interfaz para el webservice WSLPG (Liquidación Primaria de Granos):
Operaciones de compraventa de granos no destinados a la siembra.
Régimen de emisión de comprobantes.
Norma conjunta Resolución General Nº 1.593 (AFIP) y Resolución Nº 456
(ex SAGPyA), Resoluciones Generales Nº 1.415, Nº 2.205 y Nº 2.485, sus respectivas modificatorias y complementarias.
Para más información ver:
Proximamente liberaremos un instalador y la documentación actualizada  (actualmente el servidor de AFIP parece no estar completamente funcional ya que devuelve '500: Error General de Aplicacion.') 

Certificados de seguridad:


Afip ha cambiado los certificados de seguridad de los servidores de producción (webservices):

Según la Especificación Técnica WSAA 1.2.2, la aplicación que consuma los webservices debe verificar el canal de comunicación seguro usando los CA (Certifiado de las Autoridades Certificantes).
Para ello se puede usar el transporte (wrapper) pycurl, usando el archivo de informacion provisto: afip_ca_info.crt (recientemente actualizado por este cambio). Más info en la documentación.

ANMAT:


Trazabilidad de Medicamentos: Especificación Técnica v2


Desde hace algunos días tenemos conocimiento y estamos trabajando en  una nueva versión del webservice de trazabilidad de medicamentos (TrazaMed), que  incluye los siguientes métodos (capacidades) nuevos:
  • SendConfirmaTransacc(..., p_ids_transac, f_operacion): Confirma la  recepción de un medicamento 
  • SendAlertaTransacc(..., p_ids_transac_ws): Alerta un medicamento,  acción contraria a “confirmar la transacción”. 
  • GetTransaccionesNoConfirmadas(...): Trae un listado de las  transacciones que no están confirmadas 
Esto se suma a SendCancelacTransacc, SendMedicamentosDHSerie y  SendMedicamentosFraccion que se habían agregado con anterioridad.

Pueden ver los nuevos cambios en la documentación:

http://www.sistemasagiles.com.ar/trac/wiki/TrazabilidadMedicamentos

Los ajustes iniciales al código fuente ya están publicados:

https://code.google.com/p/pyafipws/source/browse/trazamed.py

Según comentarios, esta nueva operatoria sería obligatoria a partir  del 1 de Marzo de 2013.

La próxima semana estaremos publicando una nueva versión de los  instaladores y ejemplos.
En cuanto tengamos más información ampliaremos comunicandolo por la lista de correo

Licencia y Aviso Legal

CC BY-SACopyright (C) 2009 - 2013 Mariano Reingart reingart@gmail.com - Visite el sitio http://reingart.blogspot.com/ para novedades. Salvo indicación contraria, el texto de esta página está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0 Unported; podrían ser aplicables cláusulas adicionales.

Se solicita mantener el aviso de copyright (enlazando al texto original), compartir las obras derivadas bajo la misma licencia, y si es, posible comunicando al autor cualquier mejora. No utilizar logotipos ni marcas sin la debida autorización de sus titulares.

Toda información es proporcionada a Titulo Informativo y se entrega como está, sin garantías explícitas ni implicitas de ningún tipo, incluyendo sin limitación, pérdida de ganancias, interrupción de negocios, pérdida de programas u otros datos en sistemas de computación o cualquier otro reclamo. Al usarla acepta hacerlo bajo su propia responsabilidad, conociendo la normativa y reglamentaciones existentes. En caso de controversias respecto del presente, usted acepta presentarlas y resolverlas exclusivamente en la jurisdicción de los Tribunales Ordinarios Civiles y Comerciales del Departamento Judicial de Morón, Provincia de Buenos Aires, Argentina, renunciando expresamente a cualquier otro fuero que pudiere corresponder.