tag:blogger.com,1999:blog-23049086458148875242024-02-19T19:42:08.582-03:00Mariano ReingartTemas, intereses y opiniones personales (lo que dé...)Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-2304908645814887524.post-72587021976109358802016-05-04T07:00:00.000-03:002017-04-15T00:20:37.981-03:00Diplomatura abierta en Software Libre<h3>
<div style="font-size: medium; font-weight: normal;">
<br /></div>
</h3>
<div>
El año pasado se inició la <a href="https://www.softwarelibre.com.ar/diplomatura/" target="_blank">Diplomatura en Software Libre</a> que impulsamos en la <a href="http://ude.edu.ar/" target="_blank">Universidad del Este</a> (La Plata). La primer promoción de estudiantes ya completaron los cursos, destacándose académicamente los siguientes trabajos finales integradores:</div>
<ul>
<li>María Andrea Vignau: <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/9gC1zXWdmsZZE0p" target="_blank">"OpenLex: Sistema para la gestión de estudios jurídicos"</a> (modalidad desarrollo)</li>
<li>Francisco Silva Garcés: <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/TthE0c85qiIO20E" target="_blank">"Un caso de implementación en la administración pública en el Ecuador"</a> (modalidad investigación)</li>
</ul>
<div>
Felicitamos y agradecemos a todos los participantes (tanto estudiantes como docentes, tutores colaboradores, personal de la universidad y ONGs: <a href="http://www.solarargentina.org/" target="_blank">SoLAr</a>, <a href="http://www.cadesol.org.ar/diplomatura-en-software-libre/" target="_blank">CAdeSoL</a>, <a href="http://facttic.org.ar/noticias/la-universidad-del-este-ofrece-una-diplomatura-en-software-libre" target="_blank">FACTTIC</a>) que hicieron posible la primer edición.</div>
<div>
Como contribución a la comunidad y para aquellos interesados, a continuación se detalla más información sobre la misma, incluyendo la <a href="http://ude.edu.ar/extension/diplomaturas/software-libre-combinada/" target="_blank">Edición 2016</a> que está comenzando este mes (próximo encuentro 14/05).</div>
<div class="western" lang="es-ES" style="margin-bottom: 0cm;">
<h4>
<u><b>Organización</b></u></h4>
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.<br />
<br />
Primer
cuatrimestre (Mayo, Junio, Julio, Agosto):
<br />
<br />
<div class="western" lang="es-ES" style="margin-bottom: 0.2cm;">
<table cellpadding="4" cellspacing="0" style="width: 646px;">
<colgroup><col width="155"></col>
<col width="229"></col>
<col width="235"></col>
</colgroup><tbody>
<tr>
<td style="border-bottom: 1.00pt solid #808080; border-left: 1.00pt solid #808080; border-right: none; border-top: 1.00pt solid #808080; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="155"><div align="center" class="western" lang="es-ES">
Seminario Sw.
Libre<br />
(1 mes)</div>
</td>
<td style="border-bottom: 1.00pt solid #808080; border-left: 1.00pt solid #808080; border-right: none; border-top: 1.00pt solid #808080; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="229"><div align="center" class="western" lang="es-ES">
Bases de Datos
PostgreSQL<br />
(1 mes y medio)</div>
</td>
<td style="border: 1.00pt solid #808080; padding: 0.1cm;" width="235"><div align="center" class="western" lang="es-ES">
Redes de
computadoras GNU/Linux (1 mes y medio)</div>
</td>
</tr>
<tr>
<td colspan="3" style="border: 1.00pt solid #808080; padding: 0.1cm;" width="636"><div align="center" class="western" lang="es-ES">
Programación I
Python<br />
(4 meses)</div>
</td>
</tr>
</tbody></table>
<div class="western" lang="es-ES">
<br /></div>
<div class="western" lang="es-ES">
<div style="text-align: center;">
<div style="text-align: left;">
Segundo cuatrimestre (Septiembre,
Octubre, Noviembre, Diciembre):</div>
<div style="text-align: left;">
<br /></div>
</div>
</div>
<table cellpadding="4" cellspacing="0" style="width: 645px;">
<colgroup><col width="158"></col>
<col width="230"></col>
<col width="231"></col>
</colgroup><tbody>
<tr>
<td style="border-bottom: 1.00pt solid #808080; border-left: 1.00pt solid #808080; border-right: none; border-top: 1.00pt solid #808080; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="158"><div align="center" class="western" lang="es-ES">
Ingeniería de Sw.
Libre (1 mes)</div>
</td>
<td style="border: 1.00pt solid #808080; padding: 0.1cm;" width="230"><div align="center" class="western" lang="es-ES">
Sistemas Operativos
GNU/Linux<br />
(1 mes y medio)</div>
</td>
<td style="border: 1.00pt solid #808080; padding: 0.1cm;" width="231"><div align="center" class="western" lang="es-ES">
Desarrollo Web HTML
web2py<br />
(1 mes y medio)</div>
</td>
</tr>
<tr>
<td colspan="3" style="border: 1.00pt solid #808080; padding: 0.1cm;" width="635"><div align="center" class="western" lang="es-ES">
Programación II C
C++ Python<br />
(4 meses)</div>
</td></tr>
</tbody></table>
<br />
Los <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/bfqB6V0ObhMThSU" target="_blank">temarios tentativos y planificaciones iniciales</a> 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.<br />
<br />
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).<br />
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.<br />
<br />
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.<br />
<div>
<br /></div>
<div>
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.</div>
<div>
<br /></div>
<h4>
Encuentros Presenciales:</h4>
<div>
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):<br />
<ul>
<li>Presentación expositiva de los temas teóricos</li>
<li>intervalo (café) </li>
<li>Trabajo práctico individual y grupal en PC</li>
<li>almuerzo libre</li>
<li>Laboratorio de programación en PC</li>
<li>intervalo (café)</li>
<li>Actividad sobre el trabajo final integrador y cierre</li>
</ul>
</div>
<div>
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.</div>
</div>
</div>
<h4>
Materiales libres y abiertos:</h4>
<div>
Principalmente se utiliza la bibliografía libre y abierta publicada por la <a href="http://ocw.uoc.edu/" target="_blank">Universitat Oberta de Catalunya</a> (UOC OpenCourseWare):<br />
<ul>
<li><a href="http://ocw.uoc.edu/informatica-tecnologia-y-multimedia/introduccion-al-software-libre/XP06_M2101_01492.pdf" target="_blank">Introducción al Software Libre</a></li>
<li><a href="http://materials.cv.uoc.edu/cdocent/ETSNANU__D907A9_KM9J.pdf" target="_blank">Sistema operativo GNU/Linux Básico</a></li>
<li><a href="http://www.uoc.edu/masters/oficiales/img/913.pdf" target="_blank">Bases de Datos</a> (Libres)</li>
<li><a href="http://materials.cv.uoc.edu/cdocent/W2YEM0UV3EIOG3E91A0X.pdf" target="_blank">Redes de Computadores</a> (Internet)</li>
<li><a href="http://cv.uoc.es/cdocent/NCF24UBLAGGISIWI3UC9.pdf" target="_blank">Desarrollo de Aplicaciones Web</a></li>
<li><a href="http://cv.uoc.es/cdocent/H7U0076_0F21XZ3703M6.pdf" target="_blank">Introducción al Desarrollo de Software</a></li>
</ul>
</div>
<div>
Todos los contenidos están fuertemente orientados al Lenguaje de Programación Python, por lo que se utiliza el material de <a href="https://drive.google.com/file/d/0B5YeA72NbAFYTHhhWVc0TlVWUDg/view?usp=sharing" target="_blank">Algoritmos y Programación I</a> (Apunte FIUBA)<br />
<br />
También como referencias se pueden ver algunas presentaciones Universidad Carlos III de Madrid (<a href="http://ocw.uc3m.es/" target="_blank">OCW UC3M</a>) y la documentación oficial / sitios de las comunidades locales, como <a href="http://www.python.org.ar/" target="_blank">Python Argentina</a>, <a href="http://www.postgresql.org.ar/" target="_blank">PostgreSQL Argentina</a>, <a href="http://www.web2py.com.ar/examples/default/index" target="_blank">web2py</a>, etc.<br />
Para los estudiantes más avanzados, se incluyen artículos optativos sobre el kernel de linux, optimización de consultas, firewalls, etc.</div>
<div>
<br /></div>
<div>
Como complemento se recorren apuntes propios y trabajos académicos (desarrollados al cursar la Maestría de Software Libre de la UOC):<br />
<ul>
<li><a href="https://docs.google.com/document/d/1bEXm3zehjVJ2uCD0tHfEeh2MXuUKh4SSr4H6bRJZ00o/" target="_blank">Plan de Migración al Software Libre</a> (hipotético)</li>
<li><a href="https://docs.google.com/document/d/15wzdtW2nMjLUFce4O7p8ohsQrL9LWqmxhzGk8ihHH4g" target="_blank">Proyecto de Negocio con Software Libre</a> (hipotético)</li>
<li><a href="https://docs.google.com/document/d/1CsctfPC0QGQ116UAVNHHQ6UXzuwKmQyOgW95jM_D0zI/" target="_blank">Apunte sobre Licenciamiento de Software Libre</a> (estudio comparado p/ Argentina)</li>
</ul>
<div>
Para el curso "Ingeniería del Software Libre" se presentan metodologías ágiles ("<a href="http://www.proyectalis.com/wp-content/uploads/2008/02/scrum-y-xp-desde-las-trincheras.pdf" target="_blank">Scrum y XP desde las Trincheras</a>"), el Proceso de Software Personal (<a href="http://www.sei.cmu.edu/tsp/tools/student/" target="_blank">materiales de estudio autodidacta</a>), entre otros materiales y recursos.</div>
</div>
<div>
A modo de ejemplo, se utilizan como referencia varios de los temas investigados en mi tesis de la maestría: "<a href="http://openaccess.uoc.edu/webapps/o2/bitstream/10609/40394/6/reingartTFM0115memoria.pdf" target="_blank">Desarrollo rápido de software libre de alta calidad</a>", entre otras lineas de trabajo.</div>
<div>
<h4>
Actividades y Trabajos Prácticos:</h4>
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.<br />
<div>
<br /></div>
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.<br />
<br />
Se proveen ejercicios modelos y ejemplos concretos, como la Bases de Datos <a href="http://linux.dell.com/dvdstore/" target="_blank">Dell DVD Store 2</a>, tutoriales de programación, sitios y herramientas interactivas, etc.<br />
<br />
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.<br />
<br />
<div>
Para las prácticas más técnicas (programación, bases de datos, redes/sistemas operativos) hemos implementado un "<a href="https://www.softwarelibre.com.ar/moodle/" target="_blank">Laboratorio Virtual de Software Libre</a>" en un portal educativo abierto a la comunidad: <a href="http://www.softwarelibre.com.ar/moodle" target="_blank">www.softwarelibre.org.ar/moodle</a><br />
Utiliza el módulo "<a href="https://moodle.org/plugins/mod_vpl">VPL</a>" 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):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGYZmSzyrnyV0hOTT8ptnFQIZMU_oTCnIrJsWzfeeYOUr-TvXDNp83dXOtHb2bPgAeIyurp4820fE2vXBFpVEdy29gemq8-thVURH0u0af62xBoSLX_YCXjuxb9TGNQlFZrCdZsogeJhE/s1600/moodle_vpl.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGYZmSzyrnyV0hOTT8ptnFQIZMU_oTCnIrJsWzfeeYOUr-TvXDNp83dXOtHb2bPgAeIyurp4820fE2vXBFpVEdy29gemq8-thVURH0u0af62xBoSLX_YCXjuxb9TGNQlFZrCdZsogeJhE/s640/moodle_vpl.png" width="640" /></a></div>
<br /></div>
<div>
En este sentido, estamos avanzando en un curso comunitario masivo y en linea para enseñar programación de computadoras ("Python para Zombis": <a href="http://bit.ly/pyzombis">documento de trabajo</a> y <a href="http://bit.ly/PyZombis2015">presentación resumen</a>), traducción al Español de materiales como <a href="https://github.com/reingart/pymotw/commits/master" target="_blank">Python Module of The Week</a>, etc. Ver abajo los exámenes resueltos con más información al respecto.<br />
<br />
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: <a href="https://github.com/UniversidadDelEste">https://github.com/UniversidadDelEste</a><br />
<h4>
Exámenes:</h4>
</div>
</div>
<div>
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.<br />
Generalmente se realizan a distancia vía un examen domiciliario (con entrega por el Campus Virtual):</div>
<div>
<ol>
<li><b>Seminario de Software Libre:</b> investigación-acción sobre Wikipedia (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/qN3x9n48t0Pb1Mm" target="_blank">PDF</a>)</li>
<li><b>Bases de Datos PostgreSQL:</b> desarrollar un mini-proyecto sobre datos abiertos (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/QG80Dbzi1NLar1w" target="_blank">PDF</a>)</li>
<li><b>Redes de computadoras GNU/Linux:</b> redactar un capítulo/sección de libro libre (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/i7jkqZ5riTNWcLV" target="_blank">PDF</a>)</li>
<li><b>Programación I Python:</b> desarrollar una actividad de evaluación automatizada (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/QtCMlAyrzrAX2VR" target="_blank">PDF</a>)</li>
<li><b>Sistemas Operativos GNU/Linux:</b> presentación multimedia sobre temas a elección (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/wAR4FNdKQiSRniX" target="_blank">PDF</a>)</li>
<li><b>Desarrollo Web:</b> trabajar sobre una aplicación web2py o similar (PDF)</li>
<li><b>Programación II C+Python:</b> analizar el proyecto hello de la Free Software Foundation (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/wAR4FNdKQiSRniX" target="_blank">PDF</a>) </li>
<li><b>Ingeniería de Software Libre:</b> trabajo final en forma de artículo (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/L1m62E9B4ym07tM" target="_blank">PDF</a>)</li>
</ol>
</div>
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).<br />
<br />
En la <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo" target="_blank">carpeta pública</a> se encuentran ejemplo variados de exámenes de programación resueltos (Python), desde ejercicios simples (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo" target="_blank">PDF</a>, <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo/download?path=%2F&files=silva_garc%C3%A9s.odt" target="_blank">ODT</a>), intermedios (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo/download?path=%2F&files=vignau.odt" target="_blank">ODT</a>, <a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo/download?path=%2F&files=vogel.odt" target="_blank">ODT</a>) y más avanzado (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/f1MGmoczT9GulOo/download?path=%2F&files=edvm_ExamenProgramacion1.pdf" target="_blank">PDF</a>). 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.<br />
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 " (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/n3ev36UCKmhIZWz/download" target="_blank">PDF</a>), "Elecciones CABA 2013" (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/01iPGfzWymAUKQK/download" target="_blank">PDF</a>), "Censo Hogares y Viviendas" (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/kqz3g1T9Oq5rbm5/download" target="_blank">PDF</a>), "Cajeros Automáticos CABA" (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/LnH3kR703hNuge3/download" target="_blank">PDF</a>) y "Trabajo Práctico" (<a href="https://www.softwarelibre.com.ar/owncloud/index.php/s/7jJXcZm7EDtMEpg/download" target="_blank">ZIP</a>), entre otros.<br />
<br />
Gracias a los alumnos por compartirlos dentro de los lineamientos de la dipolomatura para generar recursos educativos libres y abiertos.<br />
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.<br />
<br />
<h3>
Edición 2016:</h3>
<br />
Para 2016 esta abierta la inscripción<br />
<br />
<a href="http://ude.edu.ar/extension/diplomaturas/software-libre-combinada/">http://ude.edu.ar/extension/diplomaturas/software-libre-combinada/</a><br />
<br />
También buscamos profesores y tutores que estén interesados en colaborar con el equipo docente (para más información ver <a href="http://43jaiio.sadio.org.ar/proceedings/STS/859-Reingart.pdf" target="_blank">propuesta académica completa</a>)<br />
Proximamente se publicará un repositorio institucional con todos los trabajos académicos, y anunciaremos más novedades (invitados, eventos, etc.) vía <a href="https://twitter.com/softlibre" target="_blank">@softlibre</a> y en el <a href="https://www.softwarelibre.com.ar/" target="_blank">portal</a>.<br />
Desde ya se agradece difusión y toda sugerencia es bienvenida<br />
<br />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comUniversidad del Este, Calle 2 684, La Plata, Buenos Aires, Argentina-34.9073785 -57.948300499999959-34.9074295 -57.948379499999959 -34.9073275 -57.94822149999996tag:blogger.com,1999:blog-2304908645814887524.post-34553840859409415472014-12-31T09:00:00.000-03:002015-01-03T15:20:46.283-03:00Entrevista para PyDev of the Week<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>
<a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2011/01/mechish2_fin-150x150.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://www.blog.pythonlibrary.org/wp-content/uploads/2011/01/mechish2_fin-150x150.png" /></a>Aprovechando el cierre del año, y a modo de resumen, a continuación transcribo una entrevista (traducida) que me realizó <a href="http://www.blog.pythonlibrary.org/about/" target="_blank">Mike Driscoll</a> para su blog "<a href="http://www.blog.pythonlibrary.org/" target="_blank">Mouse vs Python</a>":<br />
<div>
<br /></div>
<div>
<a href="http://www.blog.pythonlibrary.org/2014/12/29/pydev-of-the-week-mariano-reingart/">http://www.blog.pythonlibrary.org/2014/12/29/pydev-of-the-week-mariano-reingart/</a></div>
<div>
<br /></div>
<div>
<h2>
"Desarrollador Python" de la Semana: Mariano Reingart</h2>
<div>
<br /></div>
<h3>
¿Puedes contarme un poco sobre ti (hobbies, educación, etc)?:</h3>
<div>
<br /></div>
Soy programador independiente y docente, casado con dos hijos pequeños.</div>
<div>
<br />
Comencé a programar cuando era un chico y mi padre compró una ZX Spectrum TK-90 a fines de los '80.<br />
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.<br />
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.<br />
<br />
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).<br />
Mi primer experiencia "open source" fue desarrollando un <a href="https://docs.google.com/leaf?id=0B__UYqYT4LNaMzdiODk0YjUtZWEyYi00ZTliLTgwYTctZTQxNWE5OTMwN2Mx&hl=en">modulo para el kernel de Linux</a> y así usar la linea telefónica dedicada de 128Kps (incluso tuvimos que importar la placa de comunicaciones); y un <a href="https://docs.google.com/uc?id=0B__UYqYT4LNaNTc3YWNkMzQtMzM4MC00Zjg1LWI0MzEtMmRkYzQwOWI1M2Ni&export=download&hl=en">controlador de kernel de ucLinux</a> para PiCoTux (una micro-computadora embebida corriendo Linux).<br />
También, di mis primeros pasos en la migración de bases de datos a PostgreSQL y trabajando con los primeros dispositivos "WiFi".<br />
<br />
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.<br />
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).<br />
<br />
Actualmente estoy terminado la Maestría en Software Libre (Universidad Abierta de Cataluña), y el Profesorado en Disciplinas Industriales / Docencia Superior (UTN - INSPT).<br />
<div>
<br />
<h3>
¿Por qué comenzaste a utilizar Python?</h3>
<br />
Empecé a usar python en los '00, buscando alternativas a Visual Basic.<br />
Lo elegí para mi tesis de grado en 2006 <a href="https://docs.google.com/document/d/1tQYzvI4_2Nq5Wv6srdCZPG5Da0ZzCLpabwsYGm0db5I/edit?hl=es">"Desarrollo Rápido de Aplicaciones bajo el Proceso de Software Personal"</a><br />
<br />
Desde 2009 enseño Python en un Instituto Terciario. Comenzó en un curso pero luego acordamos (con otros profesores) implementar un <a href="http://docs.google.com/View?id=dd9bm82g_428g8zvfvdx">Proyecto Curricular Institucional orientado al software libre</a>, principalmente en las siguientes materias:<br />
<br />
<ul>
<li>"Programación I", "Programación II" (incluyendo introducciones a wxPython/web2py)</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-base-de-datos.html">Bases de Datos</a> (diseño e implementación)</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-sistemas-operativos.html">Sistemas Operativos</a> (sistemas de archivos, procesos, IPC, etc.)</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-interconectividad-redes.html">Interconectividad</a> ("Redes de Computadoras": sockets, aplicaciones de Internet, etc.)</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-practica-profesional.html">Práctica Profesional</a> (trabajo final: desarrollo de aplicaciones web)</li>
</ul>
<div>
<br /></div>
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 <a href="https://docs.google.com/document/d/1suQGQA9PVPNw_0R19fMivXS9lxc0NQrSiNq4056PlR0/edit" target="_blank">documento de trabajo</a> y <a href="http://43jaiio.sadio.org.ar/proceedings/STS/859-Reingart.pdf">articulo</a>).</div>
<div>
<br />
Felizmente, laboralmente hoy trabajo principalmente brindando planes de soporte comercial de código abierto gracias a Python, dado que desde 2008 el proyecto <a href="http://pyafipws.googlecode.com/">PyAfipWs: "factura electrónica"</a>, iniciado desde la lista de correo PyAr, la comunidad de <a href="http://www.python.org.ar/">Python Argentina</a>, creció, siendo usado por una base de usuarios relativamente grande (incluyendo grandes empresas, PyMEs y profesionales)<br />
<br />
<h3>
¿Que otros lenguajes de programación conoces y cual es tu favorito?</h3>
<br />
Obviamente Python es mi favorito, y tengo cierta experiencia en PHP, C/C++, Java y otros lenguajes.<br />
<br />
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)<br />
<br />
Ahora estoy investigando <a href="http://vb2py.sourceforge.net/">vb2py</a>, un proyecto para convertir código VB a Python.<br />
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...<br />
<br />
En el proyecto de factura electrónica, use <a href="http://sourceforge.net/projects/pywin32/">pywin32</a> (de Mark Hammond et al) para hacer componentes Python usables desde lenguajes legados (VB, VFP), y bibliotecas como <a href="https://pypi.python.org/pypi/dbf/">dbf</a> (de Ethan Furman) para interactuar con lenguajes aún más antiguos (Clipper, xBase, etc.). <br />
Recientemente también comencé a experimentar con <a href="http://www.jython.org/">Jython</a>, para usar proyectos Python desde Java. </div>
<div>
<br /></div>
<div>
<h3>
¿En que proyectos estás trabajando ahora?</h3>
<div>
<br /></div>
Para mi tésis de grado, comencé a desarrollar <a href="https://code.google.com/p/rad2py/">rad2py</a>, 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.<br />
<br />
Ahora estoy terminando la invesigación para mi tesis de maestría <a href="https://docs.google.com/document/d/1Jo-_Nf_vMeKvszEuWA24yrfrqGGU-T73cczMPSBZ9ss/edit?usp=sharing">"Desarrollo Rápido de Software Libre de Alta Calidad"</a>, 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.</div>
<div>
<br />
<h3>
¿Que bibliotecas Python son tus favoritas (del núcleo or de terceros)?</h3>
<div>
<br /></div>
Trato de usar solo la Biblioteca Estándar de Python + <a href="http://www.wxpython.org/">wxPython</a> y <a href="http://web2py.com/">web2py</a>, y adicionalmente pywin32 y dbf para ciertos proyectos, como mencioné antes.</div>
<div>
<br />
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. <br />
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.<br />
Descargo: soy uno de los desarrolladores "principales", no muy activo estos días debido a la falta de tiempo, pero he contribuido un <a href="http://reingart.blogspot.com.ar/2012/02/new-web2py-online-python-debugger.html">depurador en linea</a> y otras mejoras, co-escribí el libro <a href="https://www.packtpub.com/web-development/web2py-application-development-cookbook">"web2py app development cookbook"</a> de Packt, etc.<br />
<br />
wxPython también me merece una mención especial, el trabajo de Robin Dunn es grandioso (<a href="http://wiki.wxpython.org/ProjectPhoenix">phoenix</a> py3k!), los widgets <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/">agw widgets</a> de Andrea Gavana en puro phyton son realmente impresionantes, solo para mencionar algunos desarrolladores de dicha comunidad.</div>
<div>
También veo a wxWidgets más ortogonal y fácil de usar que otras alternativas.<br />
Este año traté de colaborar más en profundidad con una variante experimental <a href="https://wiki.wxwidgets.org/WxQt">wxQt</a>, como becario enmarcado en el <a href="http://www.google-melange.com/gsoc/proposal/public/google/gsoc2014/reingart/5629499534213120">Google Summer of Code 2014</a> (ahora es usable, incluso desde wxPython! y bajo Android al menos la parte C++ ...).<br />
<br />
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:<br />
<ul>
<li><a href="https://github.com/pysimplesoap/pysimplesoap">PySimpleSoap</a>: interfaces ad-hoc livianas para construir clientes y servidores SOAP</li>
<li><a href="http://pyfpdf.googlecode.com/">PyFPDF</a>: clase para la generación simple de PDF basada en FPDF de PHP y derivados</li>
<li><a href="https://code.google.com/p/gui2py/">gui2py</a>: un fork (bifurcación) de PythonCard (conjunto de construcción GUI visual "rápido" & simple) para evolucionarlo y modernizarlo </li>
</ul>
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 .<br />
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.<br />
<br />
<h3>
¿Hay algo más que quieras decir?</h3>
<br />
No, disculpas por las largas respuestas, pero la entrevista es irresistible :-) ...<br />
También, disculpas por mi Inglés <i>(en la entrevista original)</i>, dado que hablo español es dificultoso a veces encontrar la traducción correcta.<br />
<br />
Gracias a vos Mike por tus esfuerzos y este proyecto sobre artículos de entrevistas, y ¡gracias a toda la comunidad Python!</div>
</div>
<div>
<br /></div>
Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-61787311776241282222013-10-22T12:11:00.001-03:002013-10-22T12:17:00.048-03:001er Jornada de Informática en el Instituto Blaise Pascal<div class="separator" style="clear: both; text-align: left;">
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:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5LnzJUaTK34xYSiKNZ3FuFd6HRt3lmJiuQmjMkEuYPtUGm9EIBD-tW2iTSYlKiRQ8iSLKsk7Fc9_G-bj2zJqsCU-VWh5wUi8DN1-dxzNfziXC7CUTU3Q9uzif0IvoW658EAuyzSunQ6A/s1600/1er_jornada_informatica.jpg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5LnzJUaTK34xYSiKNZ3FuFd6HRt3lmJiuQmjMkEuYPtUGm9EIBD-tW2iTSYlKiRQ8iSLKsk7Fc9_G-bj2zJqsCU-VWh5wUi8DN1-dxzNfziXC7CUTU3Q9uzif0IvoW658EAuyzSunQ6A/s640/1er_jornada_informatica.jpg" /></a>
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Domótica: Control de una vivienda con una computadora (raspberry pi) </li>
<li>Control de asistencia con lector de códigos de barra (web2py) </li>
<li>Monitor de Anuncios: aplicación web "TV Inteligente" (web2py) </li>
<li>Software de manejo de matrices (python) </li>
<li>Robótica: Robot N6 guiado para recorrer un camino / laberinto (python) </li>
<li>Sistema de gestión académica orientado a web -trabajo final integrador- (web2py) </li>
</ul>
También se presentarán otros proyectos sobre análisis de un sistema de orientación vocacional, mercado laboral, idiomas y estadísticas.<br />
<br />
<div style="text-align: center;">
<a href="http://www.institutopascal.edu.ar/welcome/static/1er_jornada_informatica.pdf">http://www.institutopascal.edu.ar/welcome/static/1er_jornada_informatica.pdf</a></div>
<br />
La mayoría de los trabajos están enmarcados en un <a href="http://docs.google.com/View?id=dd9bm82g_428g8zvfvdx">proyecto curricular orientado al software libre</a> que venimos trabajando desde 2009 (tecnicaturas en Análisis de Sistemas y Redes Informáticas).<br />
<br />
Para más información sobre el instituto y las carreras, ver: <a href="http://www.institutopascal.edu.ar/">http://www.institutopascal.edu.ar</a><br />
<br />
Cualquier duda quedamos en contacto, desde ya todo aquel que esté interesado puede concurrir, la entrada es libre y gratuita.<br />
<br />
Próximamente se publicarán algunos vídeos sobre la jornada.<br />
<br />
Se agradece difusión,Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comPuerto Argentino 4238, González Catan, Buenos Aires, Argentina-34.7695214 -58.646747699999992-34.7695724 -58.646826699999991 -34.7694704 -58.646668699999992tag:blogger.com,1999:blog-2304908645814887524.post-87188450563784062982013-09-05T16:21:00.001-03:002013-09-05T16:25:37.389-03:00Aplicación libre para recuento de votos / escrutinio: recuento_web2py<br />
Recientemente he liberado una aplicación web, usada originalmente para el <a href="http://www.jusrionegro.gov.ar/inicio/tep/elecciones/2011/EleccionesRN2011/definitivo.datosoficiales.com/recuento/resultado/reporte/RN/GOB.html">Recuento definitivo de las elecciones provinciales de Rio Negro 2011</a>:<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_NZclFpQN4pGESLSzaMH3_zF3urnUuIUJME7m_cyLUQppuQdRB_jIPPHxgRZgdicgRQDXmGjUeWCUTRBReat97lPeofCoTKVPXy4_LQoqjunWkAHIvlEuCrtozdTyzqerf5dz4SfAntw/s1600/Tribunal+Electoral+de+la+Provincia+de+Rio+Negro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_NZclFpQN4pGESLSzaMH3_zF3urnUuIUJME7m_cyLUQppuQdRB_jIPPHxgRZgdicgRQDXmGjUeWCUTRBReat97lPeofCoTKVPXy4_LQoqjunWkAHIvlEuCrtozdTyzqerf5dz4SfAntw/s400/Tribunal+Electoral+de+la+Provincia+de+Rio+Negro.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
En el <a href="http://www.telam.com.ar/notas/201307/26755-el-gobierno-estrena-un-portal-de-datos-publicos-y-lo-festeja-con-un-hackaton.html">Primer Hackaton de Datos Públicos</a>, 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.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
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 <a href="http://www.python.org.ar/">Python</a> (framework <a href="http://www.web2py.com.ar/">web2py</a>) y utiliza <a href="http://www.postgresql.org.ar/">PostgreSQL</a> como base de datos.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
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).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
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.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Hasta el momento, se procesaron los <a href="http://www.datospublicos.gov.ar/">datos públicos</a> de dos elecciones nacionales:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Presidente, Senadores y Diputados 2007: <a href="http://www.web2py.com.ar/recuento2007/">http://www.web2py.com.ar/recuento2007/</a> </li>
<li>Primarias Abiertas Simultáneas y Obligatorias 2013: <a href="http://www.web2py.com.ar/recuento2013paso">http://www.web2py.com.ar/recuento2013paso</a></li>
</ul>
<div class="separator" style="clear: both; text-align: left;">
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): <a href="https://github.com/MSA-Argentina/recuento_web2py">https://github.com/MSA-Argentina/recuento_web2py</a></div>
<h4>
Instalación Rápida:</h4>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Descargar web2py desde: <a href="http://www.web2py.com/">http://www.web2py.com/</a> </li>
<li>Descargar la aplicación en un archivo comprimido desde GitHub: <a href="https://github.com/MSA-Argentina/recuento_web2py/archive/master.zip">master.zip</a></li>
<li>Descomprimir la aplicaión en la carpeta application de web2py (por ej. bajo el nombre recuento)</li>
<li>Crear una base de datos en PostgreSQL y ejecutar el <a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/esquema.sql">esquema.sql</a> para crear las tablas</li>
<li>Seguir los pasos siguientes de cada juego de datos (ver <a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/carga.sql">carga.sql</a> y <a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/migracion.sql">migracion.sql</a>)</li>
<li>Configurar la cadena de conexión a la base de datos en el modelo <a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/models/app_settings.py">app_settings.py</a></li>
</ul>
<br />
<div>
<h3>
Juegos de Datos Públicos</h3>
</div>
<br />
Ultimamente trabajé en procesar los datos de las <a href="http://www.resultados.gob.ar/">P.A.S.O. 2013</a> -elección primarias para senadores y diputados nacionales en las 24 provincias-, publicados en el <a href="http://www.datospublicos.gov.ar/">Portal de Datos Públicos</a><br />
<br />
Para más información ver carpeta <a href="https://github.com/MSA-Argentina/recuento_web2py/tree/master/private/2013-primarias">2013-primarias</a>:<br />
<ul>
<li><a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/README.md">Info sobre el Dataset</a></li>
<li><a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/carga.sql">Script SQL de carga de datos públicos</a> -para PostgreSQL-</li>
<li><a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/migracion.sql">Script SQL de migración a la aplicación</a> -para PostgreSQL-</li>
</ul>
<div>
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).</div>
<div>
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.</div>
<div>
Para ver los datos oficiales, dirigirse a <a href="http://www.elecciones.gov.ar/">http://www.elecciones.gov.ar/</a> (recuento definitivo) y <a href="http://www.resultados.gob.ar/">http://www.resultados.gob.ar</a> (recuento provisional).<br />
<br /></div>
<h3>
</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhURAvgSgldXtr6ofyWerP4gfwS9aOpN0KMLfGMWd8nfuaxYzGVcnPM-pvoaSE2l9USto9mwUjoQQ3C5YQL5dm0UnD0RNfILP-oZmYf0Z4yUkV5Otpnxw6nZzZP_oHgf3dh7pqYwn0_t9U/s1600/Recuento+PASO+2013+(provisorio).png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhURAvgSgldXtr6ofyWerP4gfwS9aOpN0KMLfGMWd8nfuaxYzGVcnPM-pvoaSE2l9USto9mwUjoQQ3C5YQL5dm0UnD0RNfILP-oZmYf0Z4yUkV5Otpnxw6nZzZP_oHgf3dh7pqYwn0_t9U/s400/Recuento+PASO+2013+(provisorio).png" width="308" /></a></div>
<h3>
Manejo de Imágenes de actas de mesa (telegramas / faxes):</h3>
<div style="text-align: center;">
<div style="text-align: left;">
<br />
La página de Consulta de Telegrama / Planilla permite revisar, cargar y corregir los votos por cargo por lista en cada mesa escrutada.</div>
<div style="text-align: left;">
Para el procesamiento de las imágenes se desarrollaron dos programas auxiliares (scripts):</div>
<div style="text-align: left;">
</div>
<ul>
<li style="text-align: left;"><a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/faxes.sh">faxes.sh</a>: para extraer las imágenes del PDF y convertirlas al formato TIFF optimizado (CCITT grupo 4) se utilizaron las herramientas pdfimages y ppm2tiff</li>
<li style="text-align: left;"><a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/private/2013-primarias/faxes.py">faxes.py</a>: 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.</li>
</ul>
<div>
<div style="text-align: left;">
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.</div>
</div>
<div>
<div style="text-align: left;">
<br /></div>
</div>
<div>
<div style="text-align: left;">
Para mostrar las imágenes, se obtiene la misma desde la base de datos y se genera una miniatura con PIL (ver thumbnail en <a href="https://github.com/MSA-Argentina/recuento_web2py/blob/master/controllers/definitivo.py#L196">definitivo.py</a>) para ser descargada por el navegador web.<br />
<br />
El tamaño total de la base de datos, incluyendo las imágenes de las planillas, es de 6.4 GB<br />
<br /></div>
</div>
</div>
<h3>
Consultas no triviales con el "ORM" de web2py</h3>
<br />
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.<br />
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):<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># constantes (jerarquía de ubicaciones)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">CLASES = ['Pais', 'Provincia', 'Departamento', 'Circuito', 'Mesa']</span><br />
<span style="font-size: x-small;"><span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># alias de tablas: </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">p = msa.planillas</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">d = msa.planillas_det</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">l = msa.listas</span><br />
<br />
<span style="font-size: x-small;">
<span style="font-family: Courier New, Courier, monospace;"># armo la consulta base con los criterios de búsqueda</span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query = p.id_planilla == d.id_planilla</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= d.id_lista == l.id_lista</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= p.id_estado == </span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">request.args[3]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= d.id_cargo == </span><span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">request.args[0]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= l.positivo == True</span><br />
<span style="font-size: x-small;"><span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># armo la consulta "recursiva" (árbol) para tener las ubicaciones y planillas</span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># (up -> ubicación padre, uh -> ubicación hija)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># p/ el alias de cada tabla se usa el nombre de la clase (depto, mesa, etc.)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">up = msa.ubicaciones.with_alias(ubicacion.clase)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= up.id_ubicacion == id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">for clase in CLASES[CLASES.index(ubicacion.clase)+1:]: </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> uh = msa.ubicaciones.with_alias(clase)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> query &= uh.id_ubicacion_padre == up.id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> up = uh</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">query &= p.id_ubicacion == up.id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># campo suma total:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">suma_votos = d.votos_definitivos.sum()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># ejecuto la consulta:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">resultado = msa(query).select( </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> d.id_lista.with_alias("id_lista"),</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.nro_lista.with_alias("nro_lista"), </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.descripcion.with_alias("descripcion"), </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.idx_fila.with_alias("idx_fila"), </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.descripcion_corta.with_alias("descripcion_corta"),</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.color.with_alias("color"),</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> suma_votos.with_alias("suma_votos"),</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> groupby=(d.id_lista |</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.nro_lista | </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.descripcion |</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.idx_fila |</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.descripcion_corta |</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> l.color),</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> orderby= ~suma_votos | l.idx_fila</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> )</span><br />
<div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4EfZHKv6DtM7n26qWJnKEe-OzaZZ6LzvmVABP42JrP86F8p_OueYgNsxBWUMXDVQBJ9rq4EWzAPgBmRpyU1AbDTlbIzzw15j2O36l5nghWifVPGJyfiQt-DvyuPP1Wzr-dvN0oAQEMhw/s1600/Recuento+PASO+2013+(provisorio)+resultado+CABA.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4EfZHKv6DtM7n26qWJnKEe-OzaZZ6LzvmVABP42JrP86F8p_OueYgNsxBWUMXDVQBJ9rq4EWzAPgBmRpyU1AbDTlbIzzw15j2O36l5nghWifVPGJyfiQt-DvyuPP1Wzr-dvN0oAQEMhw/s400/Recuento+PASO+2013+(provisorio)+resultado+CABA.png" width="352" /></a><br />
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):<br />
Esta consulta en Python generará una consulta SQL similar a la siguiente:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">SELECT planillas_det.id_lista, listas.nro_lista, listas.descripcion, </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SUM(planillas_det.votos_definitivos) AS suma_votos </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">FROM planillas, planillas_det, listas, </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ubicaciones AS provincia, </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ubicaciones AS departamento, </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ubicaciones AS circuito, </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ubicaciones AS mesa </span><br />
<span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">WHERE planillas.id_planilla = planillas_det.id_planilla</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND planillas_det.id_lista = listas.id_lista </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND planillas.id_estado = 'Publicada' </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND planillas_det.id_cargo = 1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND listas.positivo = 'T' </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND provincia.id_ubicacion = 1 </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND departamento.id_ubicacion_padre = provincia.id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND circuito.id_ubicacion_padre = departamento.id_ubicacion </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND mesa.id_ubicacion_padre = circuito.id_ubicacion </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND planilla</span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">s.id_ubicacion = mesa.id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GROUP BY planillas_det.id_lista, listas.nro_lista, listas.descripcion </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">ORDER BY SUM(planillas_det.votos_definitivos) DESC, listas.nro_lista;</span><br />
<br /></div>
<h3>
</h3>
<h3>
Consultas Recursivas con PostgreSQL:</h3>
<div>
<div>
<br />
La consulta anterior, podría escribirse de manera más flexible en PostgreSQL utilizando Expresiones de Tablas Comunes (CTE) para consultas recursivas (clausula <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WITH</span>).<br />
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:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WITH RECURSIVE U(id_ubicacion, descripcion, clase) AS (</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SELECT UP.id_ubicacion, UP.descripcion, UP.clase </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FROM ubicaciones UP </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> WHERE UP.id_ubicacion = 1</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> UNION ALL</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SELECT UH.id_ubicacion, UH.descripcion, UH.clase</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FROM U, ubicaciones UH </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> WHERE UH.id_ubicacion_padre = U.id_ubicacion </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> )</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">SELECT L.id_lista, P.id_partido, L.nro_lista, L.descripcion, P.descripcion,</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SUM(PD.votos_definitivos) AS suma_lista</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">FROM U, planillas PL, planillas_det PD, listas L, partidos P</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WHERE PL.id_ubicacion = U.id_ubicacion</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PL.id_planilla = PD.id_planilla</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PD.id_lista = L.id_lista </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND L.id_partido = P.id_partido</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PD.id_cargo = 2</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GROUP BY P.id_partido, L.id_lista, L.nro_lista, L.descripcion, P.descripcion </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">ORDER BY 6 DESC;</span></div>
</div>
<div>
<br />
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)</div>
<div>
<br />
Es interesante ver con el comando <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">EXPLAIN</span> el análisis del plan de ejecución de la consulta para detectar posibles optimizaciones , como podría ser agregar el siguiente indice:<br />
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">CREATE INDEX planillas_det_id_cargo_id_idx ON planillas_det(id_cargo, id_planilla)</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFUED-ciU8QHJWVUylEh1E9qqTNz2lqUYChvSlKi3WrGi9VlTID-eepPM38S9RNJVJHNRglBylR9zc3pOv41AKSMz1G-DTjF_fdf5-XfT2_nAoamC8gHmmHJFm1cSkX5JZkhdwMY2wdo/s1600/explain_recursivo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="449" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFUED-ciU8QHJWVUylEh1E9qqTNz2lqUYChvSlKi3WrGi9VlTID-eepPM38S9RNJVJHNRglBylR9zc3pOv41AKSMz1G-DTjF_fdf5-XfT2_nAoamC8gHmmHJFm1cSkX5JZkhdwMY2wdo/s640/explain_recursivo.png" width="640" /></a></div>
<br />
<h3>
Funciones de Ventana con PostgreSQL:</h3>
<br />
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).<br />
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 <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">SUM(SUM(PD.votos_definitivos)) OVER (PARTITION BY L.id_partido) AS suma_partido</span> a la consulta anterior:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WITH RECURSIVE U(id_ubicacion, descripcion, clase) AS (</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SELECT UP.id_ubicacion, UP.descripcion, UP.clase </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FROM ubicaciones UP </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> WHERE UP.id_ubicacion = 1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> UNION ALL</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SELECT UH.id_ubicacion, UH.descripcion, UH.clase</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FROM U, ubicaciones UH </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> WHERE UH.id_ubicacion_padre = U.id_ubicacion </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">SELECT L.id_lista, P.id_partido, L.nro_lista, L.descripcion, P.descripcion,</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SUM(PD.votos_definitivos) AS suma_lista,</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SUM(SUM(PD.votos_definitivos)) OVER (PARTITION BY L.id_partido) AS suma_partido</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">FROM U, planillas PL, planillas_det PD, listas L, partidos P</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WHERE PL.id_ubicacion = U.id_ubicacion</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PL.id_planilla = PD.id_planilla</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PD.id_lista = L.id_lista </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND L.id_partido = P.id_partido</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> AND PD.id_cargo = 2</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GROUP BY P.id_partido, L.id_lista, L.nro_lista, L.descripcion, P.descripcion </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">ORDER BY 7 DESC, 6 DESC;</span></div>
<div>
<br /></div>
<div>
Cuyo resultado es:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3fQfQ0u3p-coyv-CguPIjdMJSHGXl8FHdS9OkODJVjv7qcuFZWuoUds6jzJvbNp1xnNcoCZGWjVQMS_xu8chQwwnSohwfX8hGGhyV_yJOySduTRr1ZvX4cTYqUhOh6w2Kw_0Nr_UQFjk/s1600/Captura+de+pantalla+de+2013-09-05+15:27:07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3fQfQ0u3p-coyv-CguPIjdMJSHGXl8FHdS9OkODJVjv7qcuFZWuoUds6jzJvbNp1xnNcoCZGWjVQMS_xu8chQwwnSohwfX8hGGhyV_yJOySduTRr1ZvX4cTYqUhOh6w2Kw_0Nr_UQFjk/s640/Captura+de+pantalla+de+2013-09-05+15:27:07.png" width="640" /></a></div>
<br />
<h3>
Agradecimientos y trabajo a futuro</h3>
<br />
Esta aplicación fue posible gracias a la colaboración de la empresa <a href="http://www.msa.com.ar/">MSA</a> y al <a href="http://www.agendadigital.gob.ar/grupos-de-trabajo_p172">grupo de trabajo de datos públicos / software libre del foro de la Agenda Digital</a>, por haber hecho posible la publicación del código fuente y el acceso a los datasets respectivamente.<br />
<br />
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: <a href="http://www.postgresql.org.ar/trac/wiki/OptimizarRendimiento">http://www.postgresql.org.ar/trac/wiki/OptimizarRendimiento</a><br />
<br />
Seguramente se presentará el trabajo en la próxima jornada PostgreSQL: <a href="http://www.pgday.com.ar/buenosaires2013">PgDay Argentina 2013</a>, donde se preparará un taller para experimentar con los datos, analizar el rendimiento y proponer mejoras.<br />
<br /></div>
Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comBuenos Aires, Argentina-34.6037232 -58.381593100000032-34.8128082 -58.704316600000034 -34.394638199999996 -58.05886960000003tag:blogger.com,1999:blog-2304908645814887524.post-36426194615048184552013-06-21T20:19:00.001-03:002013-06-29T19:20:06.091-03:00Software Libre aplicado en materias de Analisis de Sistemas y Redes Informaticas<h2>
Asignaturas Ciclo Lectivo 2013</h2>
<div>
Este año, en el <a href="http://www.institutopascal.edu.ar/welcome/default/index">Instituto Tecnológico Blaise Pascal</a> estoy dando las siguientes materias, en las cuales usamos software libre como eje de los contenidos: </div>
<ul>
<li><a href="http://reingart.blogspot.com.ar/p/materia-base-de-datos.html">Bases de datos</a>: Modelo Entidad Relación; Modelo Relacional; Lenguajes de de consulta (SQL y Algebra Relacional). Administración y Optimización. Herramientas: PostgreSQL</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-sistemas-operativos.html">Sistemas Operativos</a>: 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</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-interconectividad-redes.html">Interconectividad (Redes)</a>: 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)</li>
<li><a href="http://reingart.blogspot.com.ar/p/materia-practica-profesional.html">Práctica Profesional</a> (proyecto final de carrera): Gestión de proyectos. Ingeniería de Software. Herramientas: Python, Mercurial, web2py, PostgreSQL</li>
</ul>
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. <br />
<br />
Las materias corresponden a la <a href="http://www.institutopascal.edu.ar/welcome/static/sistemas.pdf">"Tecnicatura Superior en Analisis de Sistemas"</a> (Resolución Nº5817/03) y <a href="http://www.institutopascal.edu.ar/welcome/static/redes.pdf">"Tecnicatura superior en Redes Informáticas"</a> (Resolución Nº6164/03).<br />
Junto a otras como Programación I y II dictadas por otros profesores, se inscriben en el <a href="http://docs.google.com/View?id=dd9bm82g_428g8zvfvdx">Proyecto Curricular Institucional orientado al software libre</a>, en el cual venimos trabajando desde 2010 entre docentes y directivos para organizar y profundizar los contenidos teóricos y prácticos.<br />
<br />
"Bases de Datos" no ha sufrido modificaciones significativas desde 2009.<br />
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.<br />
<br />
Pueden ver algunos proyectos de "Práctica Profesional" del año anterior en el sitio de <a href="https://ar.pycon.org/2012/activity/accepted#159">PyCon Argentina 2012 (Póster de trabajos estudiantiles)</a> y en el <a href="http://code.google.com/p/pascal-sistemas/">repositorio</a> público de la materia.<br />
<br />
<h2>
Referencias bibliográficas libres</h2>
<div>
La mayoría de los materiales de consulta utilizados son libre y abiertos, pudiendo citar principalmente:</div>
<div>
<ul>
<li><a href="http://estudios.uoc.edu/es/masters-universitarios/software-libre/">Máster Universitario en Software Libre (Universitat Oberta de Catalunya)</a>: 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 <a href="http://ocw.uoc.edu/informatica-tecnologia-y-multimedia/">UOC OpenCourseWare</a>. Licencia del sitio: CC BY-NC-SA. Licencia de los documentos: GNU FDL.</li>
<li><a href="http://alqua.org/">Proyecto Alqua.org</a> (editorial virtual libre): <i>"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"</i>. 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</li>
<li><a href="http://www.guimi.net/index.php?pag_id=cmsxp90_personal.html">Luis Miguel Armendáriz (Güimi)</a>: <i>"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)"</i>. 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 <a href="http://www.guimi.net/index.php?pag_id=cmsxp05_documentacion.html">documentación</a> para el listado completo.</li>
<li><a href="http://www.latinuxpress.com/">Latinux Press</a>: <i>"Consorcio de Cooperación Internacional que impulsa y desarrolla soluciones basadas en Software Libre y Tecnologías Abiertas"</i>. Traducción del libro de web2py al español.</li>
<li><a href="http://www.postgresql.org.ar/">Grupo de Usuarios de PostgreSQL Argentina</a>: 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 <a href="http://www.postgresql.org.ar/trac#Documentaci%C3%B3n">Documentación</a> para más información.</li>
</ul>
Adicionalmente, los siguientes recursos también han sido útiles (aunque no son usados directamente en estas materias):<br />
<ul>
<li><a href="https://sites.google.com/site/fiuba7540rw/">Materia Algoritmos y Programación 1, cátedra Wachenchauzer</a> ("Python"), de la Facultad de Ingeniería, Universidad de Buenos Aires. (ver <a href="https://e77d1912-a-62cb3a1a-s-sites.googlegroups.com/site/fiuba7540rw/home/apunte_7540.pdf">apunte_7540.pdf</a>)</li>
<li><a href="http://www.python.org.ar/">Grupo de Usuarios de Python Argentina: </a>especialmente la sección "<a href="http://python.org.ar/AprendiendoPython">Aprendiendo Python</a>" que incluye una extensa bibliografía</li>
</ul>
<ul>
</ul>
</div>
<h2>
Temas a futuro</h2>
<ul>
<li>Traducción de la Documentación oficial al Español (<a href="http://docs.python.org/2/">Python</a> y <a href="http://www.postgresql.org/docs/">PostgreSQL</a> 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 <a href="http://python.org.ar/TracebackInternationalizationProposal">propuesta de internacionalización par Python</a> como punto de partida, y volver a colaborar más activamente con las <a href="http://www.postgresql.org.ar/trac/wiki/Traducci%C3%B3n">iniciativas de traducción existentes para PostgreSQL</a>.</li>
<li>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. </li>
<li>Python y PostgreSQL tienen herramientas y entornos de desarrollo simples como <a href="http://en.wikipedia.org/wiki/IDLE_%28Python%29">IDLE</a> y <a href="http://www.pgadmin.org/">PgAdmin3</a>. 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 <a href="https://code.google.com/p/rad2py/">rad2py</a> 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.). </li>
<li>En paralelo, también estoy trabajando en proyectos como <a href="https://code.google.com/p/gui2py/">gui2py</a> (fork renovado de PythonCard para desarrollo de interfases visuales), y en seguir mejorando <a href="http://www.web2py.com.ar/">web2py</a>, 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.</li>
</ul>
<br />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-44533299060676972912013-02-23T00:20:00.001-03:002013-02-25T12:00:05.662-03:00Novedades AFIP / ANMAT: WSLPG y TrazaMedV2<h2>
AFIP:</h2>
<div>
<br />
<h3>
Liquidación Primaria Electrónica de Granos:</h3>
</div>
<div>
<br /></div>
Esta en desarrollo la interfaz para el webservice WSLPG (Liquidación Primaria de Granos): <br />
<blockquote class="tr_bq">
Operaciones de compraventa de granos no destinados a la siembra.<br />
Régimen de emisión de comprobantes.<br />
Norma conjunta Resolución General Nº 1.593 (AFIP) y Resolución Nº 456<br />
(ex SAGPyA), Resoluciones Generales Nº 1.415, Nº 2.205 y Nº 2.485, sus respectivas modificatorias y complementarias. </blockquote>
<div>
Para más información ver:</div>
<div>
<ul>
<li><a href="http://www.sistemasagiles.com.ar/trac/wiki/LiquidacionPrimariaGranos">http://www.sistemasagiles.com.ar/trac/wiki/LiquidacionPrimariaGranos</a>: documentación</li>
<li><a href="http://www.pyafipws.com.ar/wslpg">http://www.pyafipws.com.ar/wslpg</a>: datos generales</li>
<li><a href="https://code.google.com/p/pyafipws/source/browse/wslpg.py">https://code.google.com/p/pyafipws/source/browse/wslpg.py</a>: código fuente</li>
</ul>
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.') </div>
<div>
<br /></div>
<h3>
Certificados de seguridad:</h3>
<br />
Afip ha cambiado los certificados de seguridad de los servidores de producción (webservices):<br />
<br />
<ul>
<li>servicios1.afip.gov.ar: ver <a href="https://groups.google.com/d/msg/pyafipws/NrzK4SgzZs8/Q3ey3-vwv7UJ" target="_blank">hilo de discusión en el grupo de noticias</a> (WSFEv1, WSFEXv1, etc.)</li>
<li>serviciosjava.afip.gov.ar: ver <a href="https://groups.google.com/d/msg/pyafipws/U8uFDb9SkYA/QAldSECmUXoJ" target="_blank">hilo de discusión en el grupo de noticias</a> (WSMTXCA, WSCOC, etc.)</li>
</ul>
<div>
Según la <a href="http://www.afip.gov.ar/ws/WSAA/Especificacion_Tecnica_WSAA_1.2.2.pdf" target="_blank">Especificación Técnica WSAA 1.2.2</a>, la aplicación que consuma los webservices debe verificar el canal de comunicación seguro usando los CA (Certifiado de las Autoridades Certificantes).</div>
<div>
Para ello se puede usar el transporte (wrapper) pycurl, usando el archivo de informacion provisto: <a href="https://code.google.com/p/pyafipws/source/browse/afip_ca_info.crt">afip_ca_info.crt</a> (recientemente actualizado por este cambio). Más info en la <a href="http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs#VerificacióndelCanaldeComunicaciónSeguro">documentación</a>.</div>
<div>
<br /></div>
<h2>
ANMAT:</h2>
<div>
<br /></div>
<h3>
Trazabilidad de Medicamentos: Especificación Técnica v2</h3>
<br />
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: <br />
<ul>
<li>SendConfirmaTransacc(..., p_ids_transac, f_operacion): Confirma la recepción de un medicamento </li>
<li>SendAlertaTransacc(..., p_ids_transac_ws): Alerta un medicamento, acción contraria a “confirmar la transacción”. </li>
<li>GetTransaccionesNoConfirmadas(...): Trae un listado de las transacciones que no están confirmadas </li>
</ul>
Esto se suma a SendCancelacTransacc, SendMedicamentosDHSerie y SendMedicamentosFraccion que se habían agregado con anterioridad. <br />
<br />
Pueden ver los nuevos cambios en la documentación: <br />
<br />
<a href="http://www.sistemasagiles.com.ar/trac/wiki/TrazabilidadMedicamentos">http://www.sistemasagiles.com.ar/trac/wiki/TrazabilidadMedicamentos</a> <br />
<br />
Los ajustes iniciales al código fuente ya están publicados: <br />
<br />
<a href="https://code.google.com/p/pyafipws/source/browse/trazamed.py">https://code.google.com/p/pyafipws/source/browse/trazamed.py</a> <br />
<br />
Según comentarios, esta nueva operatoria sería obligatoria a partir del 1 de Marzo de 2013. <br />
<br />
La próxima semana estaremos publicando una nueva versión de los instaladores y ejemplos.<br />
En cuanto tengamos más información ampliaremos comunicandolo por la <a href="http://groups.google.com/group/pyafipws">lista de correo</a><br />
<br />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-74997636416297966842013-01-31T05:18:00.002-03:002013-02-01T16:19:59.742-03:00PyCon Argentina 2012: how-to y comentariosCerrando la organización de PyCon Argentina 2012, escribo esta entrada principalmente para sintetizar mis comentarios personales a las sedes que se han postulado para el 2013, y espero que sirva como resumen a modo de guía, por si alguno quiere organizar un evento similar (recordar que existe el <a href="https://pyconar20012-postmortem.readthedocs.org/" target="_blank">reporte final</a> y <a href="http://bitbucket.org/leliel12/pyconar20012_postmortem/src/tip/balance/balancepyconar2012.pdf" target="_blank">balance</a> de la conferencia para mayor información, y pueden ver una entrada en mi blog previa sobre <a href="http://reingart.blogspot.com.ar/2012/03/pycon-us-2012.html" target="_blank">pyconus2012</a> para una perspectiva más detallada).<br />
<br />
<h3>
Objetivos: ¿PyDay o PyCon?</h3>
<div>
El principal punto es definir: ¿para que organizar una conferencia? ¿cual va a ser el público?</div>
<br />
En principio, se puede organizar un evento "chico" por ej. un <a href="http://python.org.ar/pyar/PyDay" target="_blank">PyDay</a> (jornada de Python de 1 día, usualmente de carácter local, sin invitados internacionales ni mucha más complicación). Esto es lo más recomendable para aquellos que nunca organizaron un evento, ya que es más informal, con menos responsabilidades y ayuda a afianzar una comunidad local con perspectivas a realizar un evento más grande.<br />
<br />
Si bien los PyDays son muy interesantes, a mi criterio tienen ciertas limitaciones en cuanto a los recursos y posibilidades. Suelen ser una buena opción para los principiantes y aquellos que ya tienen una experiencia intermedia en el lenguaje, pero pueden no ofrecer la profundidad necesaria para los usuarios más avanzados. Por lo general, tampoco logran reunir participantes a nivel regional o nacional, siendo su ámbito de acción y posibilidades de difusión mucho más acotadas. Como además generalmente son de 1 solo día, pueden no justificar el viaje para personas que viven lejos del evento.<br />
<br />
Para ir un poco más allá, creo que se necesitan eventos más "grandes": por ej una <a href="http://www.python.org/community/pycon/" target="_blank">PyCon</a> (usualmente varios días de conferencias, entrenamientos y reuniones de desarrollo, para todos los niveles, desde nuevos usuarios hasta desarrolladores del lenguaje). Este tipo de evento tiene en general un carácter nacional, regional o internacional, usualmente nucleando un público más diverso (incluyendo disertantes internacionales), con mayor posibilidades y recursos. Las actividades técnicas se complementan con eventos sociales y turísticos (happy hour, fiestas, city tours, etc.)<br />
<br />
<div>
Incluso armar eventos especiales en paralelo ayuda a traer disertantes, participantes y facilitar la organización. Por ej., este año, se armó una <a href="http://pyconar.blogspot.com.ar/2012/11/jornada-de-postgresql-en-pycon.html" target="_blank">Jornada de PostgreSQL</a> en paralelo a los Sprints: <a href="http://www.pgday.com.ar/buenosaires2012" target="_blank">PgDay Argentina 2012</a>. No solo se compartieron disertantes, sino que también un 25% de los participantes aproximadamente asistieron a ambos eventos.</div>
<div>
Creo que es una idea bastante buena, sobre todo viendo que este año en PyCon US 2013 se organizan varios eventos en paralelo, como un <a href="http://wiki.postgresql.org/wiki/PyPgDay2013" target="_blank">PyPgDay</a> y <a href="http://sv2013.pydata.org/" target="_blank">PyData</a>. </div>
<div>
Tampoco habría que descartar participar en eventos mayores (conferencias de software libre o similares).</div>
<br />
<h3>
¿Por que se necesitan conferencias y entrenamientos más avanzados?</h3>
<br />
En diciembre pasado estuve en las de <a href="http://www.agendadigital.gob.ar/agenda-digital/culminaron-las-jornadas--agenda-digital--gobierno-en-red-2012-2015-_n83">Jornadas de Agenda Digital</a>, donde se planteó en un panel <a href="http://www.agendadigital.gob.ar/multimedia/files/PDF/programa_evento_ada.pdf">"Debate abierto sobre Software Libre en el Estado"</a>.<br />
Uno de los disertantes, Jorge Linskens – Consultor quien fuera encargado de modernizar los sistemas informáticos de AFIP – comentó que le fue posible implementar software libre porque tenia 4 "<a href="http://conocimientolibre.wordpress.com/2008/04/15/los-gurues-estan-aca-entrevista-a-jorge-linskens/">gurues de java</a>". También señaló un caso negativo, donde la falta de soporte local hizo fracasar un proyecto, cuestionando que las ventajas del software libre se pierden si para solucionar un problema se debe contratar y traer un experto desde el exterior (con un costo de cientos de miles de dólares).<br />
En el ámbito privado, se puede citar una <a href="http://listas.python.org.ar/pipermail/pyar/2012-June/018535.html" target="_blank">búsqueda laboral de Intel</a>, donde uno de los requisitos era la participación activa en Django, web2py, cherrypy o web.py (además de otros temas avanzados).<br />
<br />
Esto no es algo nuevo o específico, recuerdo que en 2009, en la reunión informal luego de la conferencia <a href="http://pgbr.postgresql.org.br/2009/index.en.php">PgCon Brasil 2009</a>, comentaban sobre que las empresas estatales brasileñas solo contrataban "expertos" que hubieran contribuido fehacientemente al proyecto (o sea, haber enviado correcciones o mejoras que fuesen aceptados y listados en el historial de cambios).<br />
Siguiendo esa linea, en dicha conferencia hubo varias charlas para fomentar nuevos desarrolladores, con una <a href="http://pgbr.postgresql.org.br/2009/programacao.php">Sala VIP</a> dedicada a estos temas avanzados, tratando como hacer extensiones o lograr que te aprueben un parche (esta última, muy motivadora, sobre todo la parte de experiencia personal del autor, remarcando que el esfuerzo de contribuir al software libre al principio puede ser abrumador, pero que a la larga se aprecian sus beneficios).<br />
<br />
Además de fomentar el crecimiento de nuevos colaboradores, eventos de capacitación más avanzados posibilitan acercar la experiencia completa relacionada al software libre a mayor numero de interesados, quienes de otra forma tendrían que ir a los países centrales para conocer, capacitarse y conectarse con la comunidad internacional (cosa que, al menos desde Argentina, es algo económicamente costoso y hasta burocrático por el tema de visas y similares).<br />
<br />
Por último, no olvidar que eventos más abarcativos posibilitan encontrarse con personas de distintos orígenes e intereses, y se generan interesantes discusiones, charlas, talleres o reuniones de trabajo no programadas que de otra forma serían dificil de concretar.<br />
Esto se conoce como "<a href="http://pycon.blogspot.com.ar/2012/02/what-to-do-on-friday-at-pycon.html" target="_blank">Hallway track</a>" (charlas de pasillo durante los intervalos), y es uno de las mejores oportunidades que brindan estos eventos para socializar y conocer otros pythonistas.<br />
Tampoco olvidar otras actividades menos formales como los <a href="http://ar.pycon.org/2012/conference/openspace" target="_blank">espacios abiertos</a>, sala de exposición, etc., que también ayudan a conectarte con disertantes, auspiciantes y público en general.<br />
<br />
<h3>
Disertantes Internacionales</h3>
<div>
<br /></div>
<div>
Retomando el tema anterior, en <a href="http://2012.pythonbrasil.org.br/" target="_blank">Python Brasil 2012</a> (y por consiguiente, en parte también para PyCon Argentina 2012), se buscaron disertantes internacionales para facilitar la formación de nuevos "core developers". Con un eje avanzado y charlas en inglés, se buscaba atraer a la conferencia a otros disertantes y participantes internacionales. </div>
<div>
<br /></div>
<div>
En general, los disertantes reconocidos pueden llegar a solicitar a su empleador que les cubra el costo del pasaje (uno de los gastos principales de este tipo de eventos). Esto hay que sugerirlo con tiempo, ya que sus jefes deben evaluarlo y hacer los tramites necesarios. En estos casos debe ofrecerse un reconocimiento como sponsor o similar, y garantizar que las actividades a desarrollar van a ser relevantes y justificarán el viaje.</div>
<div>
Puede ofrecerseles alojamiento sin cargo, sobre todo para facilitarle la jornada a a aquellos disertantes con varias actividades, pero recordar que usalmente las grandes compañias también cubren la estancia en hoteles de mayor categoría a las que puede cubrir un evento de software libre en estas latitudes, por lo que se les puede recomendar un hotel oficial al que pueden cambiarse a su cargo si asi lo desean.</div>
<div>
Si no se consigue cubrir estos gastos, se pueden solicitar fondos a la PSF para cubrir pasajes de avión de los invitados internacionales, y se evita el papeleo para recibir la transferencia internacional (ver Financiación y Sponsors abajo).</div>
<div>
<br /></div>
<div>
Recordar aclarar estos temas para que no haya malos entendidos, por ej. recibimos una contestación de un posible invitado que solicitaba le cubrieramos el pasaje, estadía y comida (esto es usual en otras conferencias, pero puede ser complicado en nuestro caso). </div>
<div>
También aclarar que la participación es ad-honorem, o sea, no se paga por las capacitaciones (a diferencia de, por ej. PyCon US, que paga alrededor de <a href="https://us.pycon.org/2012/cfp/" target="_blank">USD $1500 por presentar un tutorial</a>).</div>
<div>
<br /></div>
<div>
Los disertantes internacionales pueden llegar a pedir sus vacaciones para poder venir (incluso con sus parejas), por lo que también debería ofrecerse alternativas turísticas para hacer más atractiva y amena su estadía.</div>
<div>
<br /></div>
<div>
También se puede explorar un "Tour" o gira de los disertantes internacionales, que recorran los diversos países de la región, como por ej. se hizo en "<a href="http://tour.rubysur.org/" target="_blank">Gira Ruby Sur 2011</a>". Proyectos similares para Python incluyen el "<a href="http://www.pythonafricantour.com/" target="_blank">Python African Tour</a>"<br />
<br />
Por último, es recomendable contestar los emails en tiempo y forma (máximo 24hs), y proveer por anticipado detalles sobre la organización general (duración de charlas, slots, alojamiento y transporte, gastos aproximados -comida, bebida, etc.-). Estas son cosas que tienen en cuenta los disertantes internacionales, y la sola falta de respuesta puede afectar la seriedad del evento y hacer que desistan de viajar hacia la conferencia.</div>
<div>
<br /></div>
<div>
<h3>
Revisión y Selección de charlas - Diversidad </h3>
</div>
<div>
<br />
En principio, debe armarse un <a href="http://ar.pycon.org/2012/conference/proposals" target="_blank">Llamado a ponencias</a>, detallando las actividades que pueden ser propuestas. En general, luego se forma un comité de selección de charlas que evalua las propuestas, pide aprueba/rechaza las propuestas y asigna los horarios (ver <a href="http://python.org.ar/pyar/PyConArgentina/2012/LlamadoRevisores" target="_blank">Llamado a Revisores</a>)</div>
<div>
<br /></div>
<div>
El problema es que generalmente se reciben más charlas de las que pueden ser ubicadas en la grilla y surgen los inconvenientes. Lo fundamental es mantener la transparencia del proceso (para evitar decisiones que pueden ser consideradas "arbitrarias"), y posibilitar a los autores que realicen las correcciones necesarias antes de que sea demasiado tarde.</div>
<div>
Lo ideal sería recibir un paper tentativo (documento usualmente de entre 10 y 25 hojas) para asignarle expertos y evaluarlo en profundidad, pero la realidad es que esto es bastante difícil para este tipo de conferencias de software, y lamentablemente la disponibilidad de expertos es limitada. </div>
<div>
<br /></div>
<div>
Por eso, creo que una buena opción seguir abriendo la selección de charlas a la comunidad (y así también aumentar la participación de los futuros asistentes al evento). Para PyCon Argentina 2012 el público pudo votar sus preferencias, pero se limito la cantidad de revisores por temor a que el proceso se salga de control (sobre todo en las reuniones). </div>
<div>
Quizás se debería incluso simplificar aún más el proceso de revisión, para que más gente pueda revisar las charlas y así poder mejorar la calidad antes de la votación y selección final. </div>
<div>
Tanto <a href="https://ep2013.europython.eu/voting-results" target="_blank">EuroPython</a> como <a href="http://t.co/RJExa87P" target="_blank">PythonBrasil</a> usan un sistema de votación totalmente abierto a la comunidad.</div>
<div>
<br /></div>
<div>
También debe balancearse las posibilidades de la organización, recursos, disertantes internacionales, etc. Por ejemplo, en <a href="https://ep2013.europython.eu/blog/2012/04/04/talk-voting-results" target="_blank">EuroPython</a> combinan las charlas de invitados internacionales y sponsors, en adición a las propuestas seleccionadas por la comunidad.</div>
<div>
<br /></div>
<div>
En este sentido creo que es fundamentar seguir políticas de <a href="http://ar.pycon.org/2012/conference/diversity" target="_blank">diversidad</a> que aseguren la participación de los distintos grupos y proyectos, generalmente minoritarios o emergentes, para que tengan cierta visibilidad, ya que si simplemente se evalúa su popularidad, quedarían excluidos por no ser "mainstream". Esta pluralidad favorece las interconexiones y compartir experiencias para enriquecer el software libre con otros casos de uso, soluciones y puntos de vista.</div>
<div>
<br /></div>
<div>
Además, recordar que en general se termina decidiendo en unos pocos minutos basado en un párrafo de texto y la experiencia del autor, por lo que los autores conocidos tienen más posibilidades. Por eso puede ser interesante reservar lugares para fomentar la diversidad, por ej en <a href="http://tek13.phparch.com/call-for-papers/" target="_blank">PHP tek13</a> comentan que: "<i>el proceso de selección es altamente competitivo. Pero</i> <i>También, tenemos una política para asegurar que varias de nuestras charlas sean de nuevos disertantes, o al menos sobre nuevos temas, así que no dejes que la competencia te desanime.</i>"<br />
<br />
Una medida para 2012 fue la de limitar a una charla por autor por track -eje- (en PyCon US se limita a dos charlas en total por cada autor), buscando mayor diversidad de temas y mejor calidad (ya que preparar más de una charla o repetirla la otros años puede ser contraproducente para el autor y la conferencia).<br />
También se deben dejar algunas charlas de respaldo, ya que a último momento puede que algunos disertantes desistan de participar, y es útil tener un pack de charlas para reemplazar los espacios vacantes. Es recomendable que estas charlas de backup sean preferentemente de disertantes locales o conocidos para que la confirmación sea rápida y evitar mayores complicaciones y demoras.</div>
<div>
<br />
Para resumir, cito a Diana Clarke -coordinadora general de PyCon CA 2012, y creo próxima de PyCon Norteamerica 2014-: "<i>No necesitas apegarte a un sistema de votación estricto (que usualmente refuerza el status quo). ... Si quieres que el 20% de las disertantes sean mujeres: haz que ocurra! ... Si queres que el 20% de las charlas sean academicas: haz que ocurra! ... Si haces tu tarea, buscando grandes disertantes de grupos que de otro modo son poco representados, ninguno de esos disertantes seran "indignos". Obviamente, no debes solo poner tus amigos y auspiciantes sobre el escenario, pero debes decidir como un equipo cuales son tus metas y trabajar hacia ellas</i>" (ver <a href="http://mail.python.org/pipermail/conferences/2012-November/000445.html" target="_blank">mensaje completo</a> en la lista de <a href="http://mail.python.org/mailman/listinfo/conferences" target="_blank">Conferencias</a>)</div>
<br />
<h3>
Financiación y Sponsors</h3>
Para aquellos que quieran organizar una evento relacionado a Python, la Python Software Fundation tiene un <a href="http://www.python.org/psf/grants/" target="_blank">Programa de Subvenciones</a>, usualmente de 5.50 dólares por participante (aunque el importe final puede ser menor). Cabe aclarar que a partir de este año, la PSF requiere que la conferencia tenga un <a href="http://pyfound.blogspot.com.ar/2012/12/psf-moves-to-require-code-of-conduct.html" target="_blank">código de conducta</a>.<br />
<br />
Es recomendable hacer la solicitud los antes posible, recordar que estos tramites demoran por la transferencia internacional (hicimos el pedido el 4 de abril, lo aprobaron el 30 de abril, nos notificaron el 5 de mayo, lo depositaron el 11 de septiembre y se acreditó en la cuenta el 21 de noviembre, 4 días después de la conferencia...). Incluso hubo que presentar varios comprobantes en el banco para que habiliten los fondos. Otro auspicio internacional que se inició en Agosto, termino acreditándose el 22 de enero de este año (dos meses después de la conferencia).<br />
<br />
Para este año se usó una <a href="http://ar.pycon.org/2012/sponsors/prospectus" target="_blank">propuesta de auspicio</a> segmentada y diferenciada, siguiendo las bases del llamado a sponsors de <a href="https://us.pycon.org/2013/sponsors/prospectus/" target="_blank">PyCon US</a> que distingue entre empresas grandes y pequeñas (menos de 25 empleados) con un descuento del 50%. Para sponsors previos se mantuvo el precio del año anterior, con un ajuste del 25% por el aumento de costos.<br />
<br />
Viendo las dificultades que tuvimos para cobrar los fondos de los sponsors internacionales (incluyendo comisiones bancarias importantes, gastos de notarios por certificaciones y hasta una posible retención del 35% por impuestos de EEUU), quizás sería conveniente mantener la propuesta pero limitar los descuentos solo a empresas locales, excluyendo a las multinacionales que tienen otras posibilidades y generalmente contemplan los importes internacionales para este tipo de conferencias.<br />
La mayoría de los sponsors fueron locales (empresas de desarrollo de software buscando programadores) y hubo varios por "canje" de productos o servicios.<br />
<br />
Si bien haber tenido varias fuentes de ingreso ayudó a tener un flujo de caja más predecible, igualmente hubo que cubrir algunos gastos (adelanto de la filmación y hotel) con dinero propio de los organizadores, hasta que se iban acreditando los ingresos.<br />
<br />
<h3>
Organización Formal</h3>
<div>
<br /></div>
Es un tema para tener en cuenta, sobre todo si no se tiene una organización formal (asociación, fundación o similar) para manejar los fondos y se depende de terceros.<br />
Armar una ONG o similar también ayudaría a los temas administrativos, con metas y responsabilidades más claras, facilitando armar planes de acción más concretos y perdurables.<br />
Se debe encontrar un balance entre las necesidades y sugerencias de la comunidad, contrastándolo con las posibilidades reales, sobre todo si se arman debates o discusiones que pueden ser constructivos pero si no aportan recursos para llevarlo a cabo (voluntarios, tiempo, fondos, etc.), suelen convertirse en un ruido no deseable.<br />
<br />
Se pueden explorar otras formas, ver el manual de <a href="http://manual-do-big-kahuna.readthedocs.org/en/latest/modelos/index.html" target="_blank">Big Kahuna</a> (Python Brasil) para más información sobre modelos de organización comunitario, mixto o profesional (comercial). Se puede mencionar también que <a href="https://us.pycon.org/2013/about/what-is-pycon/" target="_blank">PyCon US</a> es una conferencia comunitaria producida por la Python Software Fundation (ONG sin fines de lucro), pero también hay otras como <a href="http://www.djangocon.us/about/" target="_blank">DjangoCon</a> que son producidas por empresas privadas, pero llevadas a cabo por la comunidad.<br />
Si para organizar se colaborará con una ONG existente dedicada a promover el software libre, ver por anticipado que no haya problemas con los posibles sponsors (<a href="https://us.pycon.org/2013/sponsors/" target="_blank">PyConUS</a>, <a href="http://www.python.org/psf/" target="_blank">PSF</a>).<br />
<br />
<h3>
Entrada Gratuita, Bono contribución y Becas</h3>
<div>
La mayoría de los PyDays son de entrada gratuita, pero la mayoría de las PyCons son pagas. </div>
<div>
<br /></div>
<div>
Por ej., <a href="https://us.pycon.org/2013/registration/" target="_blank">PyCon US</a> cuesta desde USD $100 para estudiantes, aprox. USD $350 para individuos, y hasta USD $750 para empleados corporativos (entre $500 y $3750 pesos argentinos, sin contar adicionales como los tutoriales, que se pagan aparte). </div>
<div>
Otros eventos más cercanos como <a href="http://2012.latinoware.org/suscripciones/" target="_blank">Latinoware</a> cuestan entre R$ 70 y R$ 110 (alrededor de $300 pesos argentinos al día de hoy). <a href="http://2012.pythonbrasil.org.br/register/" target="_blank">PythonBrasil</a>[8] costó entre R$150 y R$450 (de $400 a $1200 pesos argentinos al día de hoy). Los aranceles de las <a href="http://www.41jaiio.org.ar/aranceles2012" target="_blank">41 Jornadas Argentinas de Informática</a> arrancaron en $160 para estudiantes, $260 para docentes y $430 para los no-socios (realizadas por una ONG sin fines de lucro y en una Universidad Pública).</div>
<div>
<br /></div>
<div>
PyCon Argentina 2012 fue de entrada gratuita (costo = $0) para posibilitarle el acceso a la mayor cantidad de interesados, y se implementó un <a href="http://pyconar.blogspot.com.ar/2012/09/la-conferencia-necesita-tu-contribucion.html" target="_blank">bono contribución opcional</a> que tenía importes sugeridos entre $75 y $250 pesos argentinos (USD $15 a USD $50 dependiendo del tipo de cambio), principalmente para cubrir el costo de remeras, artículos promocionales y catering.</div>
<div>
Si bien el logramos cubrir varios temas, faltó contemplar el almuerzo de los días de tutoriales y conferencias (jueves, viernes y sábado), lo que hubiera significado incrementar el costo en $150.- (el catering es uno de los temas más caros y complicados para organizar, pero es muy beneficioso para no dispersar a los participantes y facilitarles las actividades, sin estirar los horarios de almuerzo como nos ha pasado).<br />
<br />
Para disertantes, hubo un descuento especial del 50% (por debajo de los costos) y los sponsors obtenían acreditaciones sin cargo dependiendo del importe de patrocinio pagado.<br />
<br />
La categoría más económica de patrocinio, alrededor de $1000 para empresas grandes y $500 para empresas pequeñas, no tuvo ningún interesado y directamente fue eliminada. Por el contrario, hubo varias cooperativas y trabajadores particulares que aportaron con el <a href="http://ar.pycon.org/2012/conference/registration" target="_blank">bono contribución</a> profesional (incluso más que el importe básico sugerido).<br />
<br />
El bono contribución no solo ayudo a poder mejorar algunos aspectos de la conferencia, sino que también brindó efectivo para poder pagar las becas y otros gastos (parte de la filmación y temas menores) mientras estábamos esperando que se acrediten los importes de los sponsors internacionales.<br />
<br />
Respecto a las becas, para ayudar a aquellos que no podían cubrir los costos de viaje, se simplificó el trámite (ver <a href="http://ar.pycon.org/2012/fa" target="_blank">instrucciones</a>), con un tope de $1500. El proceso de análisis y otorgamiento se simplificó para hacerlo más rápido y expeditivo.<br />
<br />
Para cerrar este tema, dejo una cita mencionada en un artículo periodístico: <a href="http://veintitres.infonews.com/nota-6095-Universidad-para-algunos.html" target="_blank">"Universidad para algunos" Revista Veintitres</a> del 31-1-2012: “<i>Quienes abogan dogmáticamente por la tradicional gratuidad generalizada no están aportando efectivamente a la vigencia de una nueva situación con más igualdad en la acumulación del capital humano, por la sencilla razón de que bloquean la posibilidad de un financiamiento solidario</i>”<br />
<br /></div>
<h3>
Sitio web</h3>
Sobre este tema no voy a profundizar, ya que pueden leer lo escrito en el reporte final (<a href="https://pyconar20012-postmortem.readthedocs.org/en/latest/web.html" target="_blank">postmortem</a>) y en el blog ("<a href="http://pyconar.blogspot.com.ar/2012/07/sitio-web-de-pycon-argentina-un-poco-de.html" target="_blank">Historia y como colaborar</a>").<br />
Solo voy a agregar que no es un tema menor, pueden ver que el sitio de PyCon US 2011 costó en principio USD 15.000 (ver <a href="http://www.python.org/psf/records/board/resolutions/">http://www.python.org/psf/records/board/resolutions/</a>) y tampoco fue exento de inconvenientes, luego de haber intentado un primer desarrollo comunitario, para pasar a uno más comercial.<br />
Un consejo en este punto sería tratar de balancear los requerimientos, con un diseño más profesional, pero un desarrollo comunitario perdurable en el tiempo y reutilizable en otras conferencias.<br />
Ver nuevamente el <a href="http://mail.python.org/mailman/listinfo/conferences" target="_blank">mail de Diana Clarke</a> (que recomienda no construir algo nuevo solo por diversión), aunque recomienda el software web <a href="https://github.com/pinax/symposion" target="_blank">symposion</a> basado en pinax, que creo es más complejo que <a href="http://web2conf.googlecode.com/" target="_blank">web2conf</a>, hecho en web2py y más facil de usar y mantener, el cual recomiendo ya que lo venimos usando estos años ;-)<br />
<br />
YMMV<br />
<br />
<br />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-81776494049066541392012-11-09T19:49:00.001-03:002012-11-09T19:49:41.175-03:00PyCon Argentina 2012 es la próxima semana!¡La conferencia de Python comienza el próximo Lunes 12, y se extiende hasta el Sábado 17!<br />
<br />
<a href="http://ar.pycon.org/2012">http://ar.pycon.org/2012</a><br />
<br />
Por mi parte, más allá de los temas generales, estaré coordinando una reunión de desarrollo de <a href="http://ar.pycon.org/2012/projects/index#29">PyAfipWs</a> (acérquense si están interesados en el tema de factura electrónica) y presentando un poster sobre <a href="http://ar.pycon.org/2012/activity/accepted#15">Rad2Py</a>.<br />
<br />
Otras reuniones de desarrollo interesantes incluyen "Core Python" (para colaborar con el desarrollo del lenguaje) y "web2py" (marco de trabajo web para desarrollo rápido, fácil y simple). Hay muchas más reuniones y actividades, pueden ver lista completa de <a href="http://ar.pycon.org/2012/projects">Proyectos para Sprints</a>, <a href="http://ar.pycon.org/2012/activity/accepted">Pósters y Charlas Aceptadas</a>.<br />
<br />
Este año también hay <a href="http://ar.pycon.org/2012/conference/tutorials">talleres y seminarios</a> prácticos para sumergirse más profundamente en estas tecnologías sin perder de vista las charlas para tradicionales y charlas "<a href="http://ar.pycon.org/2012/conference/extreme">extremas</a>" mucho más enfocadas en temas particulares, junto con un eje de <a href="http://ar.pycon.org/2012/conference/science">Ciencia</a> para usos de Python en Educación, Ingeniería e Investigación.<br />
<br />
Las actividades especiales incluyen una <a href="http://www.pgday.com.ar/buenosaires2012">Jornada Intensiva de PostgreSQL</a>, un SugarDay y un Desafío "<a href="http://pyconar.blogspot.com.ar/2012/09/aprendiendo-programar-con-robots-y.html">Aprendiendo a programar con Python y Robots</a>".<br />
<br />
Por último, no se pierdan los <a href="http://pyconar.blogspot.com.ar/2012/10/python-gourmet-y-social-recepcion.html">eventos sociales</a>, ya que son una oportunidad única de conocer otros desarrolladores e interconectarse con la comunidad, en un ambiente más informal y ameno.<br />
<br />
La agenda completa en: <a href="http://ar.pycon.org/2012/schedule">http://ar.pycon.org/2012/schedule</a><br />
<br />
La entrada es libre y gratuita, la inscripción online cierra hoy (<a href="http://ar.pycon.org/2012/user/register">http://ar.pycon.org/2012/user/register</a>), útil para evitar demoras y contratiempos, pero igualmente podrán acercarse e inscribirse manualmente en el sitio si lo desean.<br />
<br />
Los esperamosMariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-22524426649135447142012-09-18T18:30:00.000-03:002012-09-18T18:30:26.820-03:00Programación Python con Robots - charla abierta<br />
Charla Abierta<br />
<h2>
“Programación Python con Robots”</h2>
<b>Jornada Institucional - Instituto Pascal - Jueves 20 de Septiembre - desde las 18 hs</b><br />
<br />
<i>Aprender con Python es aprender con Software Libre en un ambiente de programación </i><br />
<i>sencilla, que tiene una motivación ideal: escribir aplicaciones para el “mundo real”</i><br />
<br />
<b id="internal-source-marker_0.7434879615902901" style="font-weight: normal;"><img height="276px;" src="https://lh3.googleusercontent.com/IBdWjA4QeI7_8LR7p5Ex2zPoLYakmc0PGJHUGV3hp4EwzXMt8naHgXMsoCO_9wmm2UIh3AicOl1QIO315ei8pz53PaCjDQxWrPYXx4BywLpGTbFb_DY" width="300px;" /></b><br />
<br />
Temario:<br />
<br />
<ul>
<li>Conceptos básicos de programación</li>
<li>Implementación de algoritmos sencillos.</li>
<li>Introducción al lenguaje Python.</li>
<li>Primeros pasos: instalación de hardware y software</li>
<li>Funciones para manipulación del robot</li>
<li>Ejercicios básicos y demostraciones</li>
</ul>
<br />
Basado en el Proyecto de Extensión <a href="http://robots.linti.unlp.edu.ar/">“Programando con robots y software libre”</a> dirigido por la Lic. Claudia Banchoff, LINTI, Universidad Nacional de La Plata<br />
<br />
Destinado a alumnos y docentes del nivel secundario y terciario<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/document/pubimage?id=1I0YAIAzfR02l2PjaexWWJf-lHclMfnrEUD_yf5L2I6s&image_id=1UBWbB7_kN7oQkU07HVYIwmPXcne2vqQ" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://docs.google.com/document/pubimage?id=1I0YAIAzfR02l2PjaexWWJf-lHclMfnrEUD_yf5L2I6s&image_id=1UBWbB7_kN7oQkU07HVYIwmPXcne2vqQ" width="180" /></a></div>
<br />
<br />
<b>Instituto Superior Tecnológico Blaise Pascal</b><br />
<br />
<a href="http://www.institutopascal.edu.ar/">www.institutopascal.edu.ar</a><br />
<br />
Puerto Argentino 4238<br />
Gonzalez Catán<br />
Provincia de Buenos Aires<br />
Argentina<br />
<br class="Apple-interchange-newline" />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-83375513914571588332012-05-23T14:15:00.000-03:002012-05-23T17:13:22.911-03:00web2py Application Development Cookbook<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zlMLhwdkQb9_PyXgsP0ZOsfgbypIQBp4-Oy-1Hsx5s8_GkPmvwj5g5IDWgR-R3rRukKyu8viZEWOLxefRN-nAe3W-CJfv4YlWR8DnLacyEDJwe6MnMN0reWT9LuKYJ1fk56QHZCKQ-4/s1600/web2py_cookbook.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zlMLhwdkQb9_PyXgsP0ZOsfgbypIQBp4-Oy-1Hsx5s8_GkPmvwj5g5IDWgR-R3rRukKyu8viZEWOLxefRN-nAe3W-CJfv4YlWR8DnLacyEDJwe6MnMN0reWT9LuKYJ1fk56QHZCKQ-4/s320/web2py_cookbook.png" width="260" /></a>Hemos escrito un libro de recetas para el <b>desarrollo de aplicaciones</b> con <b>web2py</b>, el cual fue publicado por Packt Publishing en Marzo y ya está disponible para la venta, tanto en formato e-book como impreso.<br />
<br />
Hasta el <b>28 de mayo</b>, entrá a la página y participá en la encuenta y ganá <b>5 libros gratuitos</b> donados por Packt:<br />
<br />
<a href="http://web2py.com/cookbook">http://web2py.com/cookbook</a>
<br />
<br />
En dicha página también está publicado el código fuente, erratas.<br />
<br />
La página para comprarlo en Packt Publishing es:<br />
<br />
<a href="http://link.packtpub.com/di3Bc5">http://link.packtpub.com/di3Bc5</a><br />
<br />
También buscamos revisores, contactame si estás interesado.<br />
<br />
<i><u>Con el anticipo de las comisiones por ventas del libro hemos consituido un fondo para continuar fomentando el desarrollo de web2py, </u></i><i><u>python</u></i><i><u> y el software libre.</u></i><br />
<h4>
Visión General:</h4>
<ul>
<li>Lleva tus habilidades de web2py al próximo nivel al sumergirte en recetas deliciosas y útiles de este "libro de cocina"</li>
<li>Aprende web2py avanzado, desde el uso de formularios a creación de reportes PDF</li>
<li>Escrito por los desarrolladores del proyecto web2py con cantidad de ejemplos para un aprendizaje comprehensivo e interesante</li>
</ul>
<h4>
Tabla de Contenidos:</h4>
<ul>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo 1: Deploying web2py</a> (desplegando e instalando web2py en windows, ubuntu, para apache, cherokee, ngnix, IIS, tanto CGI, uWSGI,
mod_wsgi, mod_proxy, mod_rewrite, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">2: Building Your First Application</a> (creando tu primer aplicación: contactos, clones de reddit y facebook, páginas semi-estáticas, menús dinámicos, logo personalizado, rendimiento de descargas, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_3">3: Database Abstraction Layer</a> (Capa de Abstracción de Base de Datos: performance, migración de bases de datos previas, importación/exportación de datos)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_4">4: Advanced Forms</a> (Formularios Avanzados, Uploads, Validadores, Ajax, tooltips, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_5">5: Adding Ajax Effects</a> (Efectos Asincrónicos con JavaScript;
autocompletado, dropdown, sliders, jqgrid, webgrid, etc, )</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_6">6: Using Third-party Libraries</a> (Usando bibliotecas de terceros: logging, planeta de feeds, mostrando tweets, dibujando con matplotlib, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_7">7: Web Services</a> (servicios web JSON-RPC, SOAP, amazon, paypal, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_8">8: Authentication and Authorization</a> (Auth, OAuth, CAPCHA, modo docente, pyGravatar, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_9">9: Routing Recipes</a> (URL limpias, prefijos, URL para idiomas, etc.)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_10">10: Reporting Recipes</a> (listados, reportes y plantillas PDF)</li>
<li><a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_1">Capítulo</a> <a href="http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2pycookbook.com&utm_medium=link&utm_content=authorsite&utm_campaign=mdb_009921#chapter_11">11: Other Tips and Tricks</a> (depuración, Eclipse, quotas, mercurial, background cron, usando web2py para aplicaciones visuales, etc.)</li>
</ul>
<h4>
Detalles del libro:</h4>
<ul>
<li><b>Idioma</b> : Íngles</li>
<li><b>Impresión</b> : 364 páginas</li>
<li><b>Publicación</b> : Marzo de 2012</li>
<li><b>ISBN</b> : 1849515468</li>
<li><b>ISBN 13 </b>: 978-1-84951-546-7</li>
<li><b>Autores </b>: Mariano Reingart, Bruno Cezar Rocha, Jonathan Lundell, Pablo Martin Mulone, Michele Comitini, Richard Gordon, Massimo Di Pierro</li>
<li><b>Temas y Tecnologías</b> : All Books, Cookbooks, Open Source, Python</li>
</ul>
<div>
<br /></div>
<br />Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-44677659683466988302012-03-28T12:44:00.000-03:002012-03-29T11:56:45.958-03:00PyCon US 2012 ("lo que nunca te contaron...")El siguiente texto nació como una especie de rant escrito en una madrugada de insomnio (tratando de escribirlo antes de olvidarme la mayoría de las cosas), pero ya está más depurado. Sepan disculpar los inconvenientes.<br />
<h2>
La Previa</h2>
<h3>
Envío de Propuestas</h3>
<div>
Para 2011 había enviado dos propuestas, una charla sobre factura elctrónica (pdf, webservices, etc.) y un poster sobre "pyreplica" (replicación para postgresql con python). </div>
<div>
El poster fue aceptado, la charla no tuvo la misma suerte, pero recibí un correo de notificación explicando los motivos (resumido: la facturación es un nicho, y hay charlas mejores). Lo mismo me paso en 2009 en la primer Conferencia de Python Argentina, por lo que posiblemente la redacción de la propuesta no fue lo suficientemente clara y adecuada para este evento, dado que a mi humilde entender, la charla trataba sobre otros temas más generales como servicios web, pdf, cli/gui, rpc con otros lenguajes legados, bases de datos, etc.</div>
<h4>
Charla "Python Caveats: Fixing Broken Windows"</h4>
<div>
Para este año intenté mejorar la descripción de la charla, con un abtract abarcativo y un bosquejo detallado, citando referencias, links a código fuente, estadísticas, etc. Estaba inspirado por el cuasi-panel <a href="https://ar.pycon.org/2011/activity/accepted/29">"Python Apesta"</a> de PyConAr 2011.</div>
<div>
Al día de hoy desconozco puntualmente el motivo de rechazo, pero seguramente este año hubo charlas mejores (de hecho las propuestas superaron en 4 veces la cantidad de espacio disponible para charlas).</div>
<div>
Ver más adelante en la sección revisión algunos temas "no del todo documentados" relacionados con la selección de charlas. </div>
<div>
Posiblemente haga una entrada de este blog para ir refinando el tema. </div>
<h4>
Poster "RAD2PY: platform+IDE for solid & predictable Rapid Application Development"</h4>
Basado en mi trabajo de tesis de licenciatura, prepare un poster para presentar:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC7edXj48Ij-1SNLzpFnauJQcH1N2YyKJLSBBUnS6HT4qgL05S7BJSmCuzoedH8BBJrM4tzHdkeOTA1kqyBc8SYDPoLlkYT0tBNeMe1cIdrnqX6Vrcyxkcgtz5VL3zZ_obo9Iz_l8lKf8/s1600/rad2py.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC7edXj48Ij-1SNLzpFnauJQcH1N2YyKJLSBBUnS6HT4qgL05S7BJSmCuzoedH8BBJrM4tzHdkeOTA1kqyBc8SYDPoLlkYT0tBNeMe1cIdrnqX6Vrcyxkcgtz5VL3zZ_obo9Iz_l8lKf8/s640/rad2py.png" width="640" /></a></div>
<br />
Como toda la propuesta no entró en el poster principal, arme dos carteles complementarios (web2py y gui2py):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIvji6_DhFlCJk-2awtR2wizZSeeHx41TTlduvvFfvYO-Hdy7gQoU2Jp2tHjsEVnZsJahzJlwAagT6R6aF0HbhJX7sn2ZnZWe1RztknIQT80eSTV2H7TSdvflkLFKHLjXHOca3ZiapdlI/s1600/web2py.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIvji6_DhFlCJk-2awtR2wizZSeeHx41TTlduvvFfvYO-Hdy7gQoU2Jp2tHjsEVnZsJahzJlwAagT6R6aF0HbhJX7sn2ZnZWe1RztknIQT80eSTV2H7TSdvflkLFKHLjXHOca3ZiapdlI/s200/web2py.png" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg67sXrsSYyWSayRb-OwLBgWri9cZnzYE1Sz4k2uw9nT8L6ecMPFXY-RmHgS-XRs6NIYLPNH_fRIFRBoD4Vel0Fe1QElqqXP_q7J4CcDsT2WRS50p6QD3WwTsasLzfeIJ_OzitXD7p4Gm8/s1600/gui2py.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg67sXrsSYyWSayRb-OwLBgWri9cZnzYE1Sz4k2uw9nT8L6ecMPFXY-RmHgS-XRs6NIYLPNH_fRIFRBoD4Vel0Fe1QElqqXP_q7J4CcDsT2WRS50p6QD3WwTsasLzfeIJ_OzitXD7p4Gm8/s200/gui2py.png" width="200" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div style="text-align: -webkit-auto;">
Felizmente el poster fue aceptado: <a href="https://us.pycon.org/2012/schedule/presentation/147/">https://us.pycon.org/2012/schedule/presentation/147/</a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
El poster tenía contenidos similares a los de la charla, resumiendo las 200 hojas de investigación.</div>
Un consejo: si desean presentar algo en PyCon, por las dudas, preparen un póster (hasta tienen más posibilidades que una charla relámpago, ver más adelante...)<br />
Además, los posters se aprueban a medida que llegan (con una demora de 1 mes aproximadamente), por lo que es útil para solicitar una Carta de Invitación para ir tramitando la Visa.<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Por el presente agradezco públicamente a JuanBC que me ayudó con la tipografía y temas de diseño (y lo más importante, diseño el logo de rad2py).</div>
<br />
<h3>
Revisión de Charlas</h3>
<div>
Como voluntario, participe en algunas etapas de la selección de charlas. </div>
<div>
Comenzar es sencillo, un email introductorio al Comité de Programa (indicando nombre de usuario del sitio web y una breve biografía) y te habilitan el acceso a todas las charlas, con la posibilidad de hacer comentarios y la correspondiente revisón. </div>
<div>
<br /></div>
<div>
La revisión se basa en la técnica <a href="http://scg.unibe.ch/download/champion/">Identify the Champion</a>, básicamente un puntaje entre +1, 0, -1, para literarmente defender u oponerse en alguna medida a cada charla. </div>
<div>
Traté de revisar algunas, revisar todas era físicamente imposible y además uno debería tener conocimientos en la materia, por lo que me limité a charlas de web, gui, postgresql, educación, etc.</div>
<div>
<br /></div>
<div>
Hasta donde recuerdo, como reglas generales, se debía priorizar proyectos reconocidos con una base de usuarios considerable, con código funcionando, documentación, etc. (de lo contrario, sugerían poster). Las charlas de comunidad fueron casi todas rechazadas (ver más adelante charlas relámpago). La biografia del autor era muy influyente (haber dado una charla previamente y ser experto en la materia era casi excluyente). Las propuestas poco detalladas serían rechazadas si el autor no contestaba los comentarios o no proveía más información (con algunas excepciones de autores reconocidos o temas puntuales).</div>
<div>
En teoría se debía calificar respecto a la propuesta concreta, no sobre la hipotética charla que nos gustaría ver.</div>
<div>
<br /></div>
<div>
Si mal no recuerdo, las charlas con todos los votos negativos se descartaron directamente. Las que no tenían algún +1 quedaban en el limbo como dudosas. Las que tenían exclusivamente +1 se aceptaban casi automáticamente, pero fueron las menos (IIRC). El esquema es parecido al que se usó en PyConAr los primeros dos años.</div>
<div>
<br /></div>
<div>
Luego vino el <a href="http://es.wikipedia.org/wiki/Mad_Max_Beyond_Thunderdome">thunderdome</a>, un "campo de batalla virtual" por chat para "luchar" a favor o en contra de cada charla (generalmente divididas en grupos de a 3-4, por afinidad, donde se debía aceptar, separar y descartar las propuestas). En mi caso no pude seguir el rítmo (perdí la cuenta de la cantidad de reuniones por IRC, a veces dos por día) y no llegué a comprender del todo algunos argumentos (en ocasiones parecieran bastante intuitivos en los escasos minutos que había disponibles para tomar una decisión sobre cada charla).</div>
<div>
<br /></div>
<div>
Por último, quedaron algunos espacios vacantes por lo que se resucitarón algunas charlas (aquellas separadas en el thunderdome) a criterio del coordinador de programa, que solicitó previamente algunos comentarios no vinculantes.</div>
<div>
<br />
Para más info, ver:<br />
<ul>
<li><a href="http://catherinedevlin.blogspot.com.ar/2009/11/pycon-program-committee-volunteer.html">http://catherinedevlin.blogspot.com.ar/2009/11/pycon-program-committee-volunteer.html</a></li>
<li><a href="http://www.doughellmann.com/articles/how-tos/review-conference-proposal/index.html">http://www.doughellmann.com/articles/how-tos/review-conference-proposal/index.html</a></li>
</ul>
</div>
<div>
En mi humilde opiñon, este sistema es bueno para conferencias científicas/académicas donde uno tiene el artículo (paper) por anticipado y realmente hay pares expertos. Para conferencias comunitarias, creo que es mejor un sistema de voto alternativo por preferencias ponderadas (similar al sistema de Python Brasil y PyConAr en las últimas ediciones, incluyendo en ciertos casos una consulta al público que en definitiva es el que va a ver las charlas, como en <a href="https://ep2012.europython.eu/talk-voting/">EuroPython</a> y <a href="http://ar.pycon.org/2011/activity/ratings">PyConAr</a>). </div>
<div>
<br />
<ul>
</ul>
</div>
<h3>
Asistencia Financiera</h3>
<div>
Una de las principales barreras para asistir a PyCon US es el costo de los pasajes, estadía y entrada al evento (no es gratuito). Si bien no es algo impagable, los importes y el tipo de cambio son considerables para ir desde Argentina (desde 300 dólares la inscripción individual, 190 dólares la noche de alojamiento, 150 dólares cada tutorial, 1400 dólares el pasaje de avión, sin contar los costos de tramites visa, seguros, etc.).</div>
<div>
<br /></div>
<div>
El año pasado, luego de completar el formulario, dado la gran cantidad de solicitantes, me ofrecieron la entrada sin costo y 1/5 del pasaje. Finalmente luego de algunos días de espera para ver si se podía conseguir fondos adicionales, lo decliné para dejarle lugar a otra persona a la que le cierren mejor los números.</div>
<div>
<br /></div>
<div>
Este año me ofrecieron algo similar (esta vez incluyendo noches de alojamiento, pero solo 50% de descuento en la registración bonificada). Luego pudieron ampliar la beca un poco y gracias a que pude sacar el pasaje con anticipación (bajo una promoción) y una mejor situación financiera personal, decidí emprender el viaje.</div>
<h2>
La Conferencia</h2>
<h3>
Tutoriales</h3>
<div>
Tomé dos tutoriales:</div>
<div>
<ul>
<li>Faster Python Programs through Optimization</li>
<li>How to get the most out of your PyPy</li>
</ul>
Para decirlo en criollo, tuvieron gusto a poco. En el primero tuve que compilar una herramienta (otras directamente no estaban soportadas) y en lineas generales no tuvo la profundidad esperada. En el segundo, termine encontrando un bug (feature no implementado) que me imposibilitó seguir.</div>
<div>
<br /></div>
<div>
Parece que no fue algo aislado, el día previo ayude a una señora que tenía problemas para instalar Qt en su Mac, y luego al cruzarmela en la registración habiendo tomado el tutorial, no lo pudo instalar ni con la ayuda del instructor (por el tiempo que requiere), por lo que lo tomo con humor decidiendo que no era para ella, a lo que le recomendé wxPython como alternativa antes de Tkinter, que estaba por empezar a ver.</div>
<div>
<br /></div>
<div>
Seguramente tuve mala suerte al elegir tutoriales que no eran para mi, ya que luego hablando con Tatiana Alchueyr, me comento que había asistido a un tutorial que estuvo muy bueno.</div>
<div>
<h3>
WebDev Summit</h3>
<div>
De lo mejor que vi en la conferencia. Un día entero dedicado al desarrollo web, con varios paneles tratando las distintas problemáticas:</div>
<div>
<a href="https://us.pycon.org/2012/community/WebDevSummit/">https://us.pycon.org/2012/community/WebDevSummit/</a>
</div>
<div>
<br /></div>
<div>
Me tocó reemplazar a Massimo Di Pierro como disertante en el panel "Factoring Code for Reuse", ya que por tema de horario él no podía asistir. Espero haber cumplido, lamentablemente mi Inglés no es perfecto pero viendo al moderador y charla informal posterior, entiendo que el mensaje llegó satisfactoriamente.</div>
<div>
<br /></div>
<div>
Lo interesante fue ver como web2py encara satisfactoriamente algunos temas planteados, que no fueron considerados (calculo por desconocimiento) en la mayoría de ocasiones, como el despliegue simil .WAR con un paquete todo-incluido; reuso de otros modelos/componentes intercambiable entre bibliotecas; y promoción de Python para la Web (windows, educación, diseñadores y no programadores, etc.).</div>
<div>
<br /></div>
<div>
Afortunadamente Massimo llegó luego del almuerzo y pudo dar una charla relámpago mencionando el modo en que web2py esta afrontando estos temas, espero que sirva para hacer de Python realmente una comunidad más diversa...</div>
<div>
<br /></div>
<div>
Más alla de esto, fue muy interesante la jornada, viendo un poco cual es la tendencia actual, cuales son los problemas que enfrentan otros frameworks y buscar formas de colaborar (que discutimos luego en los sprints).</div>
<h3>
Backstage, Registración y Desayuno</h3>
<div>
<div>
La noche del Jueves se realizó el armado de bolsas (todavía no entiendo como se llenaron 2000 bolsas en un par de horas, teniendo en cuenta que incluía bastantes materiales e incluso otra bolsa). No tengo la cuenta, pero todos fueron voluntarios, tanto disertantes como organizadores y participantes ayudaron por igual.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPKIcKlvk1_1WGfvzT1YmyG7jRavUloVaCTayvJG2QFKI1jG-_a9n7tpd3R0_oKeLX6pE7BJctmARxgiK6APZpvXlztAiXhE7_m2ABHIcuqSqvTOT3ocV3BlA7ThwzmZxmSP0oXJbFCTQ/s1600/SAM_3256.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPKIcKlvk1_1WGfvzT1YmyG7jRavUloVaCTayvJG2QFKI1jG-_a9n7tpd3R0_oKeLX6pE7BJctmARxgiK6APZpvXlztAiXhE7_m2ABHIcuqSqvTOT3ocV3BlA7ThwzmZxmSP0oXJbFCTQ/s320/SAM_3256.JPG" width="320" /></a></div>
<div>
</div>
<div>
<br /></div>
<div>
Por la mañana del viernes fue el grueso de registración (pasabas el código de barras impreso en la hoja, te entregaban otra hoja troquelada para hacer origami y armar el identificador con el colgante, a lo que se le pegaban las cintas según el tipo de participación):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhGG_1tCFcdV0MOqM7SVzWVADC4JRLAp4p2uJxuHND6uq9W2kjlCa9BNKKWEJu99f307fZhUDU5vMMfZp9aWxDL1-GMSWq1w2qgGaX5T8ftOOFlWuxVxYRNCaeXnYasc_9FHbE6mmKazk/s1600/SAM_3281.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhGG_1tCFcdV0MOqM7SVzWVADC4JRLAp4p2uJxuHND6uq9W2kjlCa9BNKKWEJu99f307fZhUDU5vMMfZp9aWxDL1-GMSWq1w2qgGaX5T8ftOOFlWuxVxYRNCaeXnYasc_9FHbE6mmKazk/s320/SAM_3281.JPG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUlZajlT-u6w1ub4nqrH-Fq1DSOqS49ckIcTj5yASGP82dFdV_N7dRZ0ww4JFrQnEpZgd-WTLPlk7Xe7LEiUCcZHbsIsabP19zNcNmMH9_0KrgHSV2dVY_IEo9KZgR8AWBtwjKv3N3b8/s1600/badge.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUlZajlT-u6w1ub4nqrH-Fq1DSOqS49ckIcTj5yASGP82dFdV_N7dRZ0ww4JFrQnEpZgd-WTLPlk7Xe7LEiUCcZHbsIsabP19zNcNmMH9_0KrgHSV2dVY_IEo9KZgR8AWBtwjKv3N3b8/s200/badge.jpg" width="150" /></a></div>
<br /></div>
<div>
Ayude en lo que pude en ambos, fue útil para conversar y conocer gente, por ej. le entregue la remera a Armin Ronacher, y de paso le pregunté si quería venir a Argentina.</div>
<div>
<br /></div>
<div>
El desayuno en el lugar también fue útil para charlar con gente y aprovechar mejor el día, lo que se complementaba con el almuerzo también en el lugar, donde por ej. nos juntamos con Tatiana para conversar temas de PyConAr 2012 y PythonBrasil 2012, y de casualidad me sente en la misma mesa que Brett Cannon, asique aproveche para comentarle sobre PyConAr (Ricardo Kirkner había hablado algo con él previamente).</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVa89jWKqSFQbPrrXiCjZIy6gywj6mKSavAOtOeVaEr4DtuDLqXhwNzht73cOBUOrhAv3Q0_xNYYBL1_gi2GWvZTXuVAEy_pK_ycseH9eVQtEhfOgxUdS1XIRH_pyem0E6tQjXWRvExWc/s1600/SAM_3286.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVa89jWKqSFQbPrrXiCjZIy6gywj6mKSavAOtOeVaEr4DtuDLqXhwNzht73cOBUOrhAv3Q0_xNYYBL1_gi2GWvZTXuVAEy_pK_ycseH9eVQtEhfOgxUdS1XIRH_pyem0E6tQjXWRvExWc/s200/SAM_3286.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxdWcN8CzqcpU7Rz8rOspHmueg0ROVaiGlIx-GKhODMSDqNoXs1LiCsGZe4o6dlkdi6Xhet82i2W7YmNk0s1xeuNjEVuQ3v8CRHqSqMhYtIJVKij2JSuyM3hFe1z4GTY-yjWyh2LAE17c/s1600/SAM_3278.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxdWcN8CzqcpU7Rz8rOspHmueg0ROVaiGlIx-GKhODMSDqNoXs1LiCsGZe4o6dlkdi6Xhet82i2W7YmNk0s1xeuNjEVuQ3v8CRHqSqMhYtIJVKij2JSuyM3hFe1z4GTY-yjWyh2LAE17c/s200/SAM_3278.JPG" width="200" /></a></div>
</div>
<h3>
Charlas </h3>
<div>
El Viernes, Sábado y Domingo fue el evento principal. Más de 100 charlas llenaron el cronograma:</div>
<div>
<a href="https://us.pycon.org/2012/schedule/">https://us.pycon.org/2012/schedule/</a></div>
<h4>
Apertura, Keynotes y Plenarias</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDQYGpMrovc2hknPKD1L0dVz5zBLSV3NkSK6cy6zGAkOGKaIkCffuUUXhPdBlBDqkoHDfzQz_xJcJle3OP2j-HuhkMzxl4iRO6nqR5wV0ugViUsXaKAR8cSefdE2Ooalnsphd5SNirTHU/s1600/SAM_3267.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDQYGpMrovc2hknPKD1L0dVz5zBLSV3NkSK6cy6zGAkOGKaIkCffuUUXhPdBlBDqkoHDfzQz_xJcJle3OP2j-HuhkMzxl4iRO6nqR5wV0ugViUsXaKAR8cSefdE2Ooalnsphd5SNirTHU/s320/SAM_3267.JPG" width="320" /></a></div>
<div>
<br /></div>
<div>
La apertura fue muy entretenido, con un show de robots comandados por python (hubo una mínima demora esperando que la mayoria apague sus notebooks por la interferencia). Luego en el stand se pudo apreciar de cerca (ver abajo).</div>
<div>
<br /></div>
<div>
La primer keynote, Stormy Peters de Mozilla, no tuvo mucho que ver con Python pero si con la comunidad, el open source. Si mal no recuerdo, arrancó como la web influye hoy por hoy nuestras vidas, habló de no maltratar ni espantar a los nuevos usuarios, no imponer el software libre a toda costa, etc.</div>
<div>
Para la segunda keynote estaba ayudando en la registración, pero por lo que escuche, fue más orientada a startups.</div>
<div>
<br /></div>
<div>
La plenaria del Sábado (David Beazley) fue mucho más interesante y orientada a python (anunciada como técnica y diabólica), pero me quedo un sabor agridulce al ver la conclusión final sobre el futuro (no quiero faltar a la verdad con mi mala memoria, les recomiendo que la vean ya que es muy llevadera, tiene el estilo de Roberto Alsina).</div>
<div>
La plenaria del Domingo (Guido) obviamente fue 100% python, con un mensaje sobre el GIL y Android para pensar. En general, los consejos fueron interesantes, y el panorama del mundo Python creo que lo dejo en claro.</div>
<h4>
Charlas Programadas</h4>
<div>
Hubo charlas muy interesantes para mí como la de Armin Ronacher ("Code Generation in Python: Dismantling Jinja") y en menor medida, "Stop Writing Classes", "Web Server Bottlenecks And Performance Tuning", "RESTful APIs With Tastypie", "How CherryPy supports Python 2 and 3", "Spatial data and web mapping with Python", "Deep Freeze: building better stand-alone apps with Python". </div>
<div>
Si bien ninguna tuvo la verdad revelada (dificil para 30 o 40 minutos), me llevé consejos utiles de ellas para procesar luego con más tranquilidad (que todavía no tuve).</div>
<div>
<br /></div>
<div>
A la de Raymond Hettinger ("The art of subclassing") no pude entrar porque estaba llenno, pero aparentemente también fue muy buena.</div>
<div>
Otras, como "Putting Python in PostgreSQL" y "web2py: ideas we stole and ideas we had", me fueron útiles desde otra perspectiva, mas que nada, el modo de presentación, la interacción y preguntas.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31Z2xxBKkNo_GkEUhYoqEVYHYXnlh7SAshzE-xPznae5MlBLALxS-yR4lmEpYIwJY6k_zpJR5zAvKmBmKvPT9kfgcsYzSoEx8PXJv03qB_l_YrkVjKwXI9ZjLgyOssgll23qS-zOvTPU/s1600/SAM_3295.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31Z2xxBKkNo_GkEUhYoqEVYHYXnlh7SAshzE-xPznae5MlBLALxS-yR4lmEpYIwJY6k_zpJR5zAvKmBmKvPT9kfgcsYzSoEx8PXJv03qB_l_YrkVjKwXI9ZjLgyOssgll23qS-zOvTPU/s320/SAM_3295.JPG" width="320" /></a></div>
<br />
Una frase que me quedo dando vuelta fue "For the questions I warn you: I'm an architect so I don't know the details". Me pareció raro en una conferencia de este tipo (dado el tipo y descripción de charla). En estos casos, creo que tener de antemano el borrador de la presentación o un articulo/paper ayudaría a que no haya malos entendidos. </div>
<div>
<br />
<div>
También me llamó la atención que la mayoría de las charlas terminaban con un mensaje tipo "Tenemos un startup, estamos reclutando empleados!", algunas llegando al punto de sobrevolar los temas técnicos para directamente recomendar contratar la solución comercial que ofrecían. </div>
<div>
No digo que este mal, de hecho me parece útil conocer todas las opciones, solo que algunas me tomaban desprevenido.</div>
<div>
<br /></div>
<div>
En algunas charlas trate de ayudar como session runner, no sin los sobresaltos típicos (el disertante no aparecía en una charla, el session chair no aparecía en otra, el session runner -yo- llegaba tarde y temas menores), igualmente fue enriquecedor y sirvió para romper un poco la rutina. La "green room" donde se reunía a los disertantes antes de la charla y se los obligaba a terminar (grabar en el pendrive) y probar la charla en el proyector fue bastante útil. </div>
<h4>
Charlas Relampago</h4>
<div>
Las charlas relámpago de 5 minutos que ví fueron muy interesante, lastima que el video de PyAr que habíamos hecho (JuanBC principalmente, con la colaboración de todos) no fue seleccionado...</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/sbsXRVS158M?feature=player_embedded' frameborder='0'></iframe></div>
<div>
<br /></div>
<div>
Este año cambiaron las reglas y la selección en vez de ser por orden de llegada fue aleatoria (y el cronograma era bastante rígido, al punto de no poder cambiar el contenido de los slots que fueron adjudicados a otros miembros de PyAr). De haberlo sabido, quizás hubiera armado un poster o pedido un stand comunitario. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU0BZg8N_xOK9Z_ExkaEm3_yGS74yG7GbxR-g_uH8EQSkAXefZpTa8Y3uTn-Zz7QRx9dR7bCeSVpKKWSpkiHmPX3vmkbdm9C0tCFx4QaxJZ8uM7ZBXNx02A_YFgOEhJcvCv3ACklBBO_0/s1600/SAM_3288.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU0BZg8N_xOK9Z_ExkaEm3_yGS74yG7GbxR-g_uH8EQSkAXefZpTa8Y3uTn-Zz7QRx9dR7bCeSVpKKWSpkiHmPX3vmkbdm9C0tCFx4QaxJZ8uM7ZBXNx02A_YFgOEhJcvCv3ACklBBO_0/s320/SAM_3288.JPG" width="320" /></a></div>
<div>
<br /></div>
<div>
Particularmente no se si es el mejor método para elegir charlas relámpago, ya que las hojas se llenaban estando hasta dos días disponible sin limite práctico (o sea, se anotaron 2 o 3 veces más propuestas del tiempo disponible). Creo que de este modo se pierde un poco la mística, en cambio, limitar a 10 charlas + backups me parece que le da más entidad, obligando a preocuparse y negociar un poco más con otros disertantes y el coordinador (salvo que falle la interfaz humana, como en este caso).</div>
<div>
<br /></div>
<div>
De hecho, este tema (expresado en un email de "feedback" en la lista de organización por quien escribe), sumado a que se rechazaron la mayoría de charlas de comunidad, quizás dé nacimiento a un track "comunidad" valga la redundancia, para agrupar las charlas que no cumplen los criterios de "notoriedada" y "audiencia" necesarios para las charlas generales.</div>
<h3>
Espacios Abiertos</h3>
<div>
Prácticamente me los perdí, estaban un poco alejados y no estaba muy atento a los temas que se presentaron. </div>
<div>
De hecho, con Massimo armamos un espacio abierto de web2py al que no asistí porque se me superpuso con una charla y al llegar ya era tarde (en realidad me olvidé...). </div>
<div>
Todavía me arrepiento ya que la charla no estuvo muy buena y me perdí de hablar con Guido, que estaba interesado en el depurador web (si, leíste bien, aparentemente <b>GvR fue al OpenSpace de web2py</b>...).<br />
<br /></div>
<div>
El Testing BOF lleno mucha gente, no me pude quedar porque ya estábamos cansados, pero tenían proyector y todo, también me queda como asignatura pendiente para la próxima.</div>
<div>
<h3>
Salón de Exposición</h3>
</div>
<h4>
Expositores</h4>
<div>
El Viernes y Sábado armaron los stands de los expositores (Sponsors) y comunidad (PyLadies, Women Who Code, Pyramid). Eran varios stands, la disposición se asemeja mas a una evento comercial de TI (a diferencia de los eventos de software libre que he visto regionalmente).</div>
<div>
<br /></div>
<div>
Más allá del merchandising, no alcanzaban los intervalos para recorrerlo completamente e interiorizarse con cada Stand, lo que le aportaba mucho a la conferencia. </div>
<div>
Incluso cada tanto en el stand de NAO, los robot bailaban bajo la influencia pythónica:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHztoBqToFX43xgoNCk7i7qzJFp1b_YmKyksnrlg01c8SWkuBV5skN4XK03lKigMuMuAXK3eId_e7WRQx3_6rnSpeEagR06PmLOLjWxH-MFIY8cjuDG5aCsJEomeJBWMY-x7t4FFCeLEU/s1600/SAM_3274.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHztoBqToFX43xgoNCk7i7qzJFp1b_YmKyksnrlg01c8SWkuBV5skN4XK03lKigMuMuAXK3eId_e7WRQx3_6rnSpeEagR06PmLOLjWxH-MFIY8cjuDG5aCsJEomeJBWMY-x7t4FFCeLEU/s200/SAM_3274.JPG" width="200" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYi0IguMpoZJpKnx5m6LITIbVJKi345cMqS-CidsD31rPU-EBKa1mzUkXBk9Ba4TQu9k11qc4Q67CHO2X2rcfs_g5xLg_-kpJ_GLo_rTmRhWDGur4hE8jI8GSUt_s_zEcAQJAlVrecRTs/s1600/SAM_3271.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYi0IguMpoZJpKnx5m6LITIbVJKi345cMqS-CidsD31rPU-EBKa1mzUkXBk9Ba4TQu9k11qc4Q67CHO2X2rcfs_g5xLg_-kpJ_GLo_rTmRhWDGur4hE8jI8GSUt_s_zEcAQJAlVrecRTs/s200/SAM_3271.JPG" width="200" /></a></div>
<div>
<br /></div>
<div style="text-align: center;">
(perdonen la calidad de la foto, la camara tenía problemas con poca luz, por suerte la perdí...)</div>
<h4>
Posters y Feria de Empleos</h4>
<div>
Los posters fueron otro punto fuerte de la conferencia a mi entender. Del hall de esposiciones levantaron los stands y cada uno armo su poster. Durante una hora y media la gente se mostró muy interesada en los más de 40 posters, incluso el mismo GvR recorrió algunos y converso con los expositores. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WJKmVB9rEiFxrJbolJSwUowRbiDNVgqISxeMHn3t4C2Imqy6_idgruspZreQiHK2h-mZNtG1EFJrPICCdI2LfI7RbGjXP6CROU70x0vhj2FwE80eM5iTcQ8PzHV-lsQlX_bD4nWg14A/s1600/SAM_3303.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WJKmVB9rEiFxrJbolJSwUowRbiDNVgqISxeMHn3t4C2Imqy6_idgruspZreQiHK2h-mZNtG1EFJrPICCdI2LfI7RbGjXP6CROU70x0vhj2FwE80eM5iTcQ8PzHV-lsQlX_bD4nWg14A/s400/SAM_3303.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
El pizarron con mi poster (en ocasiones, flanqueado por Massimo en el poster secundario de web2py)</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUAhbBEnBMF2dq-j1pP618H3rOOJFeOuPXpXN9gF2etbV7lI2_NN7AbQak9rU9Uu1odnwdpm239eeYKHs6n35Jy8Gyb3cVZJ5i3LJ8W5XppPFIqezuAQoxjcQPxiZU8mmwIrUUVvPDUT4/s1600/SAM_3304.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUAhbBEnBMF2dq-j1pP618H3rOOJFeOuPXpXN9gF2etbV7lI2_NN7AbQak9rU9Uu1odnwdpm239eeYKHs6n35Jy8Gyb3cVZJ5i3LJ8W5XppPFIqezuAQoxjcQPxiZU8mmwIrUUVvPDUT4/s200/SAM_3304.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoKcr8poGzwi3_e0XXsVw7uyE5z0t5YJlm2edbDvbaaoWU7ig-x36-2Z0S2KWRroxrnhr3shIu_BWi_Yewi5waKaE2u8_tV1RdchLzhBI_fCZYQZR-ZxPUTKekWhMvnyeGf-1s9vHGgFI/s1600/SAM_3305.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoKcr8poGzwi3_e0XXsVw7uyE5z0t5YJlm2edbDvbaaoWU7ig-x36-2Z0S2KWRroxrnhr3shIu_BWi_Yewi5waKaE2u8_tV1RdchLzhBI_fCZYQZR-ZxPUTKekWhMvnyeGf-1s9vHGgFI/s200/SAM_3305.JPG" width="200" /></a></div>
<div class="" style="clear: both; text-align: center;">
<br /></div>
<div class="" style="clear: both; text-align: center;">
<div style="text-align: left;">
En el fondo se ubicó la Feria de Empleos, un lugar con mesas para que los Sponsors pudieran realizar entrevistas laborales y hablar con los interesados.<br />
<br /></div>
</div>
<h3>
Sprints de desarrollo</h3>
<div>
Las reuniones de desarrollo fueron otro punto considerable de la conferencia. Según los organizadores, se lograron juntar alrededor de 700 desarrolladores el primer día.</div>
<div>
<br /></div>
<div>
Si bien había proyectos para todos los gustos, estuve organizando un sprint de web2py, con varios interesados, principalmente:</div>
<div>
<ul>
<li>Discutiendo temas surgidos del summit como <a href="https://github.com/mdipierro/gluino">gluino </a>(un mini web2py que corre sobre flask, bottle, e incluso django) </li>
<li>Implementando nuevos features, como el editor Ace para web2py, soporte para toscawidgets, coffeescript, etc.</li>
<li>Resolviendo algunos bugs y recibiendo feedback de los usuarios</li>
</ul>
<div>
El resultado fue positivo, si bien Massimo tuvo que partir temprano, estuvimos trabajando varios días y la interacción con otros desarrolladores fue muy buena, abriendo un camino para que el año que viene otro desarrollador de web2py tome la posta y continuemos expandiendo nuestra comunidad.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7ZULTNd4TyAw4AuVnYt1gWnhpNLyQE_4r-K3z347T6UvWF43f5HeW6oT78zRJCprDMQ6vhqdWUPYMx7XCkqEaoj5DStkzbstXZvVfGjFd4xRtNSgywRpMNI_m0En0XXrhPlXkUkyi1kQ/s1600/AnzhGDRCAAAlECy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7ZULTNd4TyAw4AuVnYt1gWnhpNLyQE_4r-K3z347T6UvWF43f5HeW6oT78zRJCprDMQ6vhqdWUPYMx7XCkqEaoj5DStkzbstXZvVfGjFd4xRtNSgywRpMNI_m0En0XXrhPlXkUkyi1kQ/s320/AnzhGDRCAAAlECy.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
web2py sprint</div>
<div>
<br /></div>
<div>
<h3>
Hallway track, cenas y Party Nights</h3>
<div>
Los pasillos en los intervalos fueron el mejor lugar para conocer gente, charlar y coordinar otras actividades, como las cenas y salidas (por cierto, no había muchos lugares cerca y encima casi todos cerraban a las 8pm por ser zona comercial, y como el transporte público existe y es regular -cada 1 hora-, conviente alquilar un auto o quedarse en el hotel).</div>
<div>
<br />
También conversé con Josh Berkus (core de PostgreSQL) acerca de que quizás sea interesante armar un PgDay en paralelo/cerca de la PyCon y aprovechar speakers en común (me vino a la mente Hannu Krosing, quién fue DBAs de Skype y miembro del proyecto SkyTools: replicación + python, ha dado charlas en otras PyCons, etc).<br />
<br /></div>
<div>
Me encontré con usuarios de web2py de diversas partes del mundo (España/Finlandia, Brasil, India, Canada y por supuesto de EEUU). También me cruzé y con gente de Reino Unido, Austria, Singapur y otros países que ya no recuerdo.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR-gLDXmJeZLGCBcpOpcFM54KYLWDlFT4r12rTroAiR6C66qku5YYpnlcwLWFSlNqXIotinq9ezTh-iDy2ZSU04pTUh-_AqFkYVvegs5L1w8RsyJ_HhWSoXOGBedCVbZVnQi07UJdEfPI/s1600/SAM_3262_b.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR-gLDXmJeZLGCBcpOpcFM54KYLWDlFT4r12rTroAiR6C66qku5YYpnlcwLWFSlNqXIotinq9ezTh-iDy2ZSU04pTUh-_AqFkYVvegs5L1w8RsyJ_HhWSoXOGBedCVbZVnQi07UJdEfPI/s200/SAM_3262_b.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisQUQI9BHiZ4Z5df8Cxgr7FnYxDnGejJya12fqCvgrOtQ5r8RKSVtk_1ufZY23IHZC8Kv1L1spYM07pQc_Eu6i00eHoQlRKSRpuD3eIDyIk35ABXvcsKPbybJ5iCeFPJv4MGNA06x6WTM/s1600/SAM_3322.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisQUQI9BHiZ4Z5df8Cxgr7FnYxDnGejJya12fqCvgrOtQ5r8RKSVtk_1ufZY23IHZC8Kv1L1spYM07pQc_Eu6i00eHoQlRKSRpuD3eIDyIk35ABXvcsKPbybJ5iCeFPJv4MGNA06x6WTM/s200/SAM_3322.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Algunos días hubo fiesta, PyCon Party y PyLaydies. A la primera, si bien tenìa la entrada, no fui ya que estabamos reunidos con gente que no tenía entrada. A la segunda, fuimos y ahí con Massimo nos encontramos con Tatiana, donde lo invitamos a ambas conferencias.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Cerrando la reseña, en el lobby del Hyatt había un Pizarrón para grafitis lleno de mensajes, como ejercicio se puede comparar el antes y después (¿por que es la progamación tu pasión? qbasic rules!): </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmwuh5afscBNZVutSkGMiIexpbB0IZAEwhLeIFU31L-QPapkTAAmEaF4tLGbZtR-n4fugfTe8h_vc94VhPhU0qN44t8ABuF7OIO1iF7uBOJ9m2IbIEmeDmcKjCItV4uWR2ROh1l5bYwpY/s1600/SAM_3299.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmwuh5afscBNZVutSkGMiIexpbB0IZAEwhLeIFU31L-QPapkTAAmEaF4tLGbZtR-n4fugfTe8h_vc94VhPhU0qN44t8ABuF7OIO1iF7uBOJ9m2IbIEmeDmcKjCItV4uWR2ROh1l5bYwpY/s200/SAM_3299.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilja9HdvLYIUGlj-rJwT1MHkMxpsu1So_JomVvCvePSGd8uYLh16JuWEYZ4CGPF0yyRXt-NpFIvzVfjMx7bSSJ_fReKkQK6MfMgkNkUEcXiu56fDi43nUcaeM-r3v-6LAfacUdfhsxJXo/s1600/passion_An7HzoDCQAEWzuE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilja9HdvLYIUGlj-rJwT1MHkMxpsu1So_JomVvCvePSGd8uYLh16JuWEYZ4CGPF0yyRXt-NpFIvzVfjMx7bSSJ_fReKkQK6MfMgkNkUEcXiu56fDi43nUcaeM-r3v-6LAfacUdfhsxJXo/s200/passion_An7HzoDCQAEWzuE.jpg" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h3>
Yapa</h3>
<div>
Santa Clara esta en el medio del Silicon Valley, asique había cerca varios museos, incluyendo el de Intel (con su frase inspiradora: "Don't be encumbered by history. Go off and do something wonderful") y el Museo de la Historia de la Computadora (donde se exhibe el libro "The Mythical Man Month", referencia inicial de mi tesis y del póster):</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgiX-l83BtNfLCkSsqzHA3RW_sjB8WHVXKD8HtnIfoFQ_oSbBvy-gPLDQAhJlcu6418tsACtLpf349NicBTiIAT_nvDf2b_2q7lNRtb3zMuFjFCqkiG-qLwMnE0D7bMR3r12y0ElGk0GU/s1600/SAM_3334.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgiX-l83BtNfLCkSsqzHA3RW_sjB8WHVXKD8HtnIfoFQ_oSbBvy-gPLDQAhJlcu6418tsACtLpf349NicBTiIAT_nvDf2b_2q7lNRtb3zMuFjFCqkiG-qLwMnE0D7bMR3r12y0ElGk0GU/s200/SAM_3334.JPG" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLwxVrgG3OhyphenhyphendX5fEpw4a2L-VEva7x-mjuJChix6jeFS7tl0kQ0A8v6VvSHxW0UOAkAp5XPge26zBK6trxCwlN0T57VIv0DjbD6mxsQo7l0lb8EZ3G-nFhyphenhyphenUekUyEJKs5a0fZAx5fqz7I/s1600/SAM_3432.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLwxVrgG3OhyphenhyphendX5fEpw4a2L-VEva7x-mjuJChix6jeFS7tl0kQ0A8v6VvSHxW0UOAkAp5XPge26zBK6trxCwlN0T57VIv0DjbD6mxsQo7l0lb8EZ3G-nFhyphenhyphenUekUyEJKs5a0fZAx5fqz7I/s200/SAM_3432.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgNWd5thwG9e-HlVRNnghfuqKVY2HizW1l8QqZuYgHT9RLT7b6Kh8SRRVJrdmfrxXMqJfCFy07PcyoIxhOiY5vGiugPC64EGqi1g7smsbm-J_6UaPRI8ONDSEqAoPFj53npSBR-yGtcA/s1600/SAM_3437.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgNWd5thwG9e-HlVRNnghfuqKVY2HizW1l8QqZuYgHT9RLT7b6Kh8SRRVJrdmfrxXMqJfCFy07PcyoIxhOiY5vGiugPC64EGqi1g7smsbm-J_6UaPRI8ONDSEqAoPFj53npSBR-yGtcA/s200/SAM_3437.JPG" width="200" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2OF2pyqAtLqjtNyQEONRb7iWl2t5NyKTtPx9BENdDz9lhou2np6XFdTcOMuTKwyChr3xcMZ2FpCVHRnveMd0ovjCZcUvt89V-TmywgJx1IfCMoP2nHUZ0NoxEUo4LbxJt-50W0NDIJyo/s1600/SAM_3409.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2OF2pyqAtLqjtNyQEONRb7iWl2t5NyKTtPx9BENdDz9lhou2np6XFdTcOMuTKwyChr3xcMZ2FpCVHRnveMd0ovjCZcUvt89V-TmywgJx1IfCMoP2nHUZ0NoxEUo4LbxJt-50W0NDIJyo/s200/SAM_3409.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
También se puede observar el botón "Steal From Your Friends" de la comunidad <a href="http://en.wikipedia.org/wiki/DECUS">DECUS</a>, y un recordatorio sobre "Sharing Software and Advice", como muestras de cooperación de hace más de 50 años.</div>
<h2>
Post-Conferencia</h2>
</div>
</div>
<div>
Aprovechando que estabá alla, como mini vacaciones me tome unos días para recorrer San Francisco y los Parques Nacionales de la zona.</div>
<div>
<br /></div>
<div>
En el Sprint conocí a Ramiro da Luz, miembro de Python Brasil y organizador de varios eventos, asique pasamos el fin de semana conociendo California y entre las sequoias conversamos sobre Python, web2py, PyConAr, PythonBrasil, PyAr, APyB, el trabajo y la familia.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9hBegW7LtYaVKeVrArq317hrABfpwlJMjIkten3P8td73wEChdWrB5buzc90S8tHiTUOaoiR6Pz9Vk_bI1Jh4LdQUKmWRixyujUNlXrFxklk8cUVE-FvqvDUNoBkTlB5Pw_qOy4tHi-Y/s1600/SAM_3478.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9hBegW7LtYaVKeVrArq317hrABfpwlJMjIkten3P8td73wEChdWrB5buzc90S8tHiTUOaoiR6Pz9Vk_bI1Jh4LdQUKmWRixyujUNlXrFxklk8cUVE-FvqvDUNoBkTlB5Pw_qOy4tHi-Y/s200/SAM_3478.JPG" width="200" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid4_cvL5E-trRgm5wIW7yXEKNTz9zz7u8adggrIhkeKmAZxuzXOKpWVW-BUBnteVo1ZrNNAqt2WNZ5annqTvjmGlzPGHuiSJuK8tpg5SPz-9PmVs_HKS8AgbgSCRp8WRL62MY4GJ7cuo0/s1600/SAM_3472.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid4_cvL5E-trRgm5wIW7yXEKNTz9zz7u8adggrIhkeKmAZxuzXOKpWVW-BUBnteVo1ZrNNAqt2WNZ5annqTvjmGlzPGHuiSJuK8tpg5SPz-9PmVs_HKS8AgbgSCRp8WRL62MY4GJ7cuo0/s200/SAM_3472.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF7pctK4fckk-_erbS93QYq5PUg7SUCNPJW61bV44rfqXSRQXmUDsJtp0Ml2v3lfakQKeRz78JrrGJRL_7BzJBfs7Vtd0lKhaBIBxkjTYwAjhyAleVc5Kr-uXFR6r5xdRh5r7KoSgiy0c/s1600/SAM_3541.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF7pctK4fckk-_erbS93QYq5PUg7SUCNPJW61bV44rfqXSRQXmUDsJtp0Ml2v3lfakQKeRz78JrrGJRL_7BzJBfs7Vtd0lKhaBIBxkjTYwAjhyAleVc5Kr-uXFR6r5xdRh5r7KoSgiy0c/s200/SAM_3541.JPG" width="200" /></a> </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
"La fiesta termino ... y todo sigue igual", es hora de arrancar con la organización de <a href="http://ar.pycon.org/2012">PyCon Argentina 2012</a>, cualquier cosa nos vemos en la próxima <a href="http://python.org.ar/pyar/Eventos/Reuniones/2012/Reunion54">reunión</a>. Traje merchandizing para repartir!<br />
<br /></div>
<div>
YMMV</div>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-77520195208975643162012-02-03T10:03:00.001-03:002012-02-04T12:48:04.883-03:00A new web2py online python debugger<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;">I've finished a new online debugger, based on my previous work on qdb module (bdb/pdb enhancement):</span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222;">
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"><br /></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222;">
<a href="http://code.google.com/p/rad2py/wiki/QdbRemotePythonDebugger" style="color: #1155cc;" target="_blank"><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;">http://code.google.com/p/<wbr></wbr>rad2py/wiki/<wbr></wbr>QdbRemotePythonDebugger</span></a></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222;">
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"><br /></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"><span class="Apple-style-span" style="color: #222222;">In contrast with <a href="http://docs.python.org/library/pdb.html">pdb</a>, this debugger is based on a client/server model, so it should be more stable and extensible than my previous approach (a piped command line loop, see current </span><a href="http://code.google.com/p/web2py/source/browse/gluon/debug.py?r=fab104bec8982d095375f9d6430b72f0ef87c6e8" style="color: #222222;">debug.py</a><span class="Apple-style-span" style="color: #222222;"> module, a naive attempt to use pdb in a web environment, it is mostly undocumented as it requires some advanced python skills to use pdb commands without blocking the whole web2py server).</span></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222;">
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;">In fact, qdb is based on the python <a href="http://docs.python.org/library/bdb.html">bdb</a> debugger framework (borrowing most commands from pdb), and it comes with a CLI, a separate <a href="http://code.google.com/p/rad2py/wiki/ScreenShots">GUI</a> frontend (using wxpython), and for web2py, this totally web based interface.</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222;">
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;">Although this blog post is about <b>web2py</b>, qdb can be used to make debuggers for<b> other frameworks</b> too, you can use <a href="http://code.google.com/r/reingart-web2py/source/browse/gluon/debug.py?r=7c11a8c4382181fec153491741bf1b3b2b913ddf#99">WebDebugger</a> as a base to make <a href="http://code.google.com/r/reingart-web2py/source/browse/applications/admin/controllers/debug.py?r=e775bdfbc2169aba18e0744ba2ff6a31b23ca249#40">controller</a>/<a href="http://code.google.com/r/reingart-web2py/source/browse/applications/admin/views/debug/interact.html?r=7c11a8c4382181fec153491741bf1b3b2b913ddf">views</a> with your favourite web stack.</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br />
Currently, this web2py debug implementation uses threads (debug and web ui, automatically managed by default web2py development server) and queues to communicate between them, but this can be extended to use <a href="http://docs.python.org/library/multiprocessing.html">multiprocessing</a> <a href="http://docs.python.org/library/multiprocessing.html#multiprocessing-listeners-clients">client/listeners</a> or anything with that interface (send, recv and poll, using socket or pipes).<br />
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b><u>Download:</u></b></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
The web2py package with integrated debugger can be downloaded from my site:<br />
<br />
<a href="http://www.sistemasagiles.com.ar/soft/web2py_src_debug.zip">http://www.sistemasagiles.com.ar/soft/web2py_src_debug.zip</a><br />
<br />
The full source code and revisions are in my web2py repo clone in googlecode:</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://code.google.com/r/reingart-web2py/" style="color: #1155cc;" target="_blank">http://code.google.com/r/<wbr></wbr>reingart-web2py/</a></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
You can download it with mercurial: </div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<div style="display: table;">
<div style="background-color: #e5ecf9; background-image: initial; margin-bottom: 0.6em;">
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 4px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 4px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 2px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 13px; padding-right: 13px; padding-top: 0px;">
<tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em;">hg clone <a href="https://code.google.com/r/reingart-web2py/" style="color: #1155cc;" target="_blank">https://code.google.com/r/<wbr></wbr>reingart-web2py/</a></tt> </div>
</div>
</div>
</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
Also, if you have the latest trunk, you can patch it with:</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<div style="display: table;">
<div style="background-color: #e5ecf9; background-image: initial; margin-bottom: 0.6em;">
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 4px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 4px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 2px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="border-left-color: rgb(255, 255, 255); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(255, 255, 255); border-right-style: solid; border-right-width: 1px; font-size: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
</div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 13px; padding-right: 13px; padding-top: 0px;">
<tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em;">hg pull <a href="https://code.google.com/r/reingart-web2py/" style="color: #1155cc;" target="_blank">https://code.google.com/r/<wbr></wbr>reingart-web2py/</a></tt> </div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 13px; padding-right: 13px; padding-top: 0px;">
hg update</div>
</div>
</div>
</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
(the changes are in the default branch so will not create nasty repository effects)</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b><u>Brief Changelog:</u></b></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
web2py is great because it is small and concise, so most changes are less than 100 lines (and some were trivial):<br />
<ul>
<li style="margin-left: 15px;">added gluon.contrib.qdb , the debug backend and basic frontend</li>
<li style="margin-left: 15px;">updated gluon.debug to create the qdb client/server debug queues and the web frontend</li>
<li style="margin-left: 15px;">updated applications/admin/controller/<wbr></wbr>debug with interact and breakpoints controllers</li>
<li style="margin-left: 15px;">added applications/admin/views/<wbr></wbr>debug/interact.html and breakpoints.html</li>
<li style="margin-left: 15px;">updated applications/admin/views/<wbr></wbr>default/edit.html to add toggle breakpoint button</li>
<li style="margin-left: 15px;">updated applications/admin/<wbr></wbr>models/menu.py to add top-level debug menu</li>
<li style="margin-left: 15px;">updated applications/admin/js/<wbr></wbr>static/ajax_editor.js (toggle breakpoints) and style.css</li>
<li style="margin-left: 15px;">updated gluon.html.CODE and gluon.highligh to show the context relevant lines </li>
</ul>
</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
The full change log is available in the repository <a href="http://code.google.com/r/reingart-web2py/source/list">here</a>. It took me less than 8 hours to add a debugger to web2py, very nice!</div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b><u>Usage:</u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif;">
<b style="font-size: 13px;">Basic interaction</b><span class="Apple-style-span" style="font-size: 13px;"> (step, next, continue, return, stop, etc.), with the highlighted code, locals/globals and a </span><b style="font-size: 13px;">interactive console</b><span class="Apple-style-span" style="font-size: 13px;"> to execute python statements in the debug environment.</span><br />
<div style="text-align: left;">
<span class="Apple-style-span" style="font-size: 13px;">Access it from the added </span><i style="font-size: 13px;">"Debug" main menu</i><span class="Apple-style-span" style="font-size: 13px;"> button (or go to <a href="http://localhost:8000/admin/debug/interact">http://localhost:8000/admin/debug/interact</a>):</span></div>
<div style="text-align: center;">
<span class="Apple-style-span" style="font-size: 13px;"><br /></span></div>
<div style="text-align: center;">
<a href="https://p.twimg.com/AkuQ6lQCQAAv_Rr.png:large" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="252" src="https://p.twimg.com/AkuQ6lQCQAAv_Rr.png:large" width="320" /></a></div>
</div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<div style="text-align: center;">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"><br /></span></div>
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"></span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">To evaluate an expression, enter it in the second textarea, press enter and it will be executed in the debugger.</span></span></div>
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
</span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">The result, if any, will be shown in the upper textarea. You can execute any valid python command, including python assignment statements.</span></span></div>
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
</span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">To execute the current statement, press <i>step</i>. If you do not want to enter to functions, press <i>next</i>. To run the program until it finish or a breakpoint is reached, press <i>continue</i>. To cancel execution, press <i>stop</i>.</span></span></div>
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
</span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span></span></div>
<span style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Breakpoints</b></span><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"> (including temporary and conditional ones, with hit count) can be accessed from the <i>Breakpoints</i> button at the main debug page (or go to <a href="http://localhost:8000/admin/debug/breakpoints">http://localhost:8000/admin/debug/breakpoints</a>):</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: x-small;"><br /></span><br />
<div style="text-align: center;">
<a href="https://p.twimg.com/AkuTIJ6CEAAuGHo.png:large" imageanchor="1" style="color: #222222; margin-left: 1em; margin-right: 1em;"><img border="0" height="145" src="https://p.twimg.com/AkuTIJ6CEAAuGHo.png:large" width="320" /></a></div>
</div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<div style="text-align: center;">
<br /></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">Temporary breakpoints are deleted automatically after the first hit, and conditional breakpoints only matches if the associated python expression evaluates to True. </span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">Also, the breakpoint page can show the context source code according to the line number specified.</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">The breakpoints can also be added and removed from the</span><b style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"> edit window</b><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"> (new </span><i style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">Toggle Button</i><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"> near back/docs, for example, in <a href="http://localhost:8000/admin/default/edit/welcome/controllers/default.py">http://localhost:8000/admin/default/edit/welcome/controllers/default.py</a>):</span><br />
<div style="text-align: center;">
<br /></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"></span><br />
<div style="text-align: center;">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"> <a href="https://p.twimg.com/AkuYv8xCEAEX4ah.png:large" imageanchor="1" style="color: #222222; font-family: 'Times New Roman'; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="223" src="https://p.twimg.com/AkuYv8xCEAEX4ah.png:large" width="320" /></a></span></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;">
</span><br />
<div style="text-align: center;">
<br /></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">It also can </span><b style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">debug exceptions</b><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"> (handled or unhandled, note the exception info and traceback). After you inspect the local or global variables, press <i>continue</i> so normal exception handling will be done:</span><br />
<div style="text-align: center;">
<br /></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"></span><br />
<div style="text-align: center;">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"> <a href="https://p.twimg.com/AkuVghZCQAA_ctT.png:large" imageanchor="1" style="color: #222222; font-family: 'Times New Roman'; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="192" src="https://p.twimg.com/AkuVghZCQAA_ctT.png:large" width="320" /></a></span></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;">
</span><br />
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<br /></div>
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">With this changes, web2py can offer a complete online and ubiquitous <b>Integrated Development Environment</b>, so you don't need to learn any external tool to create web sites!</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">This debugger was tested this on Ubuntu and Windows XP, but it should work in mac and other linux flavours too, as it is pure-python and no third-party dependencies are required.</span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span></div>
<div style="background-color: rgba(255, 255, 255, 0.917969);">
<b style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">Future enhancements </b><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">(supported by the backend, but not implemented already in the web frontend):</span><br />
<ul style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<li style="margin-left: 15px;">Jump to line and Run to line</li>
<li style="margin-left: 15px;">Moving Up/down through the stack trace</li>
<li style="margin-left: 15px;">Watch variable list (now they can be manually inspected with the interactive console)</li>
</ul>
<b style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">Current drawbacks and limitations:</b><br />
<ul style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<li style="margin-left: 15px;"><strike><span style="font-family: 'courier new', monospace;">from gluon.debug import dbg; dbg.do_debug()</span> or <span style="font-family: 'courier new', monospace;">dbg.set_trace()</span> should be called from the model/controller to run under debug control (if not, normal web2py dispatch occurs, no breakpoint is honoured).</strike> <b>UPDATE</b>: the debugger is automatically started if debug interaction page is opened or breakpoints are set (see wsgibase web2py entry point to run controllers)</li>
<li style="margin-left: 15px;">The debugger is threaded, so beware of apache prefork and similar (the backend supports remote debugging, but it is more trickier to set the breakpoints). This also applies to the current shell and similar tools like <a href="http://pythonpaste.org/modules/exceptions.html">paste</a>. See <a href="http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Browser_Based_Debugger">modwsgi Debugging Techniques (Browser Based Debugger)</a>. Anyway, I'm working in a full remote multiprocess debugger (that is supported by qdb CLI and GUI right now)</li>
<li style="margin-left: 15px;">Secondary effects can appear if debug more than a function at a time (it will not die, but it is more difficult to follow)</li>
<li style="margin-left: 15px;">I didn't find a way to add markers to editarea yet (ie. a red circle near the line number to indicate a breakpoint)</li>
<li style="margin-left: 15px;">Debugging cannot be limited per application (FILTER_APPS and multi user mode cannot be enforced)</li>
<li style="margin-left: 15px;">Compiled apps cannot be debugged as easily as non-compiled ones (breakpoints must be set manually with set_trace)</li>
<li style="margin-left: 15px;">Some style/layout details are missing</li>
</ul>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
So, if you want to try it, just set breakpoints and execute your controller to start debugging and enjoy ;-)</div>
</div>
<div>
<br /></div>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-69727593043449910332012-01-04T03:28:00.001-03:002012-01-04T04:12:57.187-03:00pg8000 1.09 maintenance version (fork) released<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">pg8000 is a DB-API 2.0 compatible Pure-Python interface to the </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">PostgreSQL database engine.</span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">It is one of many PostgreSQL interfaces for the Python programming language. </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">pg8000 is somewhat distinctive in that it is written entirely in </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Python and does not rely on any external libraries (such as a compiled </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">python module, or PostgreSQL’s libpq library).</span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">This pure-python connector approach allows to run it where C compiled </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">libraries cannot be installed, it allows deeper access to PostgreSQL </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">protocol internals and it enables easier flexibility and extensibility </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">for Python developers (like support for parameterized prepared </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">statements using qmark, numeric, named, format or pyformat DBAPI </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">paramstyle).</span><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">The highlights of this 1.09 maintenance release are: two-phase commit </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">support, autocommit feature, server_version property and bug fixes for </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">almost all reported issues since 1.08 (2010-06-08) </span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">For details of the changes in this release, please see the notes at:</span><br />
<br />
<a href="http://html.pg8000.googlecode.com/hg/changelog.html" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://html.pg8000.googlecode.<wbr></wbr>com/hg/changelog.html</a><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">pg8000 maintenance version may be downloaded from:</span><br />
<br />
<a href="http://code.google.com/p/pg8000/downloads/list" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://code.google.com/p/<wbr></wbr>pg8000/downloads/list</a><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">For more information see:</span><br />
<br />
<a href="http://code.google.com/p/pg8000/" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://code.google.com/p/<wbr></wbr>pg8000/</a><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">For the original version see:</span><br />
<br />
<a href="https://github.com/mfenniak/pg8000" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">https://github.com/mfenniak/<wbr></wbr>pg8000</a><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Acknowledgements to Mathieu Fenniak for the original version and </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">thanks to the contributors that reported and/or sent patches applied </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">for this release.</span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">PS: I've been working with this library since the last year, it helped me where psycopg2 couldn't be installed (dependency compilation issues in older systems) or when I needed more flexibility (i.e. paramstyle). As it seems that the original author don't maintain it anymore, I've decided to make a fork in googlecode, with the hope it could be useful to other people too.</span>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-28752225166841606012012-01-04T03:24:00.000-03:002012-01-04T04:12:11.573-03:00pg8000 1.09 versión de mantenimiento (fork) liberado (conector python para postgresql)<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">pg8000 es una interface DB-API 2.0 compatible puramente hecha en </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Python para el motor de base de datos PostgreSQL.</span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Al no depender de bibliotecas externas (libpq) o modulos compilados, </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">puede ser instalada practicamente en todos los entornos, y habilita un </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">acceso más profundo al protocolo de PostgreSQL, permite flexibilidad y </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">extensibilidad más simple y para los desarrolladores Python como ser </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">el soporte para sentencias preparadas parametrizadas usando qmark, </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">numeric, named, format o pyformat según el paramstyle de la DBAPI).</span><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Las características principales de esta versión 1.09 de mantenimiento </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">son: commit en dos fases, soporte para autocommit, propiedad </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">server_version property y corrección de errores para casi todas las </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">incidencias reportadas desde la versión 1.08 (2010-06-08)</span><br />
<br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Para los detalles de los cambios en esta liberación, ver las notas en:</span><br />
<a href="http://html.pg8000.googlecode.com/hg/changelog.html" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://html.pg8000.googlecode.<wbr></wbr>com/hg/changelog.html</a><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">La versión de mantenimiento de pg8000 puede ser descargada de:</span><br />
<a href="http://code.google.com/p/pg8000/downloads/list" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://code.google.com/p/<wbr></wbr>pg8000/downloads/list</a><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Para más información ver:</span><br />
<a href="http://code.google.com/p/pg8000/" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">http://code.google.com/p/<wbr></wbr>pg8000/</a><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Para la versión original ver:</span><br />
<a href="https://github.com/mfenniak/pg8000" style="background-color: rgba(255, 255, 255, 0.917969); color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank">https://github.com/mfenniak/<wbr></wbr>pg8000</a><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">Mis agradecimientos a Mathieu Fenniak por la versión original y a los </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">contribuidores que han reportado y/o enviado sus correcciones que se </span><span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;">han aplicado en esta versión.</span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif; font-size: 13px;"><br /></span><br />
<span class="Apple-style-span" style="background-color: rgba(255, 255, 255, 0.917969); color: #222222; font-family: arial, sans-serif;"><span class="Apple-style-span" style="font-size: x-small;">PD: Vengo trabajando con esta bibilioteca hace más de un año, me ayudo donde psycopg2 no pudo ser instalado (por no poder compilarlo por cuestiones de dependencias viejas) y cuando necesité más flexibilidad (el tema de paramstyle). Como se ve que el autor original no la mantiene más, decidí hacer el fork en googlecode, con la esperanza de que les sea útil a otros.</span></span>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-15417044998809523542011-11-26T12:16:00.001-03:002011-11-26T16:26:52.362-03:00Trazabilidad de Medicamentos, Operaciones Cambiarias y Remito ElectrónicoEn el proyecto PyAfipWs se ha agregado soporte para varios webservices:<br />
<br />
<ul>
<li>Trazabilidad de Medicamentos (ANMAT): server: Jetty(6.1.16) con Oracle como b.d.: <a href="http://www.sistemasagiles.com.ar/trac/wiki/TrazabilidadMedicamentos">http://www.sistemasagiles.com.ar/trac/wiki/TrazabilidadMedicamentos</a></li>
<li>WSCOC - Operaciones Cambiarias (AFIP): x-powered-by: Servlet/3.0; JBossAS-6 server: Apache/2.0.52 (Red Hat) <a href="http://www.sistemasagiles.com.ar/trac/wiki/ConsultaOperacionesCambiarias">http://www.sistemasagiles.com.ar/trac/wiki/ConsultaOperacionesCambiarias</a></li>
<li>COT - Remito Electrónico (ARBA): server: IBM_HTTP_Server <a href="http://www.sistemasagiles.com.ar/trac/wiki/RemitoElectronicoCotArba">http://www.sistemasagiles.com.ar/trac/wiki/RemitoElectronicoCotArba</a></li>
</ul>
<br />
Con estos servicios web el proyecto PyAfipWs se ha expandido más allá de los webservices de AFIP, incluyendo otras entidades y servicios, completando e integrando las funcionalidades más usadas por sistemas de gestión en Argentina, no solo para python sino que con la interfaz COM se pueden usar desde otros lenguajes en Windows (Visual Basic, Visual Fox Pro, Delphi, ABAP - SAP, etc.) e incluso con interfaces de texto o por linea de comando en otras plataformas (DOS, UNIX).<br />
Próximamente se agregará soporte para archivos CSV, DBF (dBase, FoxPro, Clipper, etc.), extendiendo y facilitando aún más el acceso a estos servicios web desde lenguajes de programación legados.<br />
<br />
Respecto a la librería PySimpleSOAP, se realizaron las siguientes mejoras para soportar los nuevos webservices:<br />
<br />
<ul>
<li>Mejoras en analisis de WSDL (separando nombres de elementos y tipos complejos, reconocimiento de las diferentes partes de los mensajes, tag vacios)</li>
<li>Soporte de SOAP Header (encabezados para autenticación)</li>
<li>Soporte básico para WSSE (WebService-Security Extensions)</li>
<li>Ajustes por servidor, para formar el requerimiento según cada plataforma evitando incompatibilidades (por ej., no enviar tag vacio a JBoss-AS pero si )</li>
</ul>
Las modificaciones experimentales están en una rama propia del repositorio, ya que algunos cambios pueden introducir incompatibilidades hacia atrás o todavía no son del todo definitivos. Más información en:<br />
<div>
<br />
<a href="http://code.google.com/p/pysimplesoap/">http://code.google.com/p/pysimplesoap/</a></div>
<div>
<br /></div>
<div>
Gracias a tener un desarrollo propio para la comunicación SOAP se pudieron solucionar estos y otros inconvenientes, incluso cuando otras soluciones para webservices fallaban o no se ajustaban a los requerimientos (que por cierto, ningun servicio web ha sido igual a otro, cada nuevo webservice introduce ligeras incompatibilidades, interpretaciones diferentes del standard SOAP o nuevas características).</div>
<div>
<br /></div>
<div>
El servicio COT no es un webservice tradicional ya que no utiliza XML para el requerimiento ni SOAP para la respuesta, teniendo su propio esquema, por lo que solo se uso SimpleXMLElement de PySimpleSOAP (manejo de xml simple estilo objetos), y se adapto un WebClient para codificar los métodos POST. </div>
<div>
Gracias a Matias Gieco por aportar los ejemplos iniciales que posibilitaron desarrollar el componente.</div>
<div>
<br /></div>
<div>
Más información sobre el proyecto en:</div>
<div>
<br /></div>
<div>
<a href="http://code.google.com/p/pyafipws/">http://code.google.com/p/pyafipws/</a></div>
<div>
<br /></div>
<div>
Anuncios completos:</div>
<div>
<ul>
<li><a href="https://sites.google.com/site/pyafipws/anuncios/lanzamientotrazamed101atrazabilidadmedicamentosanmat">Trazabilidad de Medicamentos</a></li>
<li><a href="http://www.pyafipws.com.ar/anuncios/lanzamientowscocv11-consultadeoperacionescambiarias-rg312011">WSCOC: Consulta de Operaciones Cambiarias</a></li>
<li><a href="http://www.pyafipws.com.ar/anuncios/lanzamientoremitoelectronicolibre-codigodeoperacionesdetransladocotarba">Remito Electrónico COT</a></li>
</ul>
</div>
<div>
<br /></div>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-29338114196454682482011-06-11T16:31:00.001-03:002011-06-11T16:40:03.329-03:00Invitación al Público "PyDay 2011 Gonzalez Catan"<span class="Apple-style-span" style="font-family: Helvetica, sans-serif; font-size: 13px;"></span><br />
<div style="color: #787878; line-height: 23px; margin-top: 0px;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5iIoUQEF9Vbniz3aqr_Sdmh-CL8ZyKMqfiz7b9Le3CqSJeozWueZ3tbb9vv7otV_IjHlFJFKZMyNXX4tEzRzZbWOnhGSXcrCCAGCg8tr52SJ-Pzt_fFZg0QM70CYf7s2o-8UnpuYplCU/s1600/pyday_catan2011_viral_web.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5iIoUQEF9Vbniz3aqr_Sdmh-CL8ZyKMqfiz7b9Le3CqSJeozWueZ3tbb9vv7otV_IjHlFJFKZMyNXX4tEzRzZbWOnhGSXcrCCAGCg8tr52SJ-Pzt_fFZg0QM70CYf7s2o-8UnpuYplCU/s400/pyday_catan2011_viral_web.png" width="282" /></a><b><a href="http://www.python.org.ar/">PyAr</a></b>, el grupo de usuarios de Python Argentina, está orgulloso de anunciar que se encuentra abierta la inscripción para el evento <b><a href="http://www.pyday.com.ar/catan2011">PyDay Gonzalez Catán 2011: <i>"Jornada de Programación en Python"</i></a></b> a realizarse el sábado <b>16 de Julio de 2011</b> de 9 a 19hs en el <b><a href="http://www.institutopascal.edu.ar/">Instituto Superior Tecnológico Blaise Pascal</a></b> que contará con Charlas Introductorias y Talleres Prácticos sobre este incipiente lenguaje de programación, reconocido en el ambiente del Software Libre y visto como una creciente alternativa a <b>Java</b>, <b>.NET</b> y <b>PHP</b> por su simplicidad, versatilidad y facilidad de uso, utilizado actualmente por miles de empresas, incluyendo a Google, NASA y YouTube.</div><div style="margin-top: 0px;"><div style="color: #787878; line-height: 23px;"><br />
</div><span class="Apple-style-span" style="color: #787878;"><span class="Apple-style-span" style="line-height: 23px;"><a href="http://www.pyday.com.ar/catan2011">http://www.pyday.com.ar/catan2011</a></span></span><br />
<div style="color: #787878; line-height: 23px;"><br />
</div><div style="color: #787878; line-height: 23px;">El evento, de fácil acceso ubicado en el conurbano bonaerense (aprox. 1 hora de Capital), contará con la presencia de <b>Docentes</b>, <b>Profesionales</b>, <b>Alumnos</b> y <b>Entusiastas</b> de diferentes puntos del Gran Buenos Aires y de varias provincias del Interior del País, representantes de diversas comunidades de Software Libre (<b>Python</b>, <b>Ubuntu</b>, <b>Mozilla</b> y<b>PostgreSQL</b>, entre otras).</div><div style="color: #787878; line-height: 23px;"><br />
</div></div><div style="color: #787878; line-height: 23px; margin-top: 0px;">El lema de la jornada es <b><i>"Python en el mundo real"</i></b> mostrando casos concretos de aplicación de este lenguaje con ejemplos simples al alcance de todos que demuestran su alta potencialidad e impacto actual.</div><div style="color: #787878; line-height: 23px; margin-top: 0px;">Los temas principales de la jornada serán: <b>Software Libre</b>, <b>Educación</b> (nivel secundario y terciario), <b>Desarrollo Web</b>(django, web2py), <b>Aplicaciones Visuales</b> (wx, gtk, qt), <b>Presentación Proyectos</b> (factura electrónica, voto electrónico, trabajos finales y tesis de graduados), <b>Videojuegos</b>, <b>Cooperativas</b>, Economía Social y Oportunidades Laborales.<br />
<br />
</div><div style="margin-top: 0px;"><div style="color: #787878; line-height: 23px;">Las distintas actividades se detallán en el sitio:</div><span class="Apple-style-span" style="color: #787878;"><span class="Apple-style-span" style="line-height: 23px;"><a href="http://www.pyday.com.ar/catan2011/conference/schedule">http://www.pyday.com.ar/catan2011/conference/schedule</a></span></span></div><ul style="color: #787878; display: block; line-height: 23px; list-style-position: inside; list-style-type: square; margin-top: 0px;"></ul><div style="color: #787878; line-height: 23px; margin-top: 0px;">La jornada se enmarca en el <a href="http://docs.google.com/View?id=dd9bm82g_428g8zvfvdx"><b><i>Proyecto Curricular Institucional</i></b> de la <b><i>Carrera "Analista de Sistemas"</i></b> orientado al <b><i>Software Libre</i></b></a> y se contempla reservar aulas para espacios abiertos, temas avanzados, posters, presentación de proyectos, stands de comunidades, reuniones, mini-sprints de desarrollo, charlas relámpagos espontáneas no programadas y consultas del público en general.</div><div style="color: #787878; line-height: 23px; margin-top: 0px;">Son bienvenidos los colaboradores, empresas, entidades y comunidades interesadas en participar y auspiciar la jornada.</div><div style="color: #787878; line-height: 23px; margin-top: 0px;"><br />
El evento es de entrada libre y gratuita previa inscripción web (cupos limitados):<br />
<br />
<a href="http://www.pyday.com.ar/catan2011/user/register" style="color: #005b9c; text-decoration: none;">http://www.pyday.com.ar/catan2011/user/register</a><br />
<br />
</div><div style="color: #787878; line-height: 23px; margin-top: 0px;"><b>Se entregarán Certificados de Asistencia emitidos por el Instituto</b> (sin costo)</div><div style="color: #787878; line-height: 23px; margin-top: 0px;"><a href="http://www.institutopascal.edu.ar/" style="color: #005b9c; text-decoration: none;">http://www.institutopascal.edu.ar/</a></div>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-86395053440155947332011-06-10T02:46:00.002-03:002011-06-10T02:52:00.921-03:00Avances PyRece: WSFEv1, varias mejoras (XML/TXT/DBF/JSON) y rediseñoContinuando con el constante trabajo y avance del proyecto de factura electrónica y software libre, ya esta publicado la nueva versión del aplicativo libre y gratuito para gestionar facturas electrónicas utilizando los webservices de AFIP:<br />
<br />
<a href="http://sites.google.com/site/pyafipws/anuncios/actualizacionpyrece123e">http://sites.google.com/site/pyafipws/anuncios/actualizacionpyrece123e</a><br />
<br />
Esta actualización contempla soporte para <a href="http://www.sistemasagiles.com.ar/trac/wiki/ProyectoWSFEv1">WSFEv1</a> (el servicio web "versión 1" de mercado interno que entra en vigencia el 1° de Julio y afecta principalmente a importadores, monotributistas, turismo, etc.)<br />
<br />
Además, se realizó un rediseño interno separandolo en módulos reutilizables en dos áreas: Formatos de archivos de intercambio y generación de PDF:<br />
<br />
<ul><li>formato_csv.py: para planillas de cálculo </li>
<li>formato_txt.py: para archivos de texto de campos con ancho fijo (por ej. Cobol) similar a SIAP RECE </li>
<li>formato_xml.py: para archivos similares al Facturador Plus (utilizando SimpleXmlElement para serialización automática)</li>
<li>formato_dbf.py: para tablas compatibles con dBase, Clipper y FoxPro</li>
<li>formato_json.py: que exporta/importa los diccionarios de Python con simplejson</li>
<li>pyfepdf.py: modulo ya existente para generar los PDF (reutilizado) aprovechando el <a href="http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs#DiseñadorVisualPyFEPDF">diseñador visual</a></li>
</ul><br />
Esto fue posible luego de unificar la representación interna de las facturas electrónicas, ajustando los campos para diferentes formatos a una estructura en común compartida por todos los módulos.<br />
<br />
A su vez, se resolvieron algunos bugs por el tema de la codificación de DBF que serán enviados al desarrollador de dicha librería a la brevedad.<br />
<br />
Todos estos cambios posibilitan en el futuro agregar soporte para otros formatos y webservices (WSFEX Exportación -RG2758-, WSMTX -RG2904, Bonos fiscales, etc.), que será el próximo paso a implementar.<br />
<br />
Si bien se mejoro un poco el aspecto de la interfaz, estamos trabajando para la modernización de la interfaz, implicando una separación en capas para la integración de las tres soluciones:<br />
<br />
<ul><li><a href="http://www.sistemasagiles.com.ar/trac/wiki/HerramientaFacturaElectronica">Fe.py</a>: aplicativo por consola c/ base de datos</li>
<li><a href="http://www.sistemasagiles.com.ar/trac/wiki/PyRece">PyRece</a>: aplicativo visual</li>
<li><a href="http://www.sistemasagiles.com.ar/trac/wiki/FacturaLibre">FacturaLibre</a>: aplicación web</li>
</ul><br />
Por todos estos motivos, se buscan testers, empaquetadores y colaboradores interesados en estos temas, proximamente nos vamos a estar reuniendo en el PyDay de Catán para tratar el estado del proyecto y los pasos a seguir, los esperamos:<br />
<br />
<a href="http://www.pyday.com.ar/catan2011">http://www.pyday.com.ar/catan2011</a>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-75686182351055721002011-02-15T21:34:00.002-03:002011-02-17T10:18:35.992-03:00Novedades PyAfipWs -Factura Electrónica- (instalador nsis, pythoncom, soap)Recientemente liberé una nueva actualización de la biblioteca PyAfipWs, con varias mejoras:<br />
<a href="http://www.pyafipws.com.ar/anuncios/nuevoinstalador106ayejemplosparawsfev1">http://www.pyafipws.com.ar/anuncios/nuevoinstalador106ayejemplosparawsfev1</a><br />
A continuación se detallan los temas técnicos:<br />
<br />
<b><u>Extension a py2exe para generar un instalador NSIS:</u></b><br />
<br />
Inicialmente usaba un .BAT para generar el instalador (7-zip autoextraible), para simplificar y mejorar el proceso (detectar archivos en uso, desinstalar copia previa, mostrar licencia, elegir directorio, internacionalización), desarrollé nsis.py, una extensión para py2exe, que agregando dos lineas a un setup.py crea un paquete unico con todo incluido, usando <span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;">Nullsoft Scriptable Install System</span>:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">from nsis import build_installer</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">setup( </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">...</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">cmdclass = {"py2exe": build_installer}</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">)</span><br />
<br />
<i>Más info en:</i><br />
<a href="http://code.google.com/p/pyafipws/source/browse/setup_wsfev1.py">http://code.google.com/p/pyafipws/source/browse/setup_wsfev1.py</a><br />
<a href="http://code.google.com/p/pyafipws/source/browse/nsis.py">http://code.google.com/p/pyafipws/source/browse/nsis.py</a><br />
<br />
El código está adaptado de una ejemplo de py2exe para Inno Setup.<span class="Apple-style-span" style="font-family: Arial, 'Lucida Grande', sans-serif;"> </span><br />
<br />
<b><u>PythonCOM y la ruta de instalación</u></b><br />
<br />
Para poder acceder a archivos locales en un ambiente empaquetado con py2exe, en general es trivial salvo que el script sea una DLL, ya que el interprete Python se "embebe" dentro del programa anfitrión, y los métodos estándard para determinar donde está ubicado el script fallan.<br />
La solución mas simple fue usar:<br />
<br />
<ul><li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">sys.executable</span> para cuando el script es un .EXE</li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">win32api.GetModuleFileName(sys.frozendllhandle)</span> para cuando el script es un .DLL</li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">__file__</span> cuando se ejecuta directamente el .PY</li>
</ul><br />
<i>Más info en:</i><br />
<a href="http://code.google.com/p/pyafipws/source/browse/wsfev1.py#129">http://code.google.com/p/pyafipws/source/browse/wsfev1.py#129</a><br />
<br />
<b><u>Type Library y PythonCOM:</u></b><br />
<br />
Algunos lenguajes de tipado estático (C#, versiones de Cobol) necesitan para las interfaces COM una librería de tipos (mejor conocidas como .TLB) para referenciar y determinar los métodos, parámetros y valores devueltos, ya que Python es un lenguaje dinámico que no ofrece dicha información.<br />
Para mi sorpresa, las implementaciones en lenguajes de tipado estático tampoco parecen ofrecerla, y es necesario en todos los casos usar un compilador de un lenguaje especial de MS (IDL):<br />
<a href="http://code.google.com/p/pyafipws/source/browse/pyafipws.idl">http://code.google.com/p/pyafipws/source/browse/pyafipws.idl</a><br />
Para que lo reconozca hay que agregar al objeto python los atributos <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_typelib_guid_, _typelib_version_, _com_interfaces_ </span><br />
<a href="http://code.google.com/p/pyafipws/source/browse/pyafipws.py#57">http://code.google.com/p/pyafipws/source/browse/pyafipws.py#57</a><br />
<br />
Igualmente todo este tema esta deshabilitado ya que el tipado estático ocasiona más problemas que los que resuelve (sobre todo con el registro, DLL hell, falta de flexibilidad, etc.), y hay métodos alternativos más simples para acceder a PythonCOM desde C# y lenguajes similares.<br />
<br />
Mi agradecimiento a Mark Hammond (el creador de python-win32) por señalar al ejemplo "pippo" en el directorio win32com\test, como muestra de una asociación entre un objeto Python COM y su TLB.<br />
<br />
<b><u>Mejorando la performance SOAP WSDL:</u></b><br />
<br />
El protocolo SOAP es complejo, y analizar el XML de la descripción de un webservice (WSDL) para poder comunicarse con el, es un proceso un poco costoso.<br />
Gracias a Python la solución se simplificó bastante, ya que permite guardar y recuperar las estructuras de datos ya procesadas, sin necesidad de artefactos o código generado como en otros lenguajes (.NET, Java, etc.):<br />
<a href="http://code.google.com/p/pysimplesoap/source/browse/pysimplesoap/client.py#244">http://code.google.com/p/pysimplesoap/source/browse/pysimplesoap/client.py#244</a><br />
<br />
Con el módulo cPickle de la librería estándar (implementado en C) se mejoro el tiempo para cargar un WSDL de 0.4 segundos a aproximadamente a 0.001 segundos, ~ 400 veces más rápido. Con pickle nativo (implementado en python) la mejora era un poco menos significativa (~ 40 veces más rápido).<br />
Los test fueron realizados en una netbook para un webservice medianamente complejo, YMMVMariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-76855883064510080882010-09-03T00:25:00.000-03:002010-09-03T12:04:54.865-03:00Se viene el PyDay 2010 Buenos AiresEste sábado 4 de septiembre es la jornada sobre el lenguaje de programación Python "PyDay Buenos Aires 2010" organizado por <a href="http://www.python.org.ar">PyAr</a>:<br />
<br />
<a href="http://www.pyday.com.ar/">http://www.pyday.com.ar/</a><br />
<br />
Entre varias charlas agendadas estaré presentando <a href="http://www.web2py.com.ar">web2py</a> (una herramienta para desarrollo web simple y poderosa) y seguramente en los espacios abiertos y/o charlas relámpago hablaremos sobre los proyectos <a href="http://www.pyafipws.com.ar">PyAfipWs</a> (factura electrónica libre), <a href="http://pysimplesoap.googlecode.com/">PySimpleSOAP</a> (webservices), <a href="http://pyfpdf.googlecode.com/">PyFPDF</a>, <a href="http://code.google.com/p/gestionlibre/">Gestión Libre</a>, y demás temas generados desde nuestro emprendimiento <a href="http://www.sistemasagiles.com.ar">"Sistemas Ágiles"</a>, sin olvidarnos de <a href="http://www.arpug.com.ar">PostgreSQL</a> y su nueva versión 9.0!Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-51046564839085939672010-08-06T17:17:00.000-03:002010-08-06T17:17:42.151-03:00PySimpleSOAP e integración con web2py<a href="http://code.google.com/p/pysimplesoap">PySimpleSoap</a> es una librería que desarrollamos inicialmente para comunicarse con los servicios web SOAP de Factura Electrónica de AFIP, a la que luego hice varias mejoras generales (desprendiéndola del proyecto original <a href="http://www.pyafipws.com.ar/">PyAfipWs</a>), incluyendo:<div><ul><li>Un despachador para construir servidores (similar a xmlrpclib)</li>
<li>Soporte para WSDL: instrospección y generación dinámica</li>
<li>Serialización y desserialización automática, con una representación de datos simple basada en diccionarios Python</li>
<li>Interoperabilidad con .NET, Java Axis y JBoss WS, probado con SoapUi y .Net Web Services Studio, cumpliendo con los estándares WS-I</li>
<li>Capacidad de realizar pedidos y respuestas crudas -sin procesar- (útiles para tipos de datos genéricos xsd:anyType u operaciones avanzadas)</li>
<li>Documentación WIKI, incluyendo ejemplos WSDL, pruebas básicas de compatibilidad y rendimiento</li>
<li>Limpieza y estabilización de la API (incluyendo mejoras a SimpleXMLElement, una forma fácil y rápida orientada a objetos de manipular XML)</li>
</ul><div>A diferencia de otras soluciones, nuestro acercamiento es simple e intuitivo, no requiere complicadas definiciones XML o código autogenerado, flexibilizando el desarrollo rápido de webservices con el dinamismo de Python.</div><div><br />
</div>Desde la reciente versión 1.82.1, la integramos con <a href="http://www.web2py.com.ar/">web2py</a>, lo que lo convierte en una plataforma con soporte completo para exponer y consumir servicios web, complementando la infraestructura previa de json y xml_rpc, con un enfoque simple similar.<br />
<br />
Esta disponible un servicio online para pruebas, con una página que contiene la descripción y mensajes de ejemplo:<br />
<ul><li><a href="http://www.web2py.com.ar/webservices/sample/call/soap?WSDL">http://www.web2py.com.ar/webservices/sample/call/soap?WSDL</a></li>
<li><a href="http://www.web2py.com.ar/webservices/sample/call/soap">http://www.web2py.com.ar/webservices/sample/call/soap</a></li>
</ul><div>Los comentarios son bienvenidos, sobre todo reportes o casos de prueba, ejemplos, colaboración con otras librarías para mejorar la interoperabilidad, etc.</div></div>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-58738831833231866982010-05-29T17:09:00.000-03:002010-05-29T17:17:32.677-03:00Curso de Factura Electrónica y Software LibreEsta abierta la inscripción para la nueva edición del curso sobre las últimas novedades de Factura Electrónica y Servicios web AFIP, relacionado con la interfaz PyAfipWs de Software Libre hecha en Python:<br />
<br />
Curso Facturación Electrónica y Software Libre<br />
Fecha: Viernes 25 de Junio de 2010<br />
Horario: 18 a 20 hs<br />
Lugar: AUBA - Club de Programadores Asociación Civil<br />
Dirección: Auditorio Congreso - Entre Ríos 166 - C.A.B.A.<br />
<br />
El temario incluye una introducción a factura electrónica nacional original (WSFE), y los nuevos web services de bienes de capital (WSBFE), seguros de caución (WSSEG), factura electrónica de exportación (WSFEX).<br />
También comentaremos sobre temas relacionados, como ser el Código de Trazabilidad de Granos -Carta de Porte- (WSCTG), depositario fiel (wDigDepFiel) y Remito Electrónico ARBA (COT).<br />
<br />
A su vez, presentaremos el aplicativo PyRece (simil RECE - SIAP) libre y gratuito para generar y autorizar facturas electrónicas,<br />
entre otros proyectos relacionados.<br />
<br />
La entrada es libre y gratuita, los interesados pueden consultar los detalles e inscribirse en:<br />
<br />
<a href="http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=600">http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=600</a><br />
<br />
Más información:<br />
<br />
<a href="http://www.pyafipws.com.ar/">http://www.pyafipws.com.ar</a><br />
<br />
Se agradece difusión,Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-496308342295847002010-05-02T15:58:00.000-03:002010-05-02T22:15:08.766-03:00PyDay 2010 Rafaela, web2py y más<span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-family: inherit;">Está abierta la inscripción para participar de PyDay Rafaela 2010, la primer jornada sobre el lenguaje de programación Python en Rafaela (Santa Fé, Argentina), a realizarse el día 8 de mayo en la sede de la<br />
Universidad Católica de Santiago del Estero, Departamento Académico Rafaela, ubicada en Hipólito Irigoyen 1502, organizado por PyAr:</span></span><br />
<span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></span><br />
<span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-family: inherit;">Más información en: </span><span class="Apple-style-span" style="font-family: inherit;"><a href="http://www.pyday.com.ar/">www.pyday.com.ar</a></span></span></span><br />
<span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></span><br />
Hay varias charlas agendadas, entre ellas daré una charla de <a href="http://www.web2py.com.ar/">web2py</a> y seguramente en las charlas relámpago comentaré sobre los proyectos <a href="http://www.pyafipws.com.ar/">PyAfipWs</a> (factura electrónica libre), <a href="http://www.gestionlibre.com.ar/">Gestión Libre</a> y/o nuestro emprendimiento <a href="http://www.sistemasagiles.com.ar/">Sistemas Ágiles</a>.Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-64695219054339542842010-04-09T01:45:00.000-03:002010-04-09T01:45:53.161-03:00Abierta la inscripción a FLISOL 2010 en González CatánFLISOL, el Festival de Instalación de Software Libre que reúne a toda Latinoamérica, estará presente en González Catán el sábado 24/04/2010<br />
Podés traer tu computadora y te ayudamos a instalar programas libres, que podés copiar, estudiar, corregir, modificar, compartir y seguir copiando.<br />
Además: charlas informativas y demos para que conozcas más y disfrutes mejor las ventajas del Software Libre.<br />
La entrada es libre y gratuita, sólo necesitamos que te inscribas previamente por nuestra web:<br />
<br />
<a href="http://www.institutopascal.edu.ar/flisol2010">http://www.institutopascal.edu.ar/flisol2010</a><br />
<br />
Participan integrantes de las siguientes comunidades locales, quienes estarán a cargo de las instalaciones, charlas y demostraciones:<br />
<br />
<ul><li>Sistemas Operativos: <a href="http://www.ubuntu.org.ar/">Ubuntu</a>, <a href="http://www.archlinux.org/">ArchLinux</a>, <a href="http://www.aosug.com.ar/">OpenSolaris</a></li>
<li>Base de datos <a href="http://www.arpug.com.ar/">PostgreSQL</a></li>
<li>Lenguaje de Programación <a href="http://www.python.org.ar/">Python</a></li>
</ul>Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-78586760781409727862010-03-19T01:11:00.000-03:002010-03-19T01:11:08.801-03:00Clase Abierta: Introducción a Python, PythonCard y Web2PyInvitamos a los interesados en programación, desarrollo de aplicaciones y diseño web a presenciar una clase abierta de la carrera Analista de Sistemas de nuestro instituto, donde analizaremos las virtudes del lenguaje de programación Python, herramienta PythonCard para diseño simple de aplicaciones visuales (GUI) y Web2Py para diseño ágil de sitios interactivos web 2.0.<br />
<br />
Fecha: Miércoles 31 de Marzo de 2010<br />
Horario: 18:15 a 22:30<br />
Lugar: Instituto Superior Tecnológico Blaise Pascal<br />
Dirección: Puerto Argentino 4238 - González Catán - Buenos Aires - Argentina<br />
Entrada libre y gratuita previa confirmación por email debido a cupos limitados.<br />
<a href="http://www.institutopascal.edu.ar">http://www.institutopascal.edu.ar</a><br />
<br />
Temario:<br />
<br />
1. Introducción a Python: ¿Que es python?; El Interprete; Estructura Básica; Tipos de datos simples; Tipos de datos compuestos; Control de Flujo; Funciones, Clases y Objetos; Excepciones; Módulos, paquetes y espacios de nombre<br />
2. Introducción a la Biblioteca Estándar: sistema operativo, fecha y hora, expresiones regulares, números decimales, aleatorios, matemática, acceso a sitios web, manejo de email, xml, compresión<br />
3. Interfaces gráficas "visuales" con PythonCard. Similitudes y diferencias con Visual Basic.<br />
4. Desarrollo web 2.0 con web2py. Similitudes y diferencias con PHP. Diseño web HTML/CSS. Interactividad con Ajax (javascript).<br />
<br />
Se agradece difusión.Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.comtag:blogger.com,1999:blog-2304908645814887524.post-12571088519141901102010-02-14T14:17:00.000-03:002010-02-14T16:45:14.893-03:00Factura Electrónica de Exportación y ejemplo soap simpleEl Web Service de <a href="http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronicaExportacion">Factura Electrónica de Exportación</a> (WSFEX) es un nuevo servicio web de la AFIP para autorizar facturas electrónicas de comercio exterior (obtener el CAE).<br />
<br />
Para poder usar estos webservices, como se comento en varias oportunidades, desarrollamos interfaces propias hechas en Python debido a la incompatibilidad y complejidad de otras soluciones (.NET, Java, PHP).<br />
<br />
<b>A continuación se presenta un ejemplo de cuatro simples pasos, sobre como usar <a href="http://www.sistemasagiles.com.ar/trac/wiki/SoapClient"><b>SoapClient</b></a><b> y </b><a href="http://www.sistemasagiles.com.ar/trac/wiki/SimpleXmlElement"><b>SimpleXmlElement</b></a> para consultar fácilmente los servicios web de AFIP</b><b>:</b><br />
<br />
<b>Paso 1:</b> Importar las clases que necesitamos utilizar de nuestras librerias de XML y SOAP:<br />
<pre>from simplexml import SimpleXMLElement
from soap import SoapClient
</pre><br />
<b>Paso 2:</b> Revisar el <a href="https://wswhomo.afip.gov.ar/wsfex/service.asmx?WSDL">wsdl</a> que describe los servicios y extraer URL, acción y espacio de nombres (buscar atributos location, soapAction -sin la operación-, targetNamespace respectivamente):<br />
<pre>WSFEXURL = "https://wswhomo.afip.gov.ar/wsfex/service.asmx"
SOAP_ACTION = 'http://ar.gov.afip.dif.fex/'
SOAP_NS = "http://ar.gov.afip.dif.bfe/"
</pre><br />
<b>Paso 3:</b> Creamos nuesto cliente SOAP de servicio web:<br />
<pre>client = SoapClient(WSFEXURL,action=SOAP_ACTION, namespace=SOAP_NS, trace=True)
</pre><br />
<b>Paso 4:</b> Llamamos a la función remota, por Ej. <a href="https://wswhomo.afip.gov.ar/wsfex/service.asmx?op=FEXDummy">FEXDummy</a> que obtiene el estado de los servidores de la AFIP. Para ello debemos invocar el método "virtual" del objeto client de acuerdo como especifíca el <a href="https://wswhomo.afip.gov.ar/wsfex/service.asmx?WSDL">wsdl</a> (se recomienda leer el <a href="https://wswhomo.afip.gov.ar/fiscaldocs/WSFEX/WSFEX%20-%20Manual%20para%20el%20desarrollador.pdf">manual del desarrollador</a> que proporciona AFIP ya que el wsdl no es muy intuitivo). Como respuesta nos devuelve un objeto XML al cual podemos acceder directamente por sus atributos:<br />
<pre>response = client.FEXDummy()
result = response.FEXDummyResult
print str(result.AppServer)
print str(result.DbServer)
print str(result.AuthServer)
</pre><br />
Esto es todo, si funcionan bien nos debería imprimir el estado de los servidores (OK si estan funcionando).<br />
<br />
Notar la simplicidad y dinamismo gracias a Python, sin perder flexibilidad, pudiendo invocar métodos arbitrarios y convertir los tipos de datos según nuestras necesidades.<br />
<br />
En este caso el método del servicio web no recibe parámetros, si los tuviera se pasarían como argumentos por nombre (usando valores simples, diccionarios u objetos) de Python, ej.: <br />
<pre>response = client.FEXGetPARAM_MON(Auth={"Token": token, "Sign": sign, "Cuit":long(cuit)})
</pre>También puede tomarse como referencia los ejemplos de AFIP hechos en PHP, ya que desarrollamos estas herramientas para que sean similares.<br />
<br />
El código completo para utilizar el servicio web de factura electrónica de exportación puede ser descargado de <a href="http://code.google.com/p/pyafipws/">google code</a><br />
<br />
Para más información y novedades sobre estos temas exite un <a href="http://groups.google.com/group/pyafipws">grupo de noticia</a>, el sitio con <a href="http://www.pyafipws.com.ar/">información general del proyecto</a> y la páginas sobre <a href="http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronica">factura electrónica</a>, <a href="http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronicaPython">información técnica</a> y la interfaz <a href="http://www.sistemasagiles.com.ar/trac/wiki/PyAfipWs">PyAfipWs</a>.Mariano Reingarthttp://www.blogger.com/profile/09760272574200046008noreply@blogger.com