martes, noviembre 03, 2009

sex.py

Necesitaba limpiar una carpeta llena de archivos .txt, una Maildir en realidad, repletos de encabezados de rebotes y explicaciones de los majordomos y mailer-daemons. Es decir, recorrer esta marabunta de archivos, y volcar las direcciones de correo que allí figuraran.

Y me encontré con este tremendo programa, sex.py

http://dandies.org/files/d4674f917898c54c537378d5fb7cad6e-46.html

Ejemplo:

python sex.py -sr Maildir/ rebotados.txt

Es prácticamente una aspiradora de direcciones de correos, y puede ser apuntado hacia cualquier cosa, una url, un archivo, una carpeta, comparando con servidores dns por direcciones de correo validas, ordenando, quitando duplicados, volcando resultados a otro archivo, tremendo.

Y por cierto, una vez extraidas las direcciones de correo rebotadas, quería compararlas con mi mailing-list, y crear un nuevo archivo de direcciones validas:

for i in `cat mailing-list.txt`; do echo $i|grep -v -f rebotados.txt; done > limpitos.new

Ojo que este for puede demorarse bastante. Chequear en otra terminal mediante un

tail -f limpitos.new

Listo, ahora me aseguro de no sobreexigir el smtp con rebotes innecesarios (que siempre son la mayoría). Además, es de unos amigos, y no quiero abusarme.

lunes, octubre 26, 2009

Salida de un comando de de rails script/console a un archivo

Encontrado en la lista de correo de RubyArgentina:

Hello rails fans,
quiero mandar la salida de un comando de de rails script/console a un archivo

Muy buena respuesta de Nicolás Sanguinetti

******************

Pensandolo bien, la mejor solución es usar tee(1)

foca ~/projects/self/howsmycode (git: master*)
▸ script/console | tee tmp/foobar.log
>> 1
=> 1
>> ^D
foca ~/projects/self/howsmycode (git: master*)
▸ cat tmp/foobar.log
>> 1
=> 1
>> ^D
foca ~/projects/self/howsmycode (git: master*)

***********************

Y para limpiar el archivo de los caracteres >> y => lo ideal, supongo, usar el Ctrl + V del vim

Machete sobre Rsync

Problema: sincronizar entre dos discos solamente archivos de ofimática.

rsync -avm --include='*.doc' --include='*.DOC' --include='*.xls' --include='*.XLS' --include='*.odt' --include='*.ods' -f 'hide,! */' /mnt/WinRoto/ /home/s/Desktop/backup/ --progress

En cuanto a otros programas con interface gráfica... no hay caso. Citando a Groucho (@) lugmen... GUI sucks.

Upps me olvide de hacer backups de los ppts de los usuarios. ¡Pero que pérdida che!

jueves, octubre 15, 2009

Dejo aquí guardado un trabajo de opinión en el Foro en la Licenciatura en Tecnología Educativa, una carrera que estoy cursando en la UTN, respecto del rol del docente en la universidad. Me salió un tanto pomposo, pero quizás inspire a otros docentes.

A la profesora le gustó mucho, y me gustaría que quedara disponible

---

¿Qué y cómo es enseñar en la Universidad?

Depende del perfil elegido. Y es un factor de placer. Cada nivel posee cuotas de satisfacción, y desafíos propios. De la primaria extraigo la facilidad con la que se puede conseguir la atención de los niños, todo les sorprende y atacan toda actividad con ahínco y gusto.

De los adolescentes rescato la juvenil frescura y el desafío de interesarlos. Poseen un tiempo libre y una libertad que los niños no tienen. Por suerte, en la mayoría de los casos he conseguido interesarlos, llevarlos hacia jornadas, o integrarlos en grupos. La práctica de taller es la ideal, y el rigor -si, rigor- en los tiempos de entregas de trabajos prácticos.

No he dado clase en la Universidad, aunque si muchos años en el nivel superior. De todos me parece el más satisfactorio, en cuanto al feedback obtenido. La razón estriba en mi progresiva experiencia profesional en distintas empresas. Esta me ha llevado a trabajar en áreas muy áridas de la informática. Me gusta el ejercicio mental intenso en lenguajes “duros”: C, C++, Java, Python, todos bajo entornos POSIX, Unix, Linux y embebidos.

Y solo en el nivel superior, con personas interesadas en los mismos desafíos, he logrado una plena satisfacción de formar alumnos con capacidad para innovar, crear, reciclar ideas, y lo mas importante, sorprenderme.

Y por cierto: no todo lo que las empresas piden es bueno para las clases: en su mayoría piden el uso de programas cerrados, propietarios, enlatados, que no enseñan, sino que oscurecen los procesos que llevan al control final de un buen resultado.

Cada clase debe ser única, inspiradora, agotadora. Debe llevar al 100% al promedio particular de la clase. Cada alumno debe llegar a su máximo potencial. El profesor debe hacer que se olviden de la calle, de la casa, de los problemas. Cuando termine la clase, el mundo tiene otro color: no es la gris amargura que nos venden los medios de comunicación o el trágico inconsciente colectivo argentino: con los conocimientos recién adquiridos se pueden hacer un montón de cosas.

Hay que hacerles ver a través de la realidad. Los mecanismos no son abstractos, son transparentes, desarmables, combinables: todo es un mecano y para llegar hasta donde se quiere, solo hay que ensamblar las piezas adecuadas. Todo error sirve si se aprende de él.
Así, el profesor les ha plantado los primeros escalones, les ha dado una cachetada en la nuca, los ha despertado del sueño donde vivían.


¿Existen otros desafíos o son los mismos?

Son los mismos. Los alumnos de hoy tienen el mismo ADN que los de hace 20 generaciones atrás. Puesto que no han habido explosiones de rayos gamma cercana a nuestro sistema solar, ni mutaciones visibles, no ha habido demasiados cambios en su cadenas helicoidales. Poseen las mismas ganas en todos los niveles: mucha en la primaria, ninguna en la adolescencia, y “adecuada” en el terciario. Leen apenas, imaginan menos, y cometen todo el tiempo la tropelía de perderse el placer que esto atañe. Igual que 20 generaciones para atrás.
No poseen habilidades especiales, son durísimos con la informática. Dominan lastimeramente el messenger, facebook, y como una excepción se comunican con los maestros por el arcaico e-mail. Poseen capacidades casi nulas de relacionarse, en relación a todas las opciones que la sociedad e internet les provee. Son ingenuos, se pegotean a cuanto virus o pederasta ande suelto por la red. No distinguen un troyano aunque se pusiera una media y les bailara delante del monitor.
En fin, se encuentran ante un volumen tan grande de opciones que no ven, de desafíos que se les antojan como pirámides, que es un gusto levantarles apenas los dedos de los ojos, y mostrarles lo evidente: la potencialidad de la masa crítica que es internet, el inmenso caldo de cultivo de oportunidades, servidas en bandeja para quienes tenga la mínima picardía de escribir aquello que quisieran hacer, seguido de la palabra mágica “tutorial”.

Son ignorantes, pero mas sabios en cuanto a que la televisión los educa, dentro de la corriente galvánica de banalidades con la que los irradia. Tienen menos prejuicios.


¿Utiliza las mismas estrategias de enseñanza que el docente de primaria, secundaria o terciario?

Indudablemente no: pero entro como un tanque a la clase. Siempre acarreo circuitos, hojas con ejemplos, fotocopias con ejemplos listos, recortes de diarios (actualizados), revistas sobre el tema, y me amparo sobre la marabunta de documentación que genero mensualmente. Me cuido la voz, y la uso para despertarlos, sorprenderlos. Gesticulo mucho y los hago formar parte de un rol general.


¿Qué ideas, representaciones y experiencias (como alumno o profesor) puedo contar sobre este tema?
Me aseguro que todo lo que se dice y habla en clase quede guardado en la web, esto se debe a que, como decía el Ing. Degarbo, "entro hablando y salgo hablando". Tengo incluso varias charlas grabadas por mis alumnos, guardadas como mp3.
Jamas dejo de contestar un correo y contesto siempre en el día. Los incentivo a hacer preguntas complicadas en los foros públicos. Me los llevo de la nariz a cuanto congreso, charla o conferencia se brinde en la ciudad o provincia cercana.

Incluso he conseguido disquetes de 8”, una máquina de telex, un pequeño museo de cachivaches para que valoren las herramientas de las que disponen ahora.

Luego, para los promedios de 9 para arriba, los recompenso con un seminario personalizado de un día de diciembre, con temas atractivos, pero que requieren de todo el conocimiento de la materia: algunos temas, como hacking, contramedidas electrónicas, frameworks webs son los mas concurridos, y los chicos realmente se esfuerzan en obtener notas para llegar a estos seminarios.
Sin embargo, no puedo aconsejar este nivel de actividad a otros docentes ni puedo proponerme como modelo: sencillamente soy workalcoholic, ayudado por una organización cuatridimensional de los tiempos gracias al Google Calendar, y dos grandes ventajas: en la empresa donde trabajo no les molestan mis alumnos, siempre curioseando en el área de sistemas con sus proyectos personales.

Gracias a mis servers Linux, tengo mucho tiempo para experimentar. Segundo, todo esto no sería posible sin mi mujer, Lic. en Informática, profesora de informática, geek, encargada de laboratorio, y apasionada por temas afines.


¿Qué satisfacciones y frustraciones tiene?
En su mayoría, satisfacciones. Muchos alumnos han conseguido muy buenos puestos, y siempre me recuerdan con cariño. Todas las semanas alguno se acerca al Area de Sistemas con ideas o proyectos, donde los ayudo o les destrabo problemas técnicos.

También me recomiendan en las empresas donde trabajan, y siempre se mantienen en contacto cuando egresan. Finalmente, es un gusto buscar términos técnicos en internet, y descubrir mi nombre (y el de mis alumnos ayudantes) saltando en apuntes, seminarios y conferencias.

El truco es muy simple: jamas me reservo nada de todo lo que escribo, y al estilo del software libre, todo lo tengo bajo licencias públicas de documentación. Esto Google lo sabe y lo usa en su page rank.

Me duele encontrar todavía a la humanidad creyendo en viejos y copiados dioses, ignorantes que solo la verdad los hará libres. Que solo hay una vida y que el trabajo duro la dignifica, la mejora, y la hace disfrutable. Que la crítica solo funciona si es constructiva, que somos una mente colmena, y que esa es nuestra única inmortalidad. Que somos un cascote en el espacio, y que solo nosotros depende depende cuidar la nave tierra, hasta que al menos encontremos la manera de llegar otro planeta para hacer backup urgente.

Como citara mi compañero en MIT, Miguel Rodríguez (y Carl Sagan, por cierto):
“No debo buscar mi dignidad en el espacio, sino en el gobierno de mi pensamiento. No tendré más aunque posea mundos. Si fuera por el espacio, el universo me rodearía y se me tragaría como un átomo; pero por el pensamiento yo abrazo al mundo.” - Pascal.


¿Cuáles son sus desafíos?

Muchos. No me alcanzarían 50 reencarnaciones. Solo los hijos, _de los hijos_, **de los hijos** de quienes estamos enseñando _ahora_ pueden cambiar el mundo. Necesito aprender, a llegar a todos, a usar correctamente las plataformas, a actualizar la documentación, a crear actividades, a descubrir las dificultades. Ayer descubrí un alumno, en un grupo grande por cierto, que se me había pasado por alto: era sordomudo. Y embalado en la clase, no me había dado cuenta de dirigirme hacia él, de modular con cuidado, de ilustrarle los temas. Al final me quede con él y lo puse al día. Las horas extras sinceramente me importan un pimiento -expresión de Fontanarrosa- ¡pero lleva tres clases conmigo! Una vergüenza, que me obliga reflexionar, una vez mas, de los tiempos y velocidades que llevo en clase.

Entré a la Licenciatura precisamente por el desafío: lograr lo mismo que consigo en clase, pero a distancia.

Por supuesto, es muy difícil. Del eminente Ing Cesar Aranda, prof de la UTN, aprendí a:

- Darle una cabida a los alumnos incluso fuera de las horas cátedras
- Hacer un poco de show en escena, manejar los tonos de voz, incluir suspenso, hacerlos pensar mucho, manejar los silencios y la expectativa.

Se me ocurre que se podría lograr algo de ello, transmitiendo o guardando las clases en video. Es decir: podcasting

El podcasting se usa mucho cuando se imparten tutorías de programas técnicos. No requiere de cámara web: tan solo de un micrófono y un programa para grabar lo que ocurre en la pantalla. Si se maneja la voz y se agregan algunos efectos simples de sonido se puede conseguir mucha atención hacia la pantalla.

Si las clases pueden quedar guardadas... se convierten en un material que complementa al acervo bibliográfico.

Y tratar de llegar a todos: ¡una clase grabada puede ser subtitulada! con el efecto que puede llegar a las personas sordas o hipoacusicas.

Por lo pronto, me metí en algunos ratos a aprender lengua de señas argentina (LSA): aquí tienen los vínculos que voy guardando en del.icio.us:

En fin, me quedo barruntando ideas y aprendiendo todos los días junto a ustedes.

Un gran abrazo!

miércoles, octubre 14, 2009

Graficos estadisticos rápidos en Rails

Nunca me habia sido tan fácil hacer gráficos en un lenguaje:

sudo gem1.8 install googlecharts

En environment.rb, al final, antes del end:
require 'gchart'

En el controlador
@algo = Gchart.bar(:title => "Matt vs Rob",
:data => [[300, 100, 30, 200], [100, 200, 300, 10]],
:bar_colors => 'FF0000,00FF00',
:stacked => false, :size => '400x200',
:legend => ["Matt's Mojo", "Rob's Mojo"] )


En la vista:
<img src="<%=@algo %>">

domingo, septiembre 27, 2009

Encuesta sobre uso de ciencia en acciones cotidianas (actualización)

Actualización en la url:

Te agradezco si llenas esta encuesta. Es para un trabajo de investigación para una materia que estoy cursando en la Universidad Tecnológica Nacional - sergio@eim.esc.edu.ar

Trata sobre preguntas cotidianas de ciencia. El objeto es descubrir que tanto se usa la ciencia en la vida cotidiana.

******** Formulario aquí *********

domingo, septiembre 20, 2009

Ruby: Postear eventos a Google Calendar

Hubo que toquetear un poco mas de lo que decían los tutoriales, pero al fín quedó andando.

Ojo el Timezone: la "/" es la clave.

sudo gem1.8 install -r googlecalendar --include-dependencies

Código de ejemplo

require '/usr/lib/ruby/gems/1.8/gems/googlecalendar-1.1.0/lib/googlecalendar.rb'
include Googlecalendar
g = GData.new
g.login('tu_correo@gmail.com', 'tu_password')
event = { :title=>'prueba8',
:content=>'content',
:author=>'pub.cog',
:email=>'pub.cog@gmail.com',
:where=>'America/Mendoza',
:startTime => '2009-09-21T10:00:00.000-03:00',
:endTime => '2009-09-21T10:30:00.000-03:00'}
g.new_event(event)

miércoles, junio 17, 2009

active_scaffold

Recuerdan el golpe de efecto que tenía Rails en sus orígenes?

Era el scaffold dinámico: una simple orden que generaba automáticamente el ABM de una tabla.

Incluso por aquella época recuerdo también un plugin llamado ajax_scaffold que hacia lo mismo con mas elegancia.

En Rails 2 se extraña esa funcionalidad que... es cierto, mal acostumbraba a los programadores.

Buscando no recuerdo que cosa, descubro esta pequeña joya sobreviviente de Rails 1.2: active_scaffold

En términos generales, y a modo de machete:

rails prueba2

cd prueba2/

script/plugin -v install git://github.com/activescaffold/active_scaffold.git

script/generate model user name:string age:integer

rake db:migrate

script/generate controller user

vim app/controllers/user_controller.rb

----------------------------------------------

Al principio, inmediatamente después del class UserController ... agregar

layout "user"

active_scaffold :user

----------------------------------------------


vim app/views/layouts/user.html.erb

----------------------------------------------

Agregar en el head:



<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>
-------------------------------------------------


script/server -p 3002 -d

firefox localhost:3002/user

Listo!

Se le puede agregar tablas, al estilo sucio (sobre el motor), o mediante migraciones. Y al igual que el viejo scaffold dinamico, el cambio es inmediato: solo hay que refrescar el browser.

script/generate migration add_nick_and_password_to_user user:string password:string

rake db:migrate

Personalizar: volvemos a abrir el UserController y lo cambiamos por estas líneas que se explican solas:

layout "user"

# active_scaffold :user

active_scaffold :user do |config|

config.label = "Usuarios"

config.columns = [:name, :nick, :created_at]

# list.columns.exclude :password

list.sorting = {:name => 'ASC'}

columns[:name].label = "Nombre #"

#ejemplo util
#columns[:phone].description = "(Format: ###-###-####)"


end




Aquí hay otro vinculo donde figura como personalizarlo:

http://blog.akilles.org/2008/04/17/ruby-on-rails-experimenting-with-activescaffold/#basic


Blogger apesta bastante cuando muestra código fuente. Aquí está el proyecto listo para copiar / pegar los ejemplos: http://www.bunker.org.ar/incubadora/active_scaffold