miércoles, 9 de marzo de 2011

Funcionalidades no documentadas de la API de Facebook

Facebook hacks

Jugando un poco descubrí una funcionalidad no (muy bien) documentada de la API de Facebook conocida como Facebook Graph API. Realmente es un detalle que me hacía falta utilizar en un proyecto para disminuir el número de peticiones que se hacen a los servidores de Facebook. Cuando leí la documentación se aborda la manera en que la API permite hacer este tipo de cosas e incluso se muestran ejemplos de peticiones sencillas. Les invito a leer este artículo y sabrán de una forma de optimizar las peticiones que se realizan a la API de Facebook y, por consiguiente, mejorar el desempeño de las aplicaciones. Si desea estar al tanto de otros artículos similares, Usted puede suscribirse a este blog mediante RSS.

Lo más frecuente, al utilizar la API antes mencionada, es hacer peticiones para obtener los datos de objetos individuales (e.g. usuarios) o de sus conexiones (e.g. las páginas que le gustan a un usuario). En la documentación se puede encontrar información acerca de cómo hacer esto (y por brevedad asumiré que Usted ya está familiarizado con los detalles, pero si no es así, solícitelo en un comentario y le dedicaré otro artículo a esta materia ;). Solo menciono que para lograrlo se utilizan URLs del tipo https://graph.facebook.com/<ID de objeto> (e.g. la información de la página de la Coca-Cola sería estaría disponible en https://graph.facebook.com/cocacola ).

Sin embargo, a veces es necesario solicitar la misma información para múltiples objetos (e.g. los mensajes de estado de un grupo de usuarios). Si se sigue el procedimiento anterior en este caso se necesitaría efectuar varias peticiones. La API permite hacer esto eficientemente. Por ejemplo, si se necesitara obtener los datos de la página antes mencionada y los de Bret Taylor entonces con una única petición a https://graph.facebook.com/?ids=cocacola,btaylor ya se podrían obtener todos estos datos.

Digamos que queremos obtener los mensajes que varios usuarios han publicado en su status. Ya entonces no resulta tan evidente lo que hay que hacer debido a que la URL para obtener el de un solo usuario es e.g. https://graph.facebook.com/btaylor/statuses . La duda entonces consiste en saber donde situar los IDs de los objetos.

Pues bien, digamos que desea obtener los mensajes míos y de Bret Taylor en una sola petición, entonces la URL sería así https://graph.facebook.com/statuses?ids=btaylor,olemis , es decir se mantiene el tipo de conexión al final y se añaden los IDs de los objetos como parámetros.

Ya lo sabe, si antes no le resultaba evidente, aquí tiene los ejemplos que no aparecen en la documentación oficial. Espero que les sea útil el consejo para optimizar sus aplicaciones. Pregunte cualquier duda, siempre podrá contar con mi ayuda, simelo pide.

miércoles, 9 de febrero de 2011

No más Yoga ... ¡RON!

Yoga vs Ron

¡Estudios confirman que beber RÓN trae los mismos beneficios que el yoga! ¿No me creen? Más les vale empezar a practicar, a mí me va bien. :D

lunes, 17 de enero de 2011

Slitaz - Una distribución GNU/Linux minimalista

Logotipo de Slitaz

Recientemente tuve que utilizar una laptop con problemas de hardware que impedían que arrancaran correctamente los LiveCD de Knoppix, Ubuntu y varias otras distribuciones (que hasta ahora no me habían fallado). Tampoco logré que arrancara un CD de instalación de Windows. Fue entonces cuando me decidí a buscar una distribución minimalista para tratar de resolver el problema, y entonces encontré a Slitaz. Esta es una distribución de GNU/Linux que incorpora un sistema operativo completo, con escritorio OpenBox y navegador de internet Midori (entre otras herramientas básicas ;o) en solo 30MB. Simelo preguntan les recomiendo que lo tengan a mano pues podría ser muy útil si necesitan reparar su PC.

viernes, 7 de enero de 2011

Dos años y sigo blogueando ...

Aunque no lo parezca han pasado ya dos años desde que comencé a publicar artículos en este blog. Quería agradecerles a todos aquellos que lo han visitado desde más de 80 países en unas 16 regiones o subcontinentes. Hasta ahora hemos hablados de muchos temas , así que les invito a conocer cómo es que Ustedes, los lectores, han reaccionado ante los contenidos que aquí se publican. Para mí es un placer saber que Ustedes tienen un lugar para este blog dentro de su tiempo (libre); y ya saben, todo es posible ... SIMELO piden.

Como se puede apreciar las visitas son más frecuentes desde Sudamérica, Europa, Centroamérica y Norteamérica. Supongo que esta distribución se deba a los lazos culturales y al conocimiento del idioma español.

Los artículos más populares (al menos los que más han accedido directamente ;o) han sido los siguientes :

Página Pageviews Unique pageviews Average time
1. / 1,198 1,780 00:05:37
2. GeneXus: Convirtiendo aplicaciones de escritorio a web 366 320 00:02:25
3. La cara oculta de Fibonacci (en Python) 351 297 00:04:10
4. No me gustan los templates de Django ... 255 208 00:03:58
5. Comandos : Pipe Viewer ... ¿Qué está pasando por esta tubería? 207 171 00:03:06
6. Tutorial: Cómo crear enlaces directos en Windows con Python 190 156 00:00:54
7. Añadir gadgets de Google en entradas (artículos) de Blogger 169 130 00:02:44
8. Dibujando figuras geométricas con Eukleides y LATEX 144 121 00:02:37
9. Introducción a la API de Google Analytics 138 111 00:03:17
10. Microsoft firma acuerdo con la PSF. ¿Python para Visual Studio? 134 111 00:07:40

Les muestro más gráficos que ilustran que todavía debo ser más sistemático si quiero alcanzar los niveles de audiencia que tuve en marzo del 2010.

¿Y qué pasará ahora?

Este fin de año 2010 ha sido una temporada en la que se puede decir que fui muy feliz. Un día me senté a releer los artículos y me he dado cuenta de que puedo hablarles más de mi lado no tecnológico. Así que tengo en mente aumentar la frecuencia de las entradas que traten temas más relajados y de esparcimiento. Como siempre, simelo preguntan, les digo que espero que Ustedes sigan ahí escuchando ... ¡ La invitación esta hecha !

jueves, 30 de diciembre de 2010

Barça es todo CORAZÓN

Xavi inauguró el marcador

Si todavía Ud. tenía dudas de que los catalanes sabían bailar, pregúntele al  Real Madrid. Ni Cristiano Ronaldo, ni ninguna otra de sus estrellas pudo detener la sinfonía. Todos se seguían muy bien el ritmo: era el mismo compás que escuchaban las últimas 5 veces que enfrentaron a este equipo; era la sinfonía de Guardiola. Los corazones de todos los jugadores, del público, ... todo estaba bien coordinado para lograr la resonancia que sentimos en el Camp Nou. Mourinho estaba muy fatigado (por decirlo de alguna forma ...) y no sabía cómo bailar este vals (¿o era una polka?): nada de paseitos, nada de reclamos a los árbitros, ni picardías ... todo era en vano. Y es que el  Barça quiere el balón y el afecto es recíproco. Después de un favorable 6-2 en el encuentro previo ahora el equipo merengue se llevo una manito.

Mourinho cariacontecido

Pero esto no bastaba y volvimos a la carga. Próxima víctima el  Rubin Kazan. Esta vez se rompió el hechizo. Lo que no lograron los titulares años atrás, lo supieron hacer los suplentes esta vez. Porque el  Barça es todo talento; sin dudas el relevo está asegurado. Esta vez la máquina no quiere parar. Para no dejar lugar a dudas, ya lejos del Camp Nou, la visita a la  Real Sociedad también rindió sus frutos. De allí nos llevamos otra manito. Sí, necesitábamos DOS manos porque así una lava la otra, así como Messi también hizo DOS goles.

Celebración de Xavi Hernández Messi, Xavi e Iniesta aspirantes al Balón de Oro

Lo que muchos todavía no entienden es que  Barça es puro orgullo. Es por eso que son la base del equipo de España, actual campeón del mundo; es por eso que la CANTERA otra vez VENCIÓ a la CARTERA; es por eso que provienen de allí los tres  candidatos al Balón de Oro (aunque confieso que prefiero a Schneider o Forlán en vez de Iniesta); es por eso que todo el mundo está de fiesta ... simplemente ES QUE EL BARÇA ES TODO CORAZÓN.

jueves, 23 de diciembre de 2010

Usar bindings de XAML para mostrar valores de tipos enumerados en controles WPF

Microsoft.NET

Este artículo es breve y consiste en una respuesta a  un pequeño tutorial que publicó mi amigo Feston en  su blog. Su solución consiste en utilizar el método GetValues para obtener un arreglo con todos los valores definidos para el tipo de datos en cuestión. Sin embargo, ¿realmente es necesario escribir líneas de código para lograr esto? Continúe leyendo y conocerá una alternativa que logra el mismo efecto, pero sólo utiliza el fichero XAML (que es dónde debería especificarse este tipo de cosas).

El procedimiento es simple (qué otra cosa podría decir :). Comencemos por crear una aplicación WPF sencilla (menú File > New > Project ... y selccionar WPF Application). El Visual Studio mostrará el editor WPF con una ventana vacía. Para hacer más simple el ejemplo, editaré el fichero Window1.xaml.cs para que luzca de la forma siguiente. Esto no implica que haya pérdida de generalidad en la discusión, puesto a que los pasos son similares si el tipo enumerado se define en otro fichero o assembly.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace EnumNamespace {
    public enum MyEnum {Value1, Value2, Value3, Value4}
}

namespace WpfEnumBinding {
    public partial class Window1 : Window {
        public Window1() {
            InitializeComponent();
        }
    }
}

Una vez hecho esto, se añade en el fichero XAML una referencia al namespace dónde se encuentra el tipo enumerado y otra al namespace System (seguro que el IntelliSense ayudará mucísimo ;o). Luego se define un recurso del tipo ObjectDataProvider que permita hacerle binding al valor que devuelve el método GetValues. Posteriormente se utiliza la extension StaticResource para hacer referencia al valor en cuestión. Si utilizamos un combobox, el fichero XAML queda de la siguiente manera:

<Window x:Class="WpfEnumBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:EnumNamespace="clr-namespace:EnumNamespace"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ObjectDataProvider x:Key="MyEnumResource" 
                            MethodName="GetValues" 
                            ObjectType="{x:Type System:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="EnumNamespace:MyEnum" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ComboBox ItemsSource="{Binding Source={StaticResource MyEnumResource}}"/>
    </Grid>
</Window>

... y la aplicación luce así

Espero que les sea útil esta sugerencia, al menos para aplicar en otras circunstancias parecidas los conocimientos adquiridos. Si le gustó este artículo le digo que los demás serán igual de interesantes, por lo que le invito a  suscribirse a este blog para que este al tanto de otros trucos similares. No lo olvide simelo pide siempre habrá una respuesta a esa inquietud o duda que Usted tenga del mundo de la informática y la programación.

Moropo: Bind de un tipo Enum a un combobox en C#

martes, 20 de julio de 2010

Dibujando figuras geométricas con Eukleides y LATEX

Problema 4 IMO 2007 Hanoi

Regreso después de unas vacacaciones durante las cuales la nostalgia me hizo regresar a la solución de ejercicios de las Olimpiadas Internacionales de Matemáticas. Esta vez les narraré cómo obtuve con ayuda de Eukleides la figura de uno de los problemas de geometría que resolví. La necesitaba para publicar la demostración en un nuevo blog de Soluciones de Olimpiadas, donde trataré de documentar mis experiencias en la lucha constante que ha representado la resolución de estos ejercicios tan complejos. ¡Ojalá hubiéramos tenido una herramienta como esa en mis tiempos! Espero que les sea útil a ustedes también. Me siento satisfecho puesto a que hace más de siete años que no intentaba resolverlos, así que todavía estoy en forma :o). Usted puede suscribirse a este blog si desea estar al tanto de otros temas igual de interesantes. Si lo desea también puede recibir automáticamente las respuestas a los ejercicios que se irán publicando en el nuevo blog de Soluciones de Olimpiadas. Si Usted desea también puede solicitar permisos para publicar sus propias soluciones, o artículos relacionados con estos eventos.

¿Qué es Eukleides?

Existen varias alternativas para lograr que una computadora dibuje figuras geométricas en el plano. LaTeX es una de ellas. Sin embargo, en gran parte de los casos hay que emplear herramientas diseñadas desde el punto de vista del funcionamiento interno de la computadora. En otros casos hay que especificar hasta el más mínimo detalle para obtener una figura medianamente comprensible. Todo esto dificulta el aprendizaje y la rápida familiarización de los usuarios con la herramienta, puesto a que se impone una nueva forma de pensar y a veces se necesita hasta realizar cálculos no siempre evidentes.

Eukleides es una herramienta genial que interpreta un lenguaje descriptivo para obtener representaciones de figuras de la geometría euclideana. Sus características permiten que se pueda obtener una figura conociendo solamente los conceptos matemáticos y las relaciones entre los puntos y las curvas que se mencionan en el ejercicio en cuestión. Resulta asombroso que el enunciado del problema se pueda traducir casi directamente para obtener la descripción de la figura. Utilicemos el mismo problema de geometría que resolví para ilustrar lo que estoy diciendo. Su enunciado es el siguiente :

Problema 4 - IMO 2007 (Vietnam). En un triángulo ABC la bisectriz del ángulo BCA y la circunferencia circunscrita al triángulo se cortan en R (R != C). Dicha recta corta a la mediatriz de BC en P y a la mediatriz de AC en Q . El punto medio de BC es K y el punto medio de AC es L . Demostrar que los triángulos RPK y RQL tienen áreas iguales.

A continuación representaré las condiciones del problema (resaltadas en negritas ;o) en el órden que van apareciendo en el enunciado de problema. Solo tengan en cuenta que utilizo la sintaxis de la versión 1.0.3 de eukleides (después explico más al respecto ;o)

A B C triangle

l = bisector(B, C, A)
c = circle(A, B, C)
C R intersection(l, c)
P = intersection(l, perpendicular(segment(B, C), midpoint(segment(B, C)) ))
Q = intersection(l, perpendicular(segment(A, C), midpoint(segment(A, C)) ))
K = midpoint(segment(B, C))
L = midpoint(segment(A, C))

draw(A, B, C)
draw(l)
draw(c)
draw(segment(K, P), dashed)
draw(segment(L, Q), dashed)

draw("$A$", A, -130:)
draw("$B$", B, -50:)
draw("$C$", C, 130:)
draw("$P$", P, 0.1, -160:)
draw("$Q$", Q, 0.1, 50:)
draw("$R$", R, -130:)
draw("$K$", K, 50:)
draw("$L$", L, 130:)

color(gray)
mark(A, C, R)
mark(B, C, R)

Esto es todo lo que se necesita. Como se puede apreciar el lenguaje es declarativo y resulta increíble la similitud con el enunciado del problema. También hay que resaltar que hay comandos específicos para dibujar y para denotar los puntos y rectas que aparecen en la figura. Con ellos se pueden obtener distintos estilos y formas.

Para obtener la figura incluimos en texto anterior en el fichero imo2k7pb4.euk y luego instalamos eukleides y sus dependencias (Eukleides utiliza las extensiones PSTricks de LaTeX). En Debian o Ubuntu solo está empaquetada la la versión 1.0.3 de eukleides, pero la la versión 1.5.4 de eukleides cubre las mismas necesidades con un lenguaje más expresivo. Sin embargo es posible encontrar la versión 1.5.4 empaquetada en sid, por lo que quizás pronto la tendremos en los repositorios. La instalación se haría de la siguiente manera :

$ sudo apt-get install eukleides ; XXX dependencias

Después se utiliza el comando euk2edit y se especifica el formato de salida que se desea obtener (en este caso un fichero PostScript)

$ euk2edit imo2k7pb4.euk ps

El fichero imo2k7pb4.ps contiene ahora la figura en el formato deseado. Para conocer todos los formatos que se pueden obtener, basta con leer la salida del comando

$ pstoedit -help

Conclusiones

La herramienta también permite la traducción de los comandos a varios idiomas. El fichero anterior podría ser escrito también en español (si hubiera una traducción ;o) de esta forma

A B C triangulo

l = bisectriz(B, C, A)
c = circulo(A, B, C)
C R interseccion(l, c)
P = interseccion(l, perpendicular(segmento(B, C), puntomedio(segmento(B, C)) ))
Q = interseccion(l, perpendicular(segmento(A, C), puntomedio(segmento(A, C)) ))
K = puntomedio(segmento(B, C))
L = puntomedio(segmento(A, C))

dibuja(A, B, C)
dibuja(l)
dibuja(c)
dibuja(segmento(K, P), discontinuo)
dibuja(segmento(L, Q), discontinuo)

dibuja("$A$", A, -130:)
dibuja("$B$", B, -50:)
dibuja("$C$", C, 130:)
dibuja("$P$", P, 0.1, -160:)
dibuja("$Q$", Q, 0.1, 50:)
dibuja("$R$", R, -130:)
dibuja("$K$", K, 50:)
dibuja("$L$", L, 130:)

color(gris)
resalta(A, C, R)
resalta(B, C, R)

Si consideramos que existe una herramienta visual llamada xeukleides, entonces ¡hasta un niño podría hacer esto y obtener sus figuras! . Espero que les haya gustado este artículo. Suscríbase a este blog si desea continuar este viaje para descubrir las bondades de los diferentes software libres. No olvide que si Usted desea también puede solicitar permisos para publicar sus propias demostraciones en el blog de Soluciones de Olimpiadas, o artículos relacionados con estos eventos. La invitación está hecha para recibir automáticamente las respuestas a los ejercicios que se irán publicando allí.

viernes, 28 de mayo de 2010

Pentagramas para la web

Notación musical en el Canvas

¿Que tal si se pudiera escribir música en una notación como la que se muestra a continuación y que fuera representada visualmente cómo muestra la figura? Mohit Muthanna ha implementado la noción de pentagrama utilizando el elemento canvas de HTML5 (algo que Internet Explorer no implementará). La versión actual es reciente aún, y todavía necesita un DSL para escribirla. Jono de Mozilla trabajó en un simple DSL basado en texto que resultó muy interesante porque permite hacerlo con solo modificar el texto en un elemento textarea. Si desea conocer los detalles continúe leyendo hasta el final. Le invito a suscribirse mediante RSS si desea estar al tanto de otras noticias del mundo de la informática, y las tecnologías web.

score {
  title: Hip Tune
  artist: Hip Person
  bar { v8 C4 D4 E4 F4 (C4 E4 G4) } 
  bar { v8 C4 D4 E4 F4 (C4 E4 G4) } repeat 3
}
 

La API luce actualmente de la siguiente forma:

function VexNotationDemo1(b) {
    b = new Vex.Music.Artist(b, {
        scale:0.9, width:900
    });
    var c = b.CreateScore(),
        d = b.CreateScore();
    b.DrawScore(c);
    var e = GetBar1(b,c);
    b.DrawBar(e);
    e = GetBar2(b,c);
    b.DrawBar(e);
    e = GetBar3(b,c);
    b.DrawBar(e);
    e = GetBar4(b,c);
    b.DrawBar(e);
    c = GetBar5(b,c);
    b.DrawBar(c);
    b.DrawScore(d);
    c = b.CreateContinuingBarFrom(c,d);
    b.DrawBar(c);
    d = GetBar7(b,d);
    b.DrawBar(d)
}
    
function GetBar4_2(b,c) { 
    c = b.CreateBar(c);
    var d = c.AddLine();
    d.AddNote(b.CreateNote({keys:["f##/4"],duration:"h"}));
    var e = [];
    e.push(b.CreateNote({keys:["a##/4"],duration:"16"}));
    e.push(b.CreateNote({keys:["f##/5"],duration:"16"}));
    e.push(b.CreateNote({keys:["f##/5"],duration:"16"}));
    e.push(b.CreateNote({keys:["f##/5"],duration:"16"}));
    e.push(b.CreateNote({keys:["f#/4","a/4","f/5"],duration:"16"}));
    e.push(b.CreateNote({keys:["f#/4","a/4","f/5"],duration:"16"}));
    d.AddNotes(e);
    e = b.CreateBeam(e);
    d.AddBeam(e);
    e = b.CreateNote({keys:["db/4"],duration:"32"});
    var f = b.CreateNote({keys:["f#/4"],duration:"32"}),
        g = b.CreateNote({keys:["db/4"],duration:"32"}),
        h = b.CreateNote({keys:["f#/4"],duration:"32"});
    d.AddNote(e);
    d.AddNote(f);
    d.AddNote(g);
    d.AddNote(h);
    b = b.CreateBeam([e,f,g,h]);
    d.AddBeam(b);
    return c;
}
 

SVG podría ser también una buena opción para hacer esto. En cualquier caso sería genial tener un control que generara el audio a partir de la partitura, no creen?

miércoles, 26 de mayo de 2010

Control de usuarios personalizado con Apache y mod_authnz_external

Apache Software Foundation

A medida que pasa el tiempo me convenzo más de que es correcto separar la lógica de autentificación de los usuarios y el código de las aplicaciones web. En este artículo explicaré una alternativa para delegar estas tareas al servidor Apache, pero sin tener que escribir un nuevo módulo. Por fortuna existen muchas extensiones de propósito específico para hacer esto. Un ejemplo notable es mod-auth-pam, el cual expande las posibilidades pues se aprovecha toda la flexibilidad que ofrece la arquitectura Pluggable Authentication Modules. Pero por ejemplo, ¿qué hacer si ya tenemos una aplicación que brinda acceso a los usuarios de una forma muy particular y queremos reutilizar en nuevas aplicaciones ese método y los mismos datos? Continúe leyendo este artículo y encontrará la vía de solución. Notará que la configuración es relativamente fácil de hacer en sistemas GNU/Linux como Ubuntu . No olvide suscribirse a este blog si desea conocer más trucos del mundo de la informática.

¿Qué es mod_authnz_external?

Existen muchas extensiones de propósito específico para validar la identidad de los usuarios. La lista incluye a authn_alias, authn_anon, authn_dbd, authn_dbm, authn_default, authn_file, authnz_ldap, authz_dbm, authz_default, authz_groupfile, authz_host, authz_owner, authz_user, mod-auth-kerb, mod-auth-mysql, mod-auth-pgsql, mod-auth-plain, authcassimple-perl, authenntlm-perl, mod-auth-cas, mod-auth-openid, mod-auth-radius, mod-auth-sys-group, mod-authn-sasl, mod-authnz-external, mod-authz-unixgroup, webauth. El módulo mod_authnz_external es un módulo de Apache que permite autenticar los usuarios contra servicios externos. Sus ventajas consisten en que se puede utilizar para construir rápidamente infraestructuras de este tipo que sean seguros y fiables. Sin embargo hay que ser muy cuidadosos pues, si se utiliza mal, puede ser una fuente de vulnerabilidades. Esto se debe a que se delega todo el trabajo a un proceso externo que ejecuta un script configurado para este próposito. Además, debido a su diseño, no siempre es posible utilizarlo junto con autentificación del tipo Digest. Por tal razón frecuentemente se necesitaría transmitir las claves como texto plano. Una solución a este problema sería utilizar SSL. Pero, bueno, vayamos al grano ...

Seguridad web basada en los usuarios del sistema

Una de las aplicaciones más notables de este módulo es poder reutilizar la base de datos de usuarios locales del sistema para proteger una aplicación web, sin tener que exponer el fichero shadow. Para eso utilizaremos pwauth. Solo con unas pocas líneas ya es posible saber lo que hace

$ sudo apt-get install pwauth
$ sudo pwauth
myuser
mypassword
$ echo $?
0
$ sudo pwauth
myuser
wrong_password
$ echo $?
1

Como se puede observar el programa lee el usuario y la contraseña desde la entrada estándar y facilita el resultado a través del código de retorno del proceso (el valor 0 indica que los datos son correctos). Para ilustrar el resto del proceso, supongamos que tenemos una instancia de Trac corriendo con FastCGI. Para utilizaríamos unas líneas como las que aparecen a continuación:

ScriptAlias /trac /var/lib/trac/share/cgi-bin/trac.fcgi
<Location "/trac">
  Order allow,deny
  Allow from all
</Location>
ApacheConf

Para lograr nuestro objetivo solo debemos instalar el módulo y habilitarlo.

$ sudo apt-get install libapache2-mod-authnz-external
$ sudo ln -s /etc/apache2/mods-available/authnz_external.load /etc/apache2/mods-enabled/authnz_external.load

Luego procedemos a modificar el archivo de la siguiente forma.

# Registrar el método 'unix' para ejecutar `pwauth` e 
# interactuar a través de la entrada y salida estándar
DefineExternalAuth unix pipe /usr/sbin/pwauth   

ScriptAlias /trac /var/lib/trac/share/cgi-bin/trac.fcgi
<Location "/trac">
  Order allow,deny
  Allow from all

  # Autentificación básica
  AuthType Basic

  # Utilice un valor de su preferencia
  AuthName "swl"

  # El módulo `authnz_external` se hará cargo
  # de verificar la identidad de los usuarios
  AuthBasicProvider "external"

  # Para esta aplicación se utilizará el script identificado como 
  # 'unix' (ver la directiva `DefineExternalAuth` más arriba ;o)
  AuthExternal "unix"

  # Proteger el sitio (denegar acceso anónimo)
  require valid-user
</Location>
ApacheConf

¡Es así de simple! Espero que les sea útil en su quehacer cotidiano. Le sugiero suscribirse a este blog pues en próximos artículos podrán conocer cómo escribir su propio utilitario para validar los nombres de usuarios y las contraseñas.