Archive for June, 2008

Instalación y configuración de memcached en MediaWiki

Monday, June 30th, 2008

A continuación presento como instalé y configuré memcached en MediaWiki, sobre un Ubuntu 7.04.

¿Qué es memcached?

Memcached es un sistema de cache, que almacena objetos en memoria. Estos objetos son las consultas que se van realizando a la base de datos. La cache que utiliza es una tabla hash, que puede ser distribuida entre varias máquinas.

Beneficios del uso de memcached

Aumento en el rendimiento y disminución en la carga de la base de datos. Al estar cacheada las consultas, se puede “armar” más rápido las páginas que se sirven a los usuarios. Además se reduce considerablemente los accesos a la base de datos.

Requerimientos

  • PHP debe estar compilado con la –enable-sockets
  • libevent1
  • memcached

Para verificar que tenemos PHP compilado con esa opción podemos verificarlo con phpinfo (creando un página PHP con <?phpinfo();?>). En la figura podemos ver que tenemos compilado PHP con esa opción.

Socket habilitado en phpinfo

Para satisfacer los otros dos requerimientos, basta ejecutar un aptitude install memcached libevent1.

Verificación de funcionamiento

Podemos ver si está funcionando, verficando si efectivamente memcached está escuchando en su puerto.


$ netstat -tap
Conexiones activas de Internet (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:53856                 *:*                     LISTEN     5409/rpc.statd
tcp        0      0 localhost:2208          *:*                     LISTEN     4983/hpiod
tcp        0      0 *:nfs                   *:*                     LISTEN     -
tcp        0      0 *:11211                 *:*                     LISTEN     2
9248/memcached

Esta verificación es redundante ya que las dependencias de memcached son resueltas por aptitude, pero útil si han compilado memcached.


# cd /usr/bin
/usr/bin# ldd memcached
        linux-gate.so.1 =>  (0xffffe000)
        libevent.so.1 => /usr/lib/libevent.so.1 (0xb7edc000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d9b000)
        /lib/ld-linux.so.2 (0xb7ef9000)

Configuración de memcached en MediaWiki

Hay que editar el archivo LocalSetting.php y modificar las variables wgMainCacheType y wgMemCachedServers.

La variable wgMainCacheType toma como valor una constante. La siguiente lista contiene las constantes que pueden ser asignadas, no voy a entrar en detalle en el uso específico de cada una.

  • CACHE_ANYTHING
  • CACHE_NONE
  • CACHE_DB
  • CACHE_MEMCACHED
  • CACHE_ACCEL
  • CACHE_DBA

$wgMainCacheType = CACHE_MEMCACHED;
$wgMemCachedServers = array( "127.0.0.1:11211” );

Para poder asignar el valor correcto en wgMemCachedServers, necesitamos saber porque puerto está escuchando memcached. Esta información se encuentra detallada en /etc/memcached.conf. Dejo un fragmento del archivo.


# Default connection port is 11211
-p 11211

# Run the daemon as root. The start-memcached will default to running as root if no

Bibliografía

Cambios “al vuelo” en páginas Web

Tuesday, June 24th, 2008

Me pasaron un interesante enlace[cs.washington.edu], en donde se menciona un estudio realizado por un grupo de investigadores de CSE e ICSI. En dicho estudio demuestran que aproximadamente 1% de 50.000 usuarios, reciben las páginas web modificadas. Esta modificación “al vuelo”, se produce mientras la página deja el servidor y antes de llegar al browser del usuario. Las modificaciones consisten en inyectar anuncios, producidos en gran medida por agentes externos a los usuarios, por ejemplo los firewall de los ISP. Esto puede producir errores y vulnerabilidades.

Para poder medir estos cambios, desarrollaron un programa llamado web tripwires, que tiene la habilidad de detectar los cambios producidos en las páginas Web. Esta desarrollado en JavaScript y básicamente detecta cambios textuales en la página HTTP, reportandolos al usuario. Acá hay un ejemplo de cómo funciona, son dos páginas web con tripwire incluido.

Web tripwire está disponible para bajar.

Problemas con tex4ht en Ubuntu

Sunday, June 22nd, 2008

Al tratar de compilar un documento .tex con tex4ht me producía el siguiente error.


Transcript written on document.log.
----------------------------
tex4ht.c (2006-09-13-14:27 kpathsea)
tex4ht -f/document
  -i/usr/share/texmf/tex4ht/ht-fonts/
--- warning --- Can't find/open file `tex4ht.env | .tex4ht'
--- error --- Illegal storage address
----------------------------
t4ht.c (2006-09-13-14:28 kpathsea)
t4ht -f/howto-repositorios
--- warning --- Can't find/open file `tex4ht.env | .tex4ht'
--- warning --- Can't find/open file `document.lg'

Luego de buscar por un buen rato, llegué a una solución. Hay que ejecutar en línea de comando, como superusuario, lo siguiente.


# texhash
no
texhash: Updating /var/lib/texmf/ls-R-TEXMFMAIN...
texhash: Updating /var/lib/texmf/ls-R-TEXMFDIST-TETEX...
texhash: Updating /var/lib/texmf/ls-R...
texhash: Done.

Nota: Texthash lo que hace es actualizar un índice de paquetes Latex instalado, de esta manera el resto de las aplicaciones saben cuales paquetes están instalados.

Bibliografía


Debian Changelog tex4ht (20080228-1)[packages.debian.org]

Sanción de Ley para la prohibición de centrales nucleares

Saturday, June 21st, 2008

Logo de Eco Acción Mendoza

A vista de los eventos (especialmente lo sucedido el 16 de julio)que ocurrieron en la planta Kashiwazaki de Japón. Eco-Acción Mendoza se dispone a comenzar una campaña para que se sancione una Ley para la prohibición de centrales nucleares en Mendoza.

Eco-Acción Mendoza organiza todos los sábados a las 16hs reuniones
en el auditorio de radio nacional en Emilio Civit 460 de Ciudad.

Dejo aquí el comunicado emitido para dicha campaña

[descargar]

Speedy, navegando en una laguna

Saturday, June 21st, 2008

En un post anterior, comenté el “regeneramiento” de la línea, que al final de cuenta resultó ser una mentira disfrazada de “solución”.

En estos momentos el servidor de infosofía:=0×69AEE7 se encuentra en
el rango de ips dentro de la subred 190.172.0.0 de speedy. Además un
compañero mio también con speedy se encuentra en el rango 190.48.0.0,
con su servidor web. Ahora si quiero entrar a su servidor no puedo y el
tampoco a infosofía, incluso metiendole “regeneración” (y apagando el
modem) en ambos servidores.

Por lo cual ambos llamamos al servicio técnico de speedy
(0800-333-7733, opción 0 y después 2). En definitiva la serie de
llamadas terminaron en ninguna solución y en la mayoría de las llamadas
fuimos cortados, o sea, sino pueden solucionar algo te cortan ¡y listo!

Además el servicio técnico de speedy sólo tiene soporte para Windows
(ojo, también dan soporte para Windows 95 y 98 :-P), por lo cual no
podían ayudarnos. Pero éste problema , es un problema mero de ruteo de
speedy y no involucra al cliente.

Otra cosa que vale la pena comentar es que el servicio técnico
tampoco tiene “soporte de red”, o sea, por ejemplo aquí tengo una
pequeña red privada, la cual salé a internet por NAT. Toda persona con conocimientos mínimos en redes, sabe que la red privada conectada a un NAT desde internet se ve como una única máquina, pero ese conocimiento es algo desconocido para el servicio técnico, diciéndome: “Señor, no podemos ayudarlo en su problema por que tiene más de una máquina conectada a internet”
Vuelvo a repetir que el problema no es del cliente, es de speedy. Por
lo tanto esta excusa no tiene fundamento al igual que la anterior.

También pudimos sacar una conclusión de estas llamadas, y es que el
servicio técnico no sabe absolutamente nada de nada, por ejemplo unas
de las personas que habló conmigo no sabía cual era la diferencia entre
una página web y un servidor web; otros no sabían que era la IP
pública, confundiendo la ip de mi máquina con la ip con la que salgo
hacia Internet; etc. Realmente una desilusión.

Este es un problema con TCP, ya que si hago ping (ICMP) al servidor
que está en 190.48.0.0 me responde, pero si utilizo algo que funcione
sobre TCP no veo a la otra máquina. Por ejemplo es imposible hacer
conexiones web, FTP o consultar una base de datos remota…

Creo que esto es algo que debería de quejarse todo usuario de speedy, ya que nos venden un servicio con el cual podemos navegar sin límites, y en realidad estamos limitados a navegar por ciertos ip’s. Aquí dejo algunos consejos a la hora de quejarse:

  • Al llamar pedir número de reclamo, de esta manera tenemos la
    identificación del llamado, para después hacer cualquier tipo de
    denuncia (ya que supuestamente graban todos los llamados). Estos
    números pueden ser útiles para obtener descuentos en la facturación de
    la línea :-P
  • Pedir el nombre y apellido del que nos toma el reclamo
  • Y lo más importante, decir que: “por favor no corten la llamada, porque sino tendré que hacer una denuncia”.

Aquí les dejo unas pruebas que muestran el filtrado que realiza speedy


$ traceroute 190.48.32.14 80
traceroute to 190.48.32.14 (190.48.32.14), 30 hops max, 80 byte packets
 1  192.168.2.1 (192.168.2.1)  1.366 ms  0.831 ms  0.906 ms
 2  192.168.1.1 (192.168.1.1)  1.250 ms  1.431 ms  1.480 ms
 3  200.51.241.221 (200.51.241.221)  13.279 ms  15.543 ms  65.523 ms
 4  200.51.233.140 (200.51.233.140)  13.997 ms  15.538 ms  14.449 ms
 5  200.51.233.140 (200.51.233.140)  56.170 ms  38.127 ms  12.758 ms
 6  200.51.233.141 (200.51.233.141)  17.054 ms  30.646 ms  14.812 ms
 7  * * *
 8  * * *
 9  * * *
10  * * *
...
30  * * *

Ahora si vuelvo hacer un trace, pero en vez de usar paquetes UDP, utilizo ICMP ECHO; se ve lo siguiente


$ traceroute -I 190.48.32.14 80
traceroute to 190.48.32.14 (190.48.32.14), 30 hops max, 80 byte packets
 1  192.168.2.1 (192.168.2.1)  3.581 ms  0.833 ms  0.834 ms
 2  192.168.1.1 (192.168.1.1)  1.752 ms  1.038 ms  1.008 ms
 3  200.51.241.221 (200.51.241.221)  88.064 ms  92.143 ms  23.622 ms
 4  200.51.233.140 (200.51.233.140)  12.996 ms  13.763 ms  14.313 ms
 5  200.51.233.140 (200.51.233.140)  14.262 ms  116.797 ms  12.750 ms
 6  200.51.233.141 (200.51.233.141)  13.483 ms  13.176 ms  15.324 ms
 7  190-48-32-14.speedy.com.ar (190.48.32.14)  198.036 ms  104.146 ms  380.376 m

Increíble, esto demuestra que el router 200.51.233.141 está filtrando las conexiones. Ahora hagamos un ping


$ ping 190.48.32.14
PING 190.48.32.14 (190.48.32.14) 56(84) bytes of data.
64 bytes from 190.48.32.14: icmp_seq=1 ttl=248 time=63.7 ms

Ahora tratemos de obtener una pagina web del servidor


$ nc 190.48.32.14 80
HEAD / HTTP:1.0

Creería que eso es suficiente para mostrar que realmente es un
problema de speedy (especialmente sus router) y no del cliente. Espero
que esto se solucione de una buena vez, porque fastidia y mucho.

Poderes de super vaca

Saturday, June 21st, 2008

En
una de mis eufóricas búsquedas por internet me tropiezo ante este
paquete de Debian, el cual nos ofrece configurar una vaca
hablante/pensante; jaja, si correcto una VACA. Para probarlo


# aptitude install cowsay

Básicamente es un programa en Perl que genera una vaca en ASCII, la cual dice o piensa lo que el usuario le pase como argumento.


$ cowsay infosofía:=0x69AEE7
 ______________________
< infosofía:=0x69AEE7 >
 ———————-
        \   ^__^
         \   (oo)\_______
             (_ _)\            )\/\
                   | |—-w  |
                   | |        ||

O aquí tenemos la versión pensante de la vaca


# cowthink Como a caído el nivel de los post...
 _______________________________________
( Como a caído el nivel de los post... )
 ---------------------------------------
        o   ^__^
         o   (oo)\_______
              (_ _)\            )\/\
                     | |----w  |
                     | |        ||

Para finalizar, vale la pena mencionar que se puede cambiar el
aspecto de la vaca según su estado físico/emocional. Este se debe
especificar como parámetro al programa. Aquí dejo algunos:

-b
Vaca en modo Borg
-g
Modo codicioso
-d
Aparece muerta
-p
Estado de paranoia
-s
Petrificada
-t
Está cansada
-w
Lo contrario de -t
-y
Aspecto juvenil

Almacenar objetos en una sesión

Saturday, June 21st, 2008

Voy
explicar a través de un simple ejemplo como guardar un objeto en una
sesión de php y luego recuperarlo. El ejemplo está basado en PHP 5 y
está formado por 3 archivos php:

a.php
Archivo que contiene la definición de la clase
b.php
Archivo que crea la sesión e instancia un objeto de la clase. Luego lo guarda en la variable SESSION
clase.php
Recupera el objeto de SESSION y lo muestra por pantalla
PHP:

  1. //Archivo clase.php
  2. class Clase {
  3.   private $precio;
  4.   private $cantidad;
  5.  
  6.   public function __construct($p, $c){
  7.     $this->cantidad = $c;
  8.     $this->precio = $p;
  9.   }
  10.   public function getTotal(){
  11.     return $this->precio*$this->cantidad;
  12.   }
  13.   public function __toString(){
  14.     return ‘Hay ‘.$this->cantidad.‘ de articulos, que cuestan ‘.$this->precio;
  15.   }
  16. }
PHP:

  1. //Archivo a.php
  2. include(‘./clase.php’);
  3. $obj = new Clase(3, 3.14);
  4. $_SESSION['o'] = serialize($obj);
  5. header (‘Location: ./b.php);
PHP:

  1. //Archivo b.php
  2. include(‘./clase.php’);
  3. $obj = unserialize($_SESSION['o']);
  4. echo $obj.\n;
  5. echo $obj->getTotal();
  6. unset($_SESSION['o']);

La salida de b.php sería

Hay 3 de articulos, que cuestan 3.14
9.42

Básicamente lo que hacemos es utilizar la función serialize para representar el objeto como un string y de esta manera guardarlo en SESSION. Luego con unserialize transformamos la cadena en objeto.

Es importante notar que en el lugar donde transformemos la cadena en
objeto debemos incluir el archivo que contenga la definición de la
clase, para que de esta manera PHP sepa como crear el objeto.

Aquí les dejo como luce el objeto cuando lo serializamos

O:5:"Clase":2:{s:15:" Clase cantidad";i:3;s:13:" Clase precio";d:3.140000000000000124344978758017532527446746826171875;}

Instalación y configuración de Doxygen en Debian

Saturday, June 21st, 2008

Doxygen
es un sistema de generación de documentación. Aquí voy a mostrar como
instalarlo y una mínima configuración. Además dejo un ejemplo de la
salida generada en html.

Para instalar Doxygen sólo es necesario el siguiente paquete


$ aptitude install doxygen

Para mostrar cómo configurar doxygen nos valdremos del siguiente ejemplo. Por ejemplo mi proyecto lo tengo dentro de /var/www/proyecto1

Antes de configurarlo, tenemos que crear el archivo de
configuración. Para esto nos situamos en la raíz de nuestro proyecto (o
dónde les parezca que debería ser creado el archivo de configuración) y
hacemos


:/var/www/proyecto1# doxygen -g proyect1.cfg

Este archivo, nos permite modificar los parámetros del proceso de generación de documentación para ajustarse a nuestro proyecto.

Aquí dejo algunos de los puntos más importantes de la configuración:


# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.

OUTPUT_DIRECTORY       = /var/www/proyecto1/doc

# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.

OUTPUT_LANGUAGE        = Spanish

# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.

INPUT                  = /var/www/proyecto1

# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py

FILE_PATTERNS          = *.php

# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explicit @brief command for a brief description.

JAVADOC_AUTOBRIEF      = YES

En este enlace hay más ejemplos para la configuración. En sí el archivo está bastante documentado (:-P) y es suficiente por sí mismo.

Una vez terminado lo anterior nos situamos en la carpeta donde creamos el archivo de configuración, en este ejemplo en /var/www/proyecto1 y hacemos


# doxygen proyecto1.cfg

Esto generará la documentación en el directorio especificado en OUTPUT_DIRECTORY.

Dejo un pequeño ejemplo de cómo documentar una pequeña clase php.

PHP:

  1. require_once($_SERVER[DOCUMENT_ROOT].‘/proyecto1/confi.php’);
  2. /**
  3. @brief Esta clase es una estructura básica de una página html
  4. @author Leandro Redea
  5. **/
  6. class Algo{
  7.     /** Titulo de la página web que aparece en el browser*/
  8.     private $titulo = “Dinamic Web”;
  9.     /** Palabras claves para que los motores de búsqueda indexen esta página*/
  10.     private $keywords=“PHP, MySQL, GNU/Linux, *BSD”;
  11.     /* Pequeña descripción de la página*/
  12.     private $descripcion=“una simple prueba”;
  13.     /*Link de estilos*/
  14.         private $linkStyle=“http://localhost/tempo/estilo.css”;
  15.     /*Link de feed*/
  16.         private $linkFeed=“http://myhomemdz.dyndns.org/tempo/feed.php”
  17.     /**
  18.     *Esta funcion es la cabecera
  19.     */
  20.     public function getXhtml(){
  21.         echo (‘<title>’.$this->titulo.“</title>\n);
  22.     }
  23.     /** Esta funcion genera los link que se encuentran dentro de las etiquetas HEAD de una pagina web
  24.     */ 
  25.     private function getLink(){
  26.         echo “<link rel=\”StyleSheet\” href=\”.$this->linkStyle.\” type=\”text/css\” media=\”screen\”>”;
  27.         echo ‘<link rel=”alternate” type=”text/xml” title=”prueba” href=”‘.$this->linkFeed.‘” />’;       
  28.     }
  29.         /** Genera una parte de la página dinámica
  30.         @param a Es la etiqueta inferior
  31.         @return Devuelve el footer dentro de body */
  32.         public function getFooter($a){
  33.                 //Hace muchas cosas y retorna algo
  34.         }
  35. }

Nota: Para que los comentarios sean generados en la salida, tiene que estar dentro de las etiquetas <?php ?>

La salida se genera dentro de /var/www/proyecto1/doc. Se
crean en este caso dos carpetas una html y la otra latex. Para ver la
documentación a través de la web, bastaría escribir la siguiente url en
su browser

http://localhost/proyecto1/doc/html

Dejo una imagen de como quedaría la clase anterior generada en html.

imagen que muestra en ejemplo generado con doxygen

UXi 10, Revista de software libre

Saturday, June 21st, 2008

Último número de la revista UXi. Es el número aniversario, en el que cumple un año.

Aquí les dejo un resumen de los temas tratados en esta entrega:

  • Articulo sobre la elección de un buscador de contenidos para una intranets
  • Encriptar sistemas de ficheros en Debian
  • Explicación de la estrategia de migración al software libre aplicada por UCI
  • Programación de socket en C++
  • [Descargar]

Esta edición fue dedicada a una de las grandes figuras de la humanidad José Martí, por este motivo en algunos pie de páginas se pueden encontrar frases de este prócer. Aquí dejo unas:

“La libertad no es placer propio: es deber extenderla a los demás”
“Poseer algo no es más que el deber de emplearlo bien”

José Martí

Ambas frases se entrelazan en el mensaje que intentan transmitir,
cuyo mensajero siempre puso de manifiesto a lo largo de su vida.

Todas las revistas pueden ser descargadas del blog oficial de UXi. O desde infosofía:=0×69AEE7.

UXi 01, Volumen 2

Saturday, June 21st, 2008

Este
nuevo número de UXi marca el aniversario de dicha revista y el comienzo
del volumen 2, el cual constará de 10 entregas. En este número dentro
de los temas tratados, podemos encontrar los siguientes:

  • Festival de software libre, celebrando el aniversario de UXi
  • Lanzamiento de la Comunidad Virtual Unix-BSD de la UCi
  • Características de las principales herramientas para acceso a servicios de Internet, para facilitar la migración
  • Grub en un diskette
  • Cómo construir un GrubSplash
  • Programación de hilos y semáforos en GNU/Linux con C++
  • Apache como servidor web por excelencia

Link de descarga

[descargar]

El resto de los números pueden ser bajados desde el blog de UXi o desde infosofia:=0×69AEE7.