Friday, April 13, 2007

Apache autenticando contra un ADS

Hace un par de días tuve la necesidad de implementar autenticación en un servidor Apache 1.3, pero con los usuarios de un Active Directory Service.

Buscando en la red, encontré una receta bastante sintáctica (la receta_85), pero que aún necesitaba un par de pasos a fin de sincronizar la hora entre el servidor ADS y el Linux.

Aparte de lo descrito en la receta, hay que instalar el paquete "krb5-user", a fin de contar con las utilidades "kinit" y "klist" que nos permitirán verificar que se puede autenticar contra el ADS.

El protocolo kerberos es muy sensible a la diferencia horaria, así que antes de hacer estas pruebas, primero se debe sincronizar la fecha y hora del servidor con el comando:

net time -S <servidor_ads>

Luego de eso, todo funcionará sin problemas.

PD: La información contenida en la receta_81 sirve para verificar la conectividad contra el ADS.

--
KIT

Labels:

Thursday, March 08, 2007

PHP4 con soporte OCI

Hace mucho tiempo, yo solía bajar los fuentes del PHP4, para luego conseguir una copia del Oracle 8i y empezar la larga (y triste) labor de compilar un PHP con soporte Oracle.

En ese tiempo, utilizaba SuSE 7.2 y cuando habían actualizaciones de seguridad, tenía que volver a repetir todo el proceso.

Luego de cambiarme a Debian 3.0 (Woody), la forma no cambió mucho, igual seguía la vieja receta.

Recién con Debian 3.1 (Sarge), y con la disponibilidad del Oracle-XE, se me ocurrió investigar si existía algún atajo para evitar la vieja y tediosa receta, y he aquí lo que encontré:

  1. Actualizar el repositorio para poder bajar el Oracle-XE, agregando al archivo /etc/apt/sources.list, lo siguiente:
    deb http://oss.oracle.com/debian/ unstable main non-free
  2. Luego actualizar el repositorio con:
    apt-get update
  3. Verificar que el swap sea mayor a 1024MB, si no el cliente Oracle-XE no instalará. Temporalmente puedes hacer esto:
    $ dd if=/dev/zero of=/tmp/swap00 bs=512k count=1024
    $ mkswap /tmp/swap00 && swapon /tmp/swap00

    (si necesitas más, repite lo anterior con un número distinto a "00").
  4. Instala el cliente Oracle-XE con el comando:
    apt-get install oracle-xe-client
  5. Cargar el entorno del cliente Oracle-XE con el comando:
    $ . /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/bin/oracle_env.sh

Hasta aquí la primera parte, ahora recién vamos a compilar lo estrictamente necesario para obtener el soporte OCI en PHP:

  1. Instala las herramientas necesarias:
    $ apt-get install dpkg-dev php4-dev
  2. Bajamos los fuentes del PHP4:
    $ apt-get source libapache-mod-php4
  3. Ingresamos al directorio donde está lo que necesitamos:
    $ cd php4-2.3.10/ext/oci
  4. Configuramos la extensión:
    $ phpize
    Configuring for:
    PHP Api Version: 20020918
    Zend Module Api No: 20020429
    Zend Extension Api No: 20021010
    $ sh configure
    (..)
    checking for Oracle-OCI8 support... yes, shared
    checking Oracle Install-Dir... /usr/lib/oracle/xe/app/oracle/product/10.2.0/client
    checking Oracle version... 10.1
    checking for OCILobIsTemporary in -lclntsh... yes
  5. Compilamos:
    $ make
    (..)
    Build complete.
    (It is safe to ignore warnings about tempnam and tmpnam).
  6. Instalamos:
    $ make install
    Installing shared extensions: /usr/lib/php4/20020429/
  7. Configuramos nuestro php para utilizar el módulo recién creado:
    $ echo "extension=oci8.so" >> /etc/php4/apache/php.ini
  8. Recargamos el apache:
    $ /etc/init.d/apache reload

Y listo, eso es todo lo que hay que hacer, sin complicarse la vida editando el debian/rules y luego peleándose con el aburrido dpkg-buildpackage -rfakeroot -b.

Ahora, esta receta debe funcionar sin mayores cambios en las demás distribuciones de Linux.

KIT

Labels: , , ,

Friday, January 12, 2007

Obtener los N máximos valores.

Hoy me topé con el problema de encontrar los N primeros valores de la columna 10, de una información que se encontraba en texto plano separado por comas.

Sé que la solución más fácil (pero no necesariamente la más óptima) sería utilizar algo como este oneliner:

 cut -d, -f10 archivo | sort -rn | head -20

Pero como siempre me interesa hacerme la vida un poco más difícil, pensé en hacerlo en AWK, para lo cual utilicé el siguiente oneliner:

 awk -F, -v T=20 '{ V=int($10); C=0; for(i=0;i<T && C==0;i++)if(V>F[i]){ C++; for(j=T-1;j>i;j--) F[j]=F[j-1]; F[i]=V } };
END{ for(i=0;i<T;i++) print F[i] }'

Luego de tomar algunos tiempos en segundos, verifiqué cuál era el método más rápido:

awk: 294s 296s 296s
cut+sort: 91s 88s 91s

Si, el burdo método del cut+sort es el más rápido, pero aún así prefiero el método AWK, el porqué es muy simple: awk me obliga a pensar,de manera lógica, acerca de cómo debo atacar el problema.

Cut y sort, no me obligan a pensar nada, ya están allí y simplemente tendría que usarlos, pero para usar cosas que no me obligan a pensar tengo más que de sobra.

BTW: el archivo mide algo más de 300mb comprimido, y los tiempos aquí incluyen la decompresión en línea. El número de registros es de algo más de 13 millones, la máquina obviamente no es una XT (como muchos pensarían de mí).

BTW2: acabo de recordar que tengo que utilizar htmlentities para publicar el código con comparaciones "menor que" o "mayor que".

--
KIT

Labels:

Wednesday, January 10, 2007

Cambiar tamaño de columna en PostgreSQL

Hoy me topé con un problema, tenía que cambiar el tamaño de una columna en PostgreSQL, y google no me estaba ayudando mucho, pues el manual del ALTER TABLE no documenta nada acerca de cómo lograr este cambio, pero después de googlear un rato logré encontrar la solución al problema en este link.

La solución es bastante fácil, y denota la ventaja de tener atributos en vez de amarrar en el almacenamiento esta declaración (en este caso, la longitud de una columna).

Yo no soy muy entendido de bases de datos, ni de las herramientas que puedan existir para evitar estar cambiando la longitud de las columnas, así que a quien le interese, le dejo un script en AWK que hace justamente eso, calcular el máximo de longitud de cada columna.

 BEGIN {
FS=","
}
{
for (i=1; i<=NF; i++)
if (length($i)>MAX[i])
MAX[i]=le
}
END {
print "maximos por campo"
for (i in MAX)
print i "->" MAX[i]
}
Y sólo tienen que asignar a la variable "FS" el valor correcto para el separador de campos, y lo invocan así:

 awk -f archivo.awk archivo_datos.txt

Si el archivo tiene terminación de líneas de tipo "crlf", tienen que filtrar el "\r" o de lo contrario, AWK no funcionará como se espera:

 sed 's/\r//' archivo_datos.txt | awk -f archivo.awk

Espero que a alguno le sirva...



KIT

Labels: