FAQ sobre artículos de LUGs en Wikipedia en español

¿Por qué se eliminan artículos de LUGs en Wikipedia?

Los wikipedistas trabajamos en el proyecto a través del consenso y dentro del marco de las políticas, convenciones y prácticas establecidas por la comunidad. Los artículos de LUGs tienen dos problemas: a) no tienen relevancia aparente y b) en su mayoría son artículos de autopromoción.

Definitivamente, no se considera relevante para una enciclopedia un artículo que trate sobre grupos de música, empresas, organizaciones o personajes que carezcan de conocimiento público.

Casos comunes de irrelevancia enciclopédica, en WP:RE

Es falaz utilizar una encuesta para validar un argumento, sin embargo, sirve como herramienta para conocer tendencias y sacar conclusiones. Hace algunos años se realizó una encuesta en Wikipedia en español para determinar qué temas suelen carecer de relevancia enciclopédica, y se concluyó lo siguiente respecto a las instituciones o clubes sociales que no trasciendan mas allá de una ciudad:

Una institución o club social no es relevante si solo es trascendente en una ciudad. Las excepciones pueden venir de ejemplos que se relacionen con temas muy trascendentales, o en ciudades muy grandes donde la importancia de la institución sea altamente considerable.

¿Por qué borran el artículo de un LUG y no el artículo del Teto Medina?

Este es un argumento muy utilizado en las consultas de borrado de Wikipedia.

En este momento hay muchos artículos que probablemente no deberían existir en Wikipedia, y hay muchos otros que actualmente no existen que sí deberían estar. Al afirmar eso [...] no estás argumentando la relevancia enciclopédica del artículo. Y eso es lo que se está discutiendo.

De hecho, si ese artículo no es enciclopédicamente relevante no sólo no debes justificarte en otros para apoyar tu argumento, sino que puedes colaborar con Wikipedia, y aclarar su relevancia para comprobar si corresponde que sea borrado.

WP:QUEHAYDE

Hay artículos de LUGs en la Wikipedia en inglés

Este es otro ejemplo del argumento falaz denominado como generalización apresurada. En este momento hay muchos artículos que probablemente no deberían existir en ninguna Wikipedia, y hay muchos otros que actualmente no existen y que sí deberían estar. Es por ello que el hecho de que un artículo no haya sido borrado todavía o no exista aún en otra Wikipedia no significa que no deba borrarse o mantenerse.

Si por el contrario el artículo ha sido ya creado y se ha discutido su borrado en otra Wikipedia ha de tenerse en cuenta que el contenido de Wikipedia en español se rige por las políticas de Wikipedia en español y se organiza de lo general a lo concreto en base las circunstancias de Wikipedia en español. Incluso si dos artículos fueran completamente iguales, argumentar como motivo que dichos artículos han sido borrados o mantenidos en otra wikipedia es un argumento falaz, no sólo ya porque otras wikipedias se encuentran en una situación distinta y poseen políticas diferentes al respecto, sino porque pueden estar tan equivocadas como nosotros.

WP:ESA

¿Por qué Wikimedia Argentina elimina artículos de LUGs?

En algunas listas de correo leí que Wikimedia Argentina está detrás de una “caza de brujas” contra el software y la cultura libres:

Con la ola de borrados de páginas relacionadas a la comunidad de Software Libre y otras actitudes despreciables de Wikimedia Argentina para con la comunidad, creo que hay que pensar un poco antes de seguir dando respaldo a esta organización.

Alguien muy enojado en la lista de Python Argentina

Los wikipedistas son autónomos y actúan libremente como usuarios de Wikipedia, no como miembros de Wikimedia Argentina. Wikimedia Argentina no tiene ninguna responsabilidad en las acciones de los wikipedistas.

Wikipedia tiene algo contra nosotros

Extraoficialmente se comenta que existe cierta animosidad en contra de los usuarios de Software Libre que participan en Wikipedia.

Alguien en la lista de CaFeLUG1

Los wikipedistas más experimentados suelen buscar artículos de la misma temática cuando hallan artículos sin relevancia aparente, generalmente para interiorizarse en el tema  o para comparar fuentes y referencias.

Sucede que, al hacer esto, a veces encontramos más artículos sin relevancia aparente, y ahí es cuando pasan cosas raras, como cuando se borraron masivamente artículos de actores de doblaje:

No sé bajo que verdad se esconda esta persona, ya que solo responde a un seudónimo y no da la cara con su verdadera identidad, ni los verdaderos motivos para hacer esto. Es una vergüenza que este tipo de personas odien la libertad de expresión, de información, y más penoso es para nosotros permitir que estos “redentores” de la humanidad sigan haciendo de las suyas… Estas personas son los que desprecian el trabajo de los demás y no aprecian el esfuerzo de unos y otros.

Un actor de voz mexicano muy enojado

No es la primera vez que nos dicen estas cosas (y no creo que vaya a ser la última). Si creen que en Wikipedia odiamos la libertad de expresión y de información, les recomiendo leer WP:NOES, particularmente “Lo que la comunidad de Wikipedia no es

1- Edité este post usando Mozilla Firefox en mi Ubuntu 9.10. Este blog corre gracias a WordPress, en un servidor Apache, con una base de datos MySQL y en un sistema operativo GNU/Linux. ¿No es irónico que yo, usuario de Wikipedia en español desde hace 4 años, esté en contra del Software Libre y de sus usuarios?

La cultura de la supervisión y la creatividad

La fuente de productividad más importante en la economía de la información es la creatividad, y no es posible crear algo interesante si la premura de tiempo es constante o debe realizarse de una forma regulada de nueve a cinco. De modo que, aun cuando sea sólo por razones estrictamente económicas, es importante permitir la presencia de la dimensión lúdica y de los estilos individuales de creatividad dado que, en la economía de la información, la cultura de la supervisión acaba por volverse con suma facilidad en contra de los objetivos ambicionados.

Pekka Himanen en “La ética del hacker y el espíritu de la era de la información

“Odio que las empresas traten a sus empleados como niños”

Les recomiendo un interesantísimo artículo de Jason Fried1, CEO de 37signals.

Los empleados vienen a la oficina cuando quieren, o de lo contrario trabajan desde sus casas. No creo en la semana laboral de 40 horas, así que dejamos esa boludez sobre estar en algún lugar cierta cantidad de horas. No tengo idea cuántas horas trabajan mis empleados — sólo sé que cumplen con su trabajo.

Me molesta bastante que la definición de éxito haya cambiado de ganancias a seguidores, amigos y suscriptores. Esta mierda no significa nada. Los chicos salen de la facultad pensando “quiero crear el próximo YouTube o Facebook”. ¿Si un restaurante sirve más comida que los demás pero pierden plata en cada cena, es un negocio exitoso? No. Pero en Internet, por alguna razón, si tenés más usuarios que los demás, sos exitoso. No, no lo sos.

En el mundo de los negocios, las personas son propietarias — tienen miedo de compartir.

Raramente tenemos reuniones. Las odio. Son una gran pérdida de tiempo, y son costosas. No es una hora: son 10, porque arrastrás a 10 personas lejos de su verdadero trabajo

Odio que las empresas traten a sus empleados como niños. Bloquean Facebook o YouTube porque quieren que sus empleados trabajen ocho horas diarias. Pero en vez de obtener más productividad, obtenés frustración. ¿Cuál es el punto? Mientras el trabajo se cumpla, no me importa lo que la gente hace durante el día.

1 Las ideas son de Jason, pero lo escribió Liz Welch

Me encanta recibir “buenas noticias” (con Python)

Acá les dejo un pequeño programa en Python que busca “buenas noticias” en los feeds RSS de Clarín, InfoBAE y La Nación.

Es altamente configurable (pueden agregar o quitar palabras clave y feeds editando FEEDS y KEYWORDS).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
 
import feedparser
import re
 
FEEDS = {
    u'Clarín': 'http://www.clarin.com/diario/hoy/um/sumariorss.xml',
    u'InfoBAE': 'http://www.infobae.com/adjuntos/html/RSS/hoy.xml',
    u'La Nación': 'http://www.lanacion.com.ar/herramientas/rss/index.asp',
}
 
KEYWORDS = ['muerto', 'caos', 'inseguridad']
 
def main():
    regexps = [re.compile(keyword, re.IGNORECASE) for keyword in KEYWORDS]
    for feed_name, feed_source in FEEDS.iteritems():
        for entry in feedparser.parse(feed_source).entries:
            for r in regexps:
                if r.search(entry.title):
                    print '%s: %s - %s' % (feed_name, entry.title, entry.link)
                    break 
 
if __name__ == '__main__':
    main()

Acá tienen unos resultados de ejemplo:

1
2
3
4
5
6
7
mahadeva@blue:~$ python buenasnoticias.py
InfoBAE: Un muerto y miles de evacuados por una explosión en Rusia - http://www.infobae.com/mundo/484082-101275-0-Un-muerto-y-miles-de-evacuados-por-una-explosión-en-Rusia
La Nación: Varios muertos en Rusia tras una explosión en un arsenal militar - http://www.lanacion.com.ar/nota.asp?nota_id=1199099
Clarín: Inseguridad: en medio de los cruces, el oficialismo se despega de D'Elía - http://www.clarin.com/diario/2009/11/13/um/m-02040147.htm
Clarín: 12:35 - Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm
Clarín: Otro choque en la General Paz provocó un caos en el tránsito - http://www.clarin.com/diario/2009/11/13/um/m-02040083.htm
Clarín: Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm

Cómo estar menos ocupado en un mundo muy, muy ocupado

A través de tweet de @eromirou llegué a “How to be less busy in a busy busy world” de Leo Babauta. Este fragmento me parece genial:

La mayoría de nosotros estamos bastante ocupados, prácticamente todos los días.

A algunos le gusta que así sea — estar ocupado es casi un símbolo de status, ya que demuestra que sos importante, productivo y triunfador. Si estás en una reunión importante enviando mails con tu Blackberry y haciendo llamadas, debés ser importante, no?

Yo digo que deberíamos rechazar ese jueguito de quién es el que está más ocupado. Deberíamos dejar esa idea. Deberíamos decir “prefiero encontrar paz mental, ser capaz de relajarme, de disfrutar de la vida, en vez de hacer lo contrario para ser ‘productivo’ y demostrarle a todo el mundo qué tan importante soy”.

OK, tal vez deberíamos decir algo más breve en su lugar. Por ejemplo, “no gracias”.

Por qué estar ocupado es un “cazabobos”?

Nunca terminás de estar ocupado. No vas a poder librarte de eso (a menos que hagas un gran esfuerzo), porque no hay un fin en la lista de quehaceres, los mails, los chats, las llamadas telefónicas, las reuniones y reuniones, y sí, más reuniones. Somos hamsters en una ruedita, corriendo sin un verdadero propósito, salvo para hacer feliz al jefe, para ganar plata o hacerle ganar plata a alguien… pero con qué fin?

La ruedita gira sin fin. Nunca hay un fin, porque no hay un destino.

Pero sabés qué? El viaje es el destino. Ya estamos ahí — lo que hacemos hoy es lo que nuestra vida es, de lo que se trata todo esto. Estar así de ocupado es el verdadero sentido de la vida? O hay algo más? Hay una vida mejor?

Creo que deberíamos hacer cosas más valiosas. Reemplazar lo urgente por lo importante. Y aun así, si estamos haciendo cosas importantes, no deberíamos llenar cada minuto con cosas importantes. Necesitamos aprender a relajarnos, a ser felices, a disfrutar de la vida. De otra forma, no vale la pena vivir.

Necesitamos redescubrir cómo es no hacer nada, a quedarse quieto, a disfrutar del silencio. Necesitamos poner más espacio entre las cosas en vez de apretarlas todo el tiempo. Dejemos de estar ocupados, y empecemos a ser felices.

O Canada!

Una típica casa en Guelph

Una casa típica en Guelph

¿Qué impresión me llevé de Guelph?

  • Es una ciudad muy tranquila. Como para volver loco a un porteño por la falta de quilombo
  • Pocos autos. La mayoría se mueve a pie o en bicicleta. +1 porque no me gustan los autos
  • Mucho verde. Son muy respetuosos de las políticas locales de protección al medio ambiente. No hay basura en las calles. En todas las casas hay bolsas para separar los residuos orgánicos. +1 por proteger el medio ambiente
  • Hay pocos fumadores. +1
  • Les gusta la cerveza: La típica salida nocturna es ir a los pubs. Toman una bocha. +1 porque tienen como 50 “birras” distintas (y las que probé están buenísimas)
  • Hay mucha policía: demasiada para mi gusto. Es la ciudad en donde se entrenan a los policías en Canadá. Cada tanto reparten palos entre los estudiantes de la universidad local. -1
  • La gente es copada: todo el mundo te saluda, aunque no te conozca. +1
  • Comida que se deja comer. La carne es bastante buena. No tienen asado pero hacen barbecues que garpan bastante. Por U$ 6 te comprás un burrito tamaño baño. +1 por copados con la comida
  • El deporte nacional es el hockey sobre hielo. Un embole. Les gusta el fútbol (soccer) pero no sobresalen internacionalmente
  • Están cerca de Toronto. Siempre es bueno estar cerca de una ciudad grande (pero no vivir en ella). +1
  • El transporte es caro. Pagué U$ 20 por un taxi desde la oficina al hotel. El tren y el micro a Toronto son carísimos (U$ 23). -1
  • Bandas locales. Le dan mucha importancia a la música. Frecuentemente organizan fiestas y recitales con bandas de la ciudad y alrededores. +1
  • Casi nadie habla español. Conocí sólo a dos personas que lo hablan: un argentino de Boedo que manejaba el shuttle del hotel y un estudiante nicaragüense (con gorra del EZLN) que hacía wraps vegetarianos cerca de la oficina

En conclusión: la ciudad está muy buena y fue una experiencia positiva. Quizás vuelvo el año que viene. Por lo pronto, en diciembre me voy a ver qué onda Perú (quizás me cruzo con la pequeña Wendy!)

Mostrando búsquedas de Twitter en una página web con jQuery

El programa consta de dos partes: el contenedor de resultados y el script.

Contenedor de resultados

Se trata del elemento HTML donde se mostrarán los resultados de una búsqueda. Los términos de búsqueda se establecen en el atributo title.

Por ejemplo, si quisiéramos mostrar los resultados del tag #obama:

1
<div class="twitter_search" title="#obama"></div>

Podés crear todos los contenedores que quieras en la misma página, en el lugar que desees:

1
2
<div class="twitter_search" title="#python"></div>
<div class="twitter_search" title="#jquery"></div>

El script

Son las instrucciones JavaScript del programa que se encargará de todo el trabajo: obtendrá los términos de búsqueda, solicitará los resultados a través de la API de Twitter y mostrará los resultados en el navegador.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Number of tweets to show for each column
var MAX_RESULTS = 20;
function twitter_search() {
	var url = 'http://search.twitter.com/search.json?callback=?';
	// Iterating over the different search columns
	$('.twitter_search').each(function() {
		var container = $(this);
		// Search terms are specified in the 'title' attribute
		var search = container.attr('title');
		if (search) {
			// Showing column title
			if (container.siblings('h1').length == 0) {
				container.parent().prepend('<h1>' + search + '</h1>');
			}
			var since_id = 0;
			if (container.children().length) {
				// Retrieve results since this id
				since_id = container.children(':first').attr('id').replace('#', '');
			}
			// Request the results
			$.getJSON(url, {'q': search, 'since_id': since_id}, function(data) {
				// Processing those results, if any
				if (data.results.length) {
					for (i in data.results.reverse()) {
						var r = data.results[i];
						// Creating the result container
						var div = $('<div id="#' + r.id + '"></div>');
						// Don't show this element now
						div.hide();
						// Adding some styles through .twitter_result
						div.addClass('twitter_result');
						// Adding user's image
						div.append('<img src="' + r.profile_image_url + '" alt="' + r.from_user + '" />');
						// Adding username
						div.append('<a href="http://twitter.com/' + r.from_user + '">' + r.from_user + '</a>');
						// Adding tweet
						div.append('<span>' + r.text + '</span>');
						// Adding corners
						div.corner();
						// Adding this result to the main container
						container.prepend(div);
						// Effect
						div.slideDown('slow');
					}
				}
				// Removing old tweets
				if (container.children().length > MAX_RESULTS) {
					// Negative index
					to_remove = MAX_RESULTS - container.children().length
					container.children().slice(to_remove).each(function() {
						$(this).slideUp();
					});
				}
			});
		}
	});
};
 
$(document).ready(function() {
	// Initial search 
	twitter_search();
	// Refresh the results every 5 seconds
	setInterval("twitter_search();", 5000);
});

Acá pueden ver una demostración funcional del script: Twitter Search + jQuery (actualizado marzo de 2010).

Aclaraciones de la demo:

  • Casi no hay consumo de bandwidth de nuestro servidor, porque estoy usando jQuery 1.3.2 desde Google y es el navegador del usuario quien se encarga de hacer el request de búsqueda a la API de Twitter
  • En la demo los resultados se actualizan automáticamente cada 5 segundos (setInterval("twitter_search();", 5000))
  • Sigo una estructura FIFO (gracias al parámetro since_id de la API). Esto significa que iré agregando nuevos resultados en la cabecera mientras remuevo los más antiguos
  • La demo es XHTML 1.0 Transitional

Python práctico: usando timedelta para calcular días restantes

El 25 de diciembre me voy a Perú con unos amigos, y quiero saber cuántos días faltan. Puedo contar los días del calendario, buscar en Google alguna herramienta para realizar este tipo de cálculos, o sino…

>>> from datetime import datetime
>>> td = datetime(2009, 12, 25) - datetime.now()
>>> td.days
94

Más rápido que buscar en Google, ¿no? ;-)

Consultando Crunchbase con Python

Por mi trabajo, siempre estoy pendiente de lo que sucede en Crunchbase (de hecho, estoy suscripto a su feed de páginas recientes). Con tantas empresas y personas yendo y viniendo por Twitter, se transformó en una fuente de consulta permanente.

¿Puedo consultar Crunchbase con Python? La respuesta es obvia :-)

Crunchbase tiene una API muy interesante que devuelve resultados en formato JSON. Pueden encontrar documentación sobre su uso en crunchbase-api.

Para este programa estoy usando la librería simplejson (sudo apt-get install python-simplejson)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys, urllib, simplejson
 
api = 'http://api.crunchbase.com/v/1/search.js?%s'
 
def main():
    if len(sys.argv) >= 2:
        q = ' '.join(sys.argv[1:])
        source = urllib.urlopen(api % urllib.urlencode({'query': q}))
        results = simplejson.loads(source.read())
        if results['results']:
            for r in results['results']:
                name = r.get('name')
                if not name:
                    name = ' '.join([w.capitalize() \
                        for w in r['permalink'].split('-')])
                print '%s (%s): %s' % (
                    name.strip(),
                    r['namespace'].capitalize(),
                    r['crunchbase_url'],
                )       
        else:
            print 'No results for "%s"' % q
    else:
        print 'Usage: python %s <keyword(s)>' % sys.argv[0]
 
if __name__ == '__main__':
    main()

Aquí tienen algunos resultados:

mahadeva@blue:~$ python crunchbase.py
Usage: python crunchbase.py
mahadeva@blue:~$ python crunchbase.py popego
Popego (Company): http://www.crunchbase.com/company/popego
Santiago Siri (Person): http://www.crunchbase.com/person/santiago-siri

El programa en sí no es muy cómodo de usar (para eso existen los add-ons de de Firefox ;-) ), pero es un buen punto de partida para utilizar, por ejemplo, como una aplicación de Django, o un bot que interactúe con Twitter.

You’ve got email! (versión Python)

Acá les muestro un simple notificador de correo con Python.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys, libgmail
 
def main():
    if len(sys.argv) >= 3:
        g = libgmail.GmailAccount(sys.argv[1], sys.argv[2])
        try:
            g.login()
        except libgmail.GmailLoginFailure:
            print 'Login incorrecto'
        else:
            unread = g.getUnreadMsgCount()
            if unread:
                import pynotify, gtk
                pynotify.init('Gmail notify')
                pynotify.Notification('Gmail', '%d mensajes sin leer' % unread,
                    gtk.STOCK_DIALOG_INFO).show()
 
if __name__ == '__main__':
    main()

En la primera línea estoy importando el módulo libgmail porque uso Gmail. Si usan Ubuntu, pueden instalar esta librería con sudo apt-get install python-libgmail.

Alternativamente pueden obtener un XML en formato Atom a través de https://mail.google.com/mail/feed/atom (van a necesitar algo como urllib2.HTTPPasswordMgrWithDefaultRealm).

Como es un script que se ejecuta desde la línea de comandos, sys.argv[1] será mi nombre de usuario y sys.argv[2] mi contraseña.

Si en mi cuenta hay correo no leído (línea 12), importo pynotify y gtk (porque uso Gnome) para mostrar un mensaje en mi pantalla:

notificacion

Dos cosas a tener en cuenta:

  • En el ejemplo utilizo sys.argv para obtener el nombre de usuario y la contraseña, pero tengan en cuenta que esa información queda almacenada en ~/.bash_history o en otros logs del sistema. Es preferible definir dos variables dentro del script
  • Pueden hacer que el script corra periódicamente utilizando cron. Por ejemplo: */1 * * * * /usr/bin/python2.5 /path/al/script.py usuario@gmail.com contraseña