Author Archive

Funciones anónimas recursivas

Posted on the septiembre 29th, 2009 under Programación Funcional by

lambda_lcHace un tiempo ya que estoy dando clases como ayudante en Paradigmas de Programación. En dicha cátedra se pretende que el alumno tenga una visión con la cuál contemple los problemas a resolver con el paradigma más adecuado. Hay cosas que modelarlas orientadas a objetos o en objetos con Smalltalk, son mucho más sencillas que pensando en el paradigma imperativo. O problemas netamente lógicos, con soluciones recursivas e incluso de naturaleza declarativa, se resuelven mejor con el paradigma lógico, son swi-prolog por ejemplo.

Cabe destacar que los paradigmas, como la palabra lo indica, es una forma de pensar, un patrón, un modelo. Es independiente del lenguaje que usemos. Sin embargo, intentar programar orientado a objetos en C, puede ser más complicado que en C++, en Java o Smalltalk. Lo mismo con el lógico y con el funcional.

Por ejemplo, una de las características del paradigma funcional, es que se basa en el cálculo lambda. Mediante el cálculo lambda puedo definir abstracciones funcionales, las cuales no necesitan tener nombre si sólo quiero evaluarlas una vez. Puedo hacerlo de la forma

 ( (lambda (x) (* x x) )   10)

obteniendo el cuadrado del número.

Luego de la corta introducción, voy al problema que intenté resolver luego de una charla con un docente de la cátedra. En general cuando uno plantea una función recursiva, necesita de un nombre en la función para referenciarla. Por ejemplo:

sumatoria(L):
      si vacia L luego
           0
      sino
           cabeza(L) + sumatoria( cola (L) )

Si quisiera aprovechar lo que me provee el paradigma funcional, el cálculo lambda para abstraer dicha función recursiva para generar otras, me encontraría con el problema que necesito hacer referencia al nombre. Eso podría solucionarlo definiendo varios nombres de funciones. Ej:

(define reduce ( lambda (f d L)
                  (if (null? L)
                      d
                      (f (car L)  (reduce f d (cdr L) ) )
                      )
                  )
  )
(define productoria ( lambda (L) ( reduce * 1 L) ) )
(productoria '(1 2 3 4 5))

Sin embargo sigo atado al espacio de nombres. ¿Podría definir de alguna manera una recursión sin necesitar de un espacio de nombres?

Para esto, pensé en unas soluciones posibles, quizá alguno tenga otras o se le ocurran otras en base a estas.
Podría definir una función, cuyos argumentos son una lista de números (o lo que necesite) y además una copia de si misma. Por ejemplo, veamos la siguiente abstracción funcional:

(lambda (f L)
  (if (null? L)
      0
      (+ (car L) (f f (cdr L) ) )
      )
  )

Esta abstracción, recibe como argumento una abstracción funcional (AF) y una lista. La AF que recibe, espera que se pueda aplicar a dos argumentos que, por lo que se puede ver en la definición, deberá ser una AF y una lista. De esta manera obtendré la recursión, si puedo asignar de alguna manera, una copia de sí misma como primer argumento.

Para esto, creo una nueva abstracción funcional, que aplica una AF como la que definimos a sí misma junto con una lista.

((lambda (f L) (f f L)) (lambda (f L)
                          (if (null? L)
                              0
                              (+ (car L) (f f (cdr L)) )
                              )
                          ) '(1 2 3 4 5))

Da como resultado 15.

Un concepto similar, pero ya con un espacio de nombres sería el siguiente:

( define t (lambda (f L)
             (if (null? L)
                 0
                 (+ (car L) (f f (cdr L))   )
                 )
             ) )
(t t '(1 2 3 4 5))

Otra forma de hacerlo, pero utilizando sólo un argumento y siguiendo la misma idea sería

(((lambda (f) (f f) ) (lambda (f)
                        (lambda (L)
                          (if (null? L)
                              0
                              (+ (car L) ((f f) (cdr L)) )
                              )
                          )
                        )) '( 1 2 3 4 5))

Personalmente creo que ésta última forma de declararlo es la más clara y entendible. Podríamos abstraer más en este caso la aplicación quitando el valor por defecto 0, y el «+», obteniendo una función fold o reduce sin nombre :-). Leyendo un poco en Internet, luego de un tiempo encontré lo que se conoce como Y combinator.
Más info en http://goodmath.blogspot.com/2006/05/why-oh-why-y.html.

Si tienen alternativas u otras curiosidades que les interese discutir, ¡adelante!

Eliminar contenido XSS (cross site scripting)

Posted on the septiembre 21st, 2009 under GNU/Linux,Software Libre by

Mini post:

Encontré en uno de los sitios web que mantengo, un código de XSS (cross site scripting). Aún no determiné el punto de entrada, pero me enteré gracias a un mail de Google.

Con grep y sed es bastante sencillo eliminarlo, ni que hablar con un script en Python 😛

Con grep busco los archivos, y con xargs convierto la salida el pipe en un parámetro para sed, y con sed reemplazo el código. Como el código insertado está al final del archivo, la expresión regular hubiese podido ser mucho más sencilla.

grep ./ -l  -R -e "http://reycross.com/lib/index.php"  | xargs sed -i  -e "s/<iframe.*reycross.*>.*<\/iframe>/ /g"

El código a eliminar era este (no agrego los tags de apertura a propósito):

iframe
src="http://reycross.com/lib/index.php" width=0 height=0 style="hidden" framebord
er=0 marginheight=0 marginwidth=0 scrolling=no
iframe

¿Alguien que le haya ocurrido esto?

¿Necesitan los sitios web verse igual en cada navegador?

Posted on the septiembre 18th, 2009 under Aplicaciones Web by

browsers-iconsSegún explican en el enlace que les dejo debajo, la respuesta es clara y concisa para la pregunta: ¿Necesitan los sitios web verse igual en cada navegador?

¿Ustedes? ¿Qué opinan?

http://dowebsitesneedtolookexactlythesameineverybrowser.com/

(más claro echale agua)

Drivers de SIS 771/671 para Xorg 1.6 -Mandriva 2009.1, Ubuntu Jaunty 9.04

Posted on the julio 11th, 2009 under General,GNU/Linux,Software Libre by

La versión corta para los impacientes y cansados de probar, aquí está, el driver para la placa de video con chip SIS 771/671 para Xorg 1.6, Ubuntu Jaunty Jackalope 9.04. Generalmente las computadoras que traen estas placas son las Olivetti 520 y algunas Bangho.

Publicidad

Aquí están los drivers binarios (sisimedia compilados por Mandriva)
xorg-driver-sisimedia_0.9-1_i386

Agregar o modificar lo siguiente en /etc/X11/xorg.conf

Section "Device"
    Driver "sisimedia"
EndSection

Luego reiniciar el servidor X.

Si querés saber que otras opciones tenés y como llegamos a estos drivers seguí leyendo.
Fuente: http://www.linuxconsulting.ro/xorg-drivers/

Fernet Casero

Posted on the junio 13th, 2009 under General by

Nueva "cosecha" de fernet

Nueva "cosecha" de fernet


A pedido del público presente en la reunión extremadamente corta del día de ayer, pero que salió con picadita, les dejo la receta del Fernet Casero que tuvieron el placer de desgustar. Así que este post va dedicado a mis fans número uno jaja, Milton, Martín y César.