Manuel Kaufmann (Humitos): Paseando por la TV

Durante toda esta semana nos estuvimos paseando con @EllaQuimica por diferentes canales de televisión de aquí de Cochabamba, Bolivia. Incluso, fuimos a uno que sale a nivel nacional :D

El motivo: dar a conocer los cursos y talleres que dimos durante esta semana.

Aquí pueden ver los videos que subimos a YouTube como para que quede algún registro:


Ese día lo publicaba en el canal de Python Argentina:

20:41 <Facu> humitos, es un screener! cuando sale en DVD así lo bajo bien?

20:42 <humitos> Facu: primero se tiene que estrenar en cines

También el día de hoy 20 de Agosto, salimos en la edición impresa del diario "Los tiempos" de Cochabamba, Bolivia.

IMG_20150820_163716.thumbnail.jpg

Nota en el diario "Los tiempos" (link)

Además, unos pocos minutos antes de que comience la charla de "Introducción a Pyhon" ayer en el mARTadero, me hicieron una entrevista que salió publicada en "Urbana Web"

Vale la pena decir que salimos en otros tres programas más de televisión que no pudimos grabar y que tampoco conseguimos los archivos en formato digital por parte de los canales.

Entonces, ¿Cuántas veces has visto que se hable de Python, Ciencia, Django y programación en la Televisión? Bueno, creo que hoy, entre todos, lo estamos logrando y estamos pudiendo acercar la programación de computadoras a más personas.

¡Gracias a todos ustedes por apoyar esta locura itinerante! Además, hay que destacar el trabajo de Jhade, nuestro contacto de prensa del Proyecto mARTadero.

Mariano Guerra: Enabling CORS in Solr in a Cloudera environment

This is a continuation of this post: Enable CORS in Apache Solr but this time for an instance that is running in cloudera.

No idea how it was installed since it was already there, but doing some investigation and avoiding reading the docs at all costs I arrived at this solution.

The idea of this post is to make you avoid reading the docs too!

First I will give names to some things that may be different for you:

CDH=/opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/
CDH_USER=cloudera-scm
CDH_GROUP=cloudera-scm

Now do:

cd $CDH/jars/
wget http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/9.1.5.v20140505/jetty-servlets-9.1.5.v20140505.jar
wget http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/9.1.5.v20140505/jetty-util-9.1.5.v20140505.jar

cd $CDH/lib/bigtop-tomcat/lib/
ln -s $CDH/jars/jetty-servlets-9.1.5.v20140505.jar
ln -s $CDH/jars/jetty-util-9.1.5.v20140505.jar

chown $CDH_USER.$CDH_GROUP jetty-servlets-9.1.5.v20140505.jar
chown -h $CDH_USER.$CDH_GROUP jetty-servlets-9.1.5.v20140505.jar

chown $CDH_USER.$CDH_GROUP jetty-util-9.1.5.v20140505.jar
chown -h $CDH_USER.$CDH_GROUP jetty-util-9.1.5.v20140505.jar

Then create $CDH/lib/bigtop-tomcat/bin/setenv.sh with your favorite text editor and put in it the following:

CLASSPATH="$CATALINA_HOME"/lib/jetty-util-9.1.5.v20140505.jar:"$CATALINA_HOME"/lib/jetty-servlets-9.1.5.v20140505.jar:"$CATALINA_HOME"/lib/servlet-api.jar

Open $CDH/etc/solr/tomcat-conf.dist/WEB-INF/web.xml with your text editor and follow the instructions at Enable CORS in Apache Solr

The way to know if it worked is to open the Solr admin panel, if it loads it works, if it doesn't look at the logs, mine are at /var/log/solr/. To be sure that the classpath was set correctly from setenv.sh look in the solr admin page in the "Java Properties" section for the java.class.path variable, it should have the class path you set in setenv.hs plus some extra stuff (mainly bootstrap.jar).

If the admin page doesn't load (tomcat 404) look at the logs, some class loading error may be happening, comment the config you added in web.xml and restart.

The version I'm using of the jetty jars is because newer versions are compiled for java 1.8 and I have 1.7, use older/newer depending on your java version.

Martín Gaitán: Curso de Python para ciencias e ingeniería, nueva edición

/images/Newsletter4-Banner_20120705_12-44-50-800.jpg

¡Atención!

¿Estás interesado en que dicte este curso, de manera intensiva, en tu laboratorio o empresa? Contactame.

Está abierta la inscripción para el nuevo dictado de mi curso de introducción a Python para ciencias e ingenierías, en la Facultad de Ciencias Exáctas, Físicas y Naturales de la Universidad Nacional de Córdoba (aprobado como curso de extensión - Resolución 1272/2015, bajo el nombre "Python como herramienta para la ingeniería") desde el miércoles 14 de ocubre de 18 a 22hs, durante 5 semanas.

Este curso una versión mejorada del que dicté en la Facultad de Matemática, Física y Astronomía en mayo pasado, avalado como curso de extensión (Resolución HCD 107/2015)

El precio está absolutamente subsidiado por las ganas de que más ingenieros e investigadores programen Python. No te demores en anotarte , los cupos son muy limitados!

Se entregarán certificados a quienes completen asistencia.

Lo que hay que saber

Fecha de inicio:
  miércoles 14 de octibre de 2015, 18hs.
Lugar: Laboratorio de computación (aula 112), FCEFyN.
Duración: 5 clases de 4hs (incluye coffee break), miércoles de 18 a 22hs
Docente: Ing. Martín Gaitán
Material: https://github.com/mgaitan/curso-python-cientifico

Aranceles

  • $500.– estudiantes y docentes de la UNC.
  • $750.– estudiantes y docentes de otras universidades públicas.
  • $1.000.– público en general.

Inscripción

Deberá completar este formulario

Luego se deberá abonar a través de un depósito o transferencia bancaria a la siguiente cuenta:

Titular: UNC - Fac. Cs. Exactas, Físicas y Naturales
CBU: 01102132 20021319046022
CUIT: 30-54667062-3
cuenta Corriente Bco. Nación Argentina - Suc. Córdoba  213-19046/02
Sucursal Nro. 1570

Una vez realizado el pago, deben enviarnos el comprobante de pago y documento que acredite el descuento (si aplica) a los emails escueladecomputacion@efn.uncor.edu y gaitan@gmail.com

Resumen

En las últimas décadas la computación se ha convertido en un pilar de la ingeniería y el desarrollo científico-tecnológico. En la mayoría de las áreas, el trabajo computacional es un complemento fundamental de la experimentación tradicional y de la teoría, ya que cada vez más se involucra simulaciones numéricas y modelado computacional. Frecuentemente, la tarea de los profesionales involucra el uso de aplicaciones específicas que requieren un gran trabajo de procesamiento de los datos de entrada y un post-procesamiento de los resultados utilizando otras herramientas.

Este curso brindará una introducción al poderoso lenguaje de programación Python (http://python.org) y a las herramientas fundamentales del "ecosistema científico" (IPython, Numpy, Matplotlib, Scipy) que conforman un entorno de programación interactivo de vanguardia, simple, libre, gratuito y multiplataforma.

Sobre el docente

Martín Gaitán es Ingeniero en Computación por la Universidad Nacional de Córdoba (2011). Socio fundador de Phasety, emprendimiento incubado en la UNC entre 2012 y 2015, donde desarrolló software de simulación especializado para la industria del petróleo y el gas. Pythonista desde hace una década, es especialista en el framework web Django y cree entender las necesidades del software científico. Es frecuente orador en eventos de software libre.

Más información en su blog

Programa

Clase 1:
Características de Python. Instalación de entorno en Windows/Linux. Modos de usar Python. Anaconda. Introducción a Ipython Notebook. Tipos de datos: enteros, floats, complejos, strings. Estructuras de datos incorporadas: listas, tuplas, diccionarios, conjuntos. Packing, indexing, slicing. Conceptos de mutabilidad, inmutabilidad, secuencia, iterador. Control de flujo: if, for, while. Estructuras por comprensión.
Clase 2:
Funciones: definición, argumentos posicionales y nominales. Generadores. Funciones incorporadas: zip, range, enumerate, etc. Manejo de I/O: lectura y escritura de archivos. Manejo de excepciones. Manejadores de contexto.
Clase 3:
Estructura de proyectos: módulos, paquetes, importación. Paseo por la biblioteca estandar: math, CSV, json, pickle Conceptos básicos de programacion orientada a objetos. Introduccion a Matplotlib y Numpy.
Clase 4:
Numpy: introducción al objeto Array. Slicing extendido, métodos y funciones importantes, importación de datos. Concepto de vista. Máscaras y fancy indexing. Aplicación de Numpy en álgebra lineal. Resolución de sistemas de ecuaciones lineales. Matplotlib: generación de gráficos cartesianos continuos, puntos, histogramas. Matplotlib avanzado: API orientada a objetos. Manipulación del formato y apariencia. Gráficos 3D, otros tipos de gráficos 2D. Exportación con calidad de publicación.
Clase 5:
Vectorización de funciones. Scipy: algoritmos optimización, integración, procesamiento de imágenes, ajuste de curvas etc. Sympy, cálculo simbólico de precisión arbitraria con Python. Evaluación numérica de expresiones Sympy con Numpy y otras herramientas de alta performance

Manuel Kaufmann (Humitos): Compartir videos con tu co-equiper

Viajamos mucho y muchas veces tenemos poca conectividad a internet. Entonces, necesitamos una forma de poder descargar la mayor cantidad de datos de internet cuando sí tenemos internet.

Para eso, hemos implementado varias ideas pequeñas que nos permiten trabajan Offline y sincronizarnos cuando estamos Online. Por ejemplo, muchas veces queremos bajar videos para ver cuando no tenemos internet.

Acá viene la cuestión. Siempre pasa que nos decimos: "¿Bajaste el video que te pedí?" y siempre tiene la misma respuesta: "¡Uh! Me re colgué". Finalmente, nunca tenemos nada para ver.

¡Basta! ¡Me cansé! Necesito hacer un programa que me ayude. Para eso combiné: Dropbox + youtube-dl + bash magic. Primero, creamos un archivo llamado urls-videos.txt y lo compartimos con Dropbox entre los dos. Cada uno agrega, cuando quiere/puede, un link al video que quiere bajar (uno por línea). Luego, en mi máquina me hice un one-line-bash-script que lo que hace es:

  1. Tomar la primera línea
  2. Bajar el video
  3. Borrar la primera línea (si tuvo éxito la descarga)
  4. Volver al primer paso

El script:

URLS=urls-videos.txt
youtube-dl --restrict-filenames --retries 50 --continue \
           --write-sub --sub-lang "en,es" --batch-file $URLS \
           --exec "tail -n +2 $URLS > /tmp/urls.txt ; mv /tmp/urls.txt $URLS ; ls"

La descripción:

--restrict-filenames:
  restringe el nombre de los archivos a algo más compatible (sin caracteres raros)
--retries 50: intenta un máximo de 50 veces
--continue: resume la descarga en caso de haberse cancelado por cualquier motivo
--write-subs: escribe los subtítulos en un archivo
--sub-lang: selecciona solo los subtítulos de los lenguajes "English" y "Español"
--batch-file: utiliza un archivo como entrada de urls a descargar
--exec: (acá está la magia) mediante tail -n +2 elimino la primera línea del archivo de urls y lo guardo en un archivo temporal. Luego, muevo ese archivo temporal al archivo original de urls (urls-videos.txt). Finalmente, pongo un ls porque youtube-dl concatena el nombre del archivo recién descargado, y como yo no quiero hacer nada con ese archivo, simplemente lo muestro en pantalla.

Así, cuando tengo internet se actualiza (con toda la magia de Dropbox) el archivo urls-videos.txt que yo modifiqué en mi máquina y también el que modificó Johanna. Después yo corro ese simple script y comienza el proceso.

¡Tenemos videos para ver! (sobre todo charlas TEDx)

Manuel Kaufmann (Humitos): Introducción a Python en Cochabamba

El próximo Miércoles 19 de Agosto estaremos dando una charla "Introducción a Python" en Cochabamba, Bolivia con el proyecto Argentina en Python.

La idea principal de esta charla es crear una comunidad local de programadores o entusiastas de Python. Para eso, se mostrará uno de los lenguajes de programación del momento que se está expandiendo en diferentes ámbitos: desde el desarrollo de un sitio web, hasta un software para controlar robots.

Las charlas de Python están orientadas normalmente a estudiantes del último año del secundario y primeros años de las universidades de carreras referidas a sistemas, dónde los asistentes tienen un mínimo conocimiento sobre qué es programar aunque no necesariamente sepan programar.

flyer.thumbnail.png

Flyer de la charla "Introducción a Python"

Tené en cuenta que...

  • ... es necesario registrarse (cupos limitados) mediante el formulario para poder participar.
  • ... la charla es de entrada libre y gratuita, aunque también se reciben donaciones para el proyecto.

¿Dónde y cuándo?

Programa de la charla

  • ¿Qué es Python?
  • Comunidad
  • Intérprete interactivo
  • Herramientas básicas
  • Manipulación básica de datos
  • Estructuras de control
  • Documentación complementaria

Si tenés ganas de empezar a aprender Python, podés ingresar a: Quiero aprender Python, donde vas a encontrar un montón de tutoriales, guías para principiantes y hasta libros más avanzados :)

¡Los esperamos!

Juanjo Conti: Hoy tuve una suerte pequeña

Una suerte pequeña, Claudia PiñeiroHoy, casi de noche. Estaba fresco pero me había abrigado. Caminé por la peatonal de Santa Fe haciendo tiempo, paseando un rato. Entré a la librería sin nada en mente, revisé las mesas con los títulos nuevos, pasé la mano por algunas letras de model. Llegué a la estantería con las obras completas de Borges y leí un poema al azar. Al costado, en un anaquel, las novelas de Claudia Piñeiro. La única que no leí es la última que publicó, Una suerte pequeña. La tomo y ya se que voy a comprarla, leo el primer párrafo y ya se me creo esa necesidad de leerla. Empiezo a leer el primer capítulo ahí, parado en la intersección entre dos pasillos. Recibo un mensaje, tengo que ponerme en camino. Voy hasta la caja sin soltarlo. “Me podés decir el precio de este (libro)”, digo tratando de disimular mi ansiedad, como un chico que no quiere que la chica se de cuenta que le gusta. “Si es 150 o menos me lo llevo”. “200”, me responde. “Bueno, lo llevo”.
Me pasa con algunos autores, una vez que leo uno de sus libros, tengo que leerlos todos.

Juanjo Conti: Hoy tuve una suerte pequeña

Una suerte pequeña, Claudia PiñeiroHoy, casi de noche. Estaba fresco pero me había abrigado. Caminé por la peatonal de Santa Fe haciendo tiempo, paseando un rato. Entré a la librería sin nada en mente, revisé las mesas con los títulos nuevos, pasé la mano por algunas letras de model. Llegué a la estantería con las obras completas de Borges y leí un poema al azar. Al costado, en un anaquel, las novelas de Claudia Piñeiro. La única que no leí es la última que publicó, Una suerte pequeña. La tomo y ya se que voy a comprarla, leo el primer párrafo y ya se me creo esa necesidad de leerla. Empiezo a leer el primer capítulo ahí, parado en la intersección entre dos pasillos. Recibo un mensaje, tengo que ponerme en camino. Voy hasta la caja sin soltarlo. "Me podés decir el precio de este (libro)", digo tratando de disimular mi ansiedad, como un chico que no quiere que la chica se de cuenta que le gusta. "Si es 150 o menos me lo llevo". "200", me responde. "Bueno, lo llevo".

Me pasa con algunos autores, una vez que leo uno de sus libros, tengo que leerlos todos.

Mariano Guerra: Enable CORS in Apache Solr

Quick post since there's no easy googlable (?) resource to do this.

open the file server/solr-webapp/webapp/WEB-INF/web.xml and add the following XML before the existing filter section:

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
         <param-name>allowedOrigins</param-name>
         <param-value>http://localhost*</param-value>
    </init-param>
     <init-param>
         <param-name>allowedMethods</param-name>
         <param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS</param-value>
     </init-param>
     <init-param>
         <param-name>allowedHeaders</param-name>
         <param-value>origin, content-type, cache-control, accept, options, authorization, x-requested-with</param-value>
     </init-param>
    <init-param>
        <param-name>supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>chainPreflight</param-name>
      <param-value>false</param-value>
    </init-param>
</filter>

<filter-mapping>
  <filter-name>cross-origin</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

taken from this Stack Overflow response

Marcos Dione: socks-over-ssh

Soon I'll be changing jobs, going from one MegaCorp to another. The problem is, my current workplace already has a silly security policy that does not allow you to use IRC or do HTTP against a dynamic DNS/IP (like the one at home), but happily lets you use webmails through which you can send anyone the company's IP without leaving much trace. Furthermore, my next assignment will have stricter Internet policy, so I finally sit down to see alternatives to have more traffic with the less footprint.

As I already mentioned, back home I have ssh listening on port 443 (and the port forwarded from the router to the server), and this worked for a while. Then these connections were shutdown, so I used stunnel on the server and openssl s_client plus some ssh config magic to go over that. This allowed me to use screen and irssi to do IRC and that was enough for a while. This meant I could talk to the communities around the tools and libs we were using.

But now I plan to change the way I do my mail. So far the setup includes using fetchmail to bring everything to that server, then use dovecot and/or a webmail to check from anywhere. But as ports are filtered and I already use 443 for ssh, I can't connect to IMAPS and I don't want to use something like sslh to multiple ssh and https on the same port because it sounds to ohacky, I turned towards SOCKS proxying.

Setting up a SOCKS proxy through ssh is simple. Most of the tutorials you'll find online use putty, but here I'll show how to translate those to the CLI client:

Host home
    Hostname www.xxx.yyy.zzz  # do not even do a DNS req; the IP is mostly static for me
    Port 443
    <span class="createlink">ProxyCommand</span> openssl s_client -connect %h:%p -quiet 2>/dev/null
    <span class="createlink">DynamicForward</span> 9050  # this is the line that gives you a SOCKS proxy

Then the next step is to configure each of your clients to use it. Most clients have an option for that, but when not, you need a proxyfier. For instance, even when KDE has a global setting for the SOCKS proxy, kopete does not seem to honor it. These proxifyers work by redirecting any connect(), gethostbyname() and most probably others to the SOCKS proxy. One of the best sources for SOCKS configuration is TOR's wiki, which heavily relies on SOCKS proxies, but right now the proxyfier they suggest (dante-client) does not install on my Debian setup, so I went with proxychains. Its final config is quite simple:

# Strict - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# all proxies must be online to play in chain
# otherwise EINTR is returned to the app
strict_chain

# Proxy DNS requests - no leak for DNS data
proxy_dns

# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000

[ProxyList]
# defaults set to "tor"
socks5  127.0.0.1 9050

In fact, that's the default config with only one modification: the SOCKS protocol is forced to 5, so we can do DNS requests with its UDP support.

With this simple setup I managed to connect to my XMMP server with kopete, which is already a lot. Next step will be to figure out the mail setup and I can call this done.


sysadmin piercing

Facundo Batista: Se viene se viene el PyCamp 2015


La semana que viene (casi ahora ahorita) arranca una nueva edición del mejor evento de programación del mundo mundial.

Esta vez se hace en La Serranita, Córdoba.

Hay un montón de propuestas de varias personas, yo en particular propuse armar una especie de verificador de subtítulos (la idea es verificar si un subtítulo matchea con el video... o mejor dicho, con el audio... lo básico es encontrar si en el momento del subtítulo hay alguien hablando, con eso uno ya se asegura que el subtítulo está sincronizado), trabajar un poco en Encuentro y fades, y armar un Python Bug Day (para trabajar un rato en Python en sí, cerrar algún bug del lenguaje propiamente dicho... mucho código del lenguaje es en C, pero también hay mucho en Python mismo, y hay algunas cosas que son sencillas).

Aproveché y preparé/actualicé instrucciones de "cómo configurar/inicializar/arrancar con el proyecto" tanto para Encuentro como para fades. Para Python en sí no hace falta, ya que hay clarísimas instrucciones en la Python Developer's Guide :)

Ya les reportaré como fue todo :)