Cómo configurar un repositorio Mercurial con Apache

Una de las herramientas de control de versiones más fáciles de aprender y utilizar, a la vez que nos ofrece flexibilidad y potencia es Mercurial, que es un software Open Source con lo cual nos ofrece los beneficios de un costo bajo de implementación y la posibilidad de modificarlo en caso de que necesitemos cambios.

Para aquellos que no saben que es un sistema de control de versiones pueden leer este estupendo tutorial de Joel Spolsky HgInit, en el cual de paso aprenderan como utilizar Mercurial a nivel de usuario.

Si tiene planeado seguir este howto, debe considerar que lo he escrito teniendo en mente Debian Lenny, aunque en teoría puede ser usado con cualquier distribución de Linux, asumo además de que está familiarizado con apache y sabe como editar archivos de texto.

Pues bien, comencemos. Lo primero que debemos hacer es instalar Mercurial, para ello como usuario root debemos ejecutar este comando:

# apt-get install python python-dev mercurial

Con este sencillo paso ya tenemos instalado Mercurial en nuestro sistema, pero no nos permite exportar los repositorios a través del apache, para ello necesitamos un script llamado hgwebdir.cgi que ya está en nuestro sistema pero escondido dentro de la documentación de Mercurial que instaló Debian.

Comencemos pues a configurar nuestro apache para que exporte los repositorios a través de una conexión SSL, a la vez que nos permita hacer un "push" directamente al repositorio a través del apache.

Debemos crear un directorio donde estarán nuestros repositorios (todo esto como usuario root):

# mkdir -p /var/hg/repos
# touch /var/hg/hgweb.config
# chown -R www-data:www-data /var/hg

Ahora debemos de editar el archivo /var/hg/hgweb.config y poner dentro de él lo siguiente:

[collections]
repos/ = repos/

[web]
style = gitweb

Ahora necesitamos copiar el script que hará la magia de administrar los repositorios a través del apache:

# cd /var/hg/
# cp /usr/share/doc/mercurial/examples/hgwebdir.cgi ./
# chown www-data:www-data ./hgwebdir.cgi
# chmod +x ./hgwebdir.cgi

Lo siguiente que haremos será crear el archivo /etc/apache2/hg/main.conf

# mkdir /etc/apache2/hg
# touch /etc/apache2/hg/main.conf

En el interior de dicho archivo debemos de poner las siguiente líneas:

AddHandler cgi-script .cgi
ScriptAliasMatch      ^/hg(.*) /var/hg/hgwebdir.cgi$1
<Directory "/var/hg">
  Options FollowSymLinks +ExecCGI
  AllowOverride All
  Order allow,deny
  Allow from all
</Directory>

Asumiendo de que tiene apache2 con soporte para SSL exitosamente instalado (si no lo tiene aún puede usar este tutorial), sólo debemos de editar el archivo /etc/apache/sites-available/default-ssl y agregar la siguiente línea antes de las directivas que habilitan el SSL:

Include /etc/apache2/hg/main.conf         <– Linea que debe añadir

#   SSL Engine Switch:                    <– Referencia de donde debe insertar
#   Enable/Disable SSL for this virtual host.
SSLEngine on

Estamos listos para comenzar a utilizar nuestro repositorio, sólo necesitamos reiniciar el apache, para ello usamos el comando:

# /etc/init.d/apache2 force-reload

Desde este comento podemos comenzar a utilizar nuestro repositorio de Mercurial.

Para crear un nuevo repositorio, sólo debemos de utilizar el comando:

# su – www-data -c "hg init /var/hg/repos/<nuevo repositorio>"

Si deseamos configurar quieres pueden hacer "push" en el directorio debemos de crear el archivo /var/hg/repos/<nuevo repositorio>/.hg/hgrc y en el podemos configurar de acuerdo a nuestra conveniencia lo siguiente:

[web]
contact = Volkan Rivera
description = mi primer repositorio de Mercurial
allow_push = user1, user2, user3

# Habilita la descarga de último snapshot en forma comprimida
allow_archive = gz zip bz2

Para habilitar las contraseñas que permiten a los usuarios acceder al repositorio y publicar (push) código al repositorio, debemos usar el móduco mod_auth de apache y su configuración a través de .htaccess, aquí los detalles.

Y es todo, con estos sencillos pasos ya tenemos funcionando nuestro repositorio de Mercurial a través del apache (accesible a través de https://server.name.com/hg), para que todo nuestro equipo de desarrollo pueda utilizarlo a tavés de internet y de forma segura. Espero que les haya sido de utilidad a la vez que agradezco anticipadamente sus críticas y comentarios.

Facebook presenta XHP (un PHP con esteriodes)

El día de ayer, mientras todo el mundo estaba discutiendo las aplicaciones presentes y futuras de Google Buzz, Facebook presentó XHP. Una de las razones por las que me dí cuenta de la existencia de XHP, fue gracias a que Google no ha habilitado aún Buzz en mi cuenta de Gmail. Lo cual en el fondo agradezco ya que de otro modo hubiera pasado por alto XHP.

¿Qué es XHP?, pues bien XHP es una extensión de PHP que valga la redundancia extiende la sintaxis del lenguaje para hacer la elaboración de front-end más fácil de leer y además incrementar la seguridad. Para conseguir dicho fin hace que PHP pueda entender XML de manera nativa.

La aplicación que Facebook le está dando a XHP es Facebook Lite, una versión mucho más ligera de la web de Facebook. Aunque su autor Marcel Laverdet, dice que es usado además para renderizar varias partes de la web de Facebook, ya que permite combinar porciones de código HTML en un simple nuevo objeto, con todas las ventajas que ello representa.

Pero veamos un ejemplo de cómo la sintaxis de PHP ha cambiado con XHP, usaremos el ejemplo que Facebook da:

<?php
if ($_POST[‘name’]) {
?>
    <span>Hello, <?=$_POST[‘name’]?>.</span>
<?php
} else {
?>
    <form method="post">
    What is your name?<br>
    <input type="text" name="name">
    <input type="submit">
    </form>
<?php
}

En el código anterior pueden presentarse dos problemas, el primero y más obvio es que seremos víctimas de XSS; el segundo problema es que si olvidamos abrir o cerrar los tag PHP, nustra página generaría un error. Con XHP ambos problemas se resuelven, aquí el mismo código anterior pero implementado con XHP:

<?php
// note: includes omitted
if ($_POST[‘name’]) {
  echo <span>Hello, {$_POST[‘name’]}</span>;
} else {
  echo
    <form method="post">
      What is your name?<br />
      <input type="text" name="name" />
      <input type="submit" />
    </form>;
}

Note que ahora todo es un simple block de código PHP, no hay que estar abriendo y cerrando tags PHP. Este cambio en la sintaxis del lenguaje trae consigo algunas ventajas:

  •  Debido a PHP es ahora context-specific, sabe que cuando la variable $_POST es invocada la entrada de datos será HTML y por lo tanto debe escapar los caracteres.
  •  Incorporar XML dentro de la sintaxis PHP permite detectar errores de con los marcadores (markup) en tiempo de parseo y no en tiempo de ejecución. Con lo que no podría existir una página web generada con scripts de XHP malformada.
  • Ya que XML ahora forma parte del lenguaje, en adición a su uso con "echo", también es posible asignarlos a una variable y manipularlos como un objeto cualquiera.
  • Adicionalmente XHP permite definir nuevos tags, con lo que complejas secciones de código HTML, pueden ser ahora definidas como un nuevo marcador, desempleñando de hecho el XHP el papel de un sistema de templates.

Debido a que todas estas ventajas me han interesado decidí probarlo y les dejo un pequeño tutorial de cómo intalar XHP en su server. Lo he probado con CodeIgniter y al parecer XHP no añade ninguna incompatiblidad que impida usarlo en un server donde ya tengamos código PHP. Aquí les dejo como instalar XHP en un server Debian Lenny (esto puede ser usado también para Ubuntu pero recordando usar el  "sudo").

Primero hay que asegurarnos que tenemos instaladas todas las herramientas para compilar XHP:

# apt-get install build-essential flex bisson php5-dev

Ahora descargamos las fuentes y descomprimimos el archivo:

# cd /tmp
# wget http://github.com/facebook/xhp/tarball/1.3.7
# cd /usr/src
# tar -zxvf facebook-xhp-290b185.tar.gz
# cd /usr/src/facebook-xhp-290b185

Ahora comenzamos el proceso de compilación:

# phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519

# ./configure
(…)
appending configuration tag "F77" to libtool
configure: creating ./config.status
config.status: creating config.h

# make
(…)
———————————————————————-
Libraries have been installed in:
   /usr/src/facebook-xhp-290b185/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR’
flag during linking and do at least one of the following:
   – add LIBDIR to the `LD_LIBRARY_PATH’ environment variable
     during execution
   – add LIBDIR to the `LD_RUN_PATH’ environment variable
     during linking
   – use the `-Wl,–rpath -Wl,LIBDIR’ linker flag
   – have your system administrator add LIBDIR to `/etc/ld.so.conf’

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
———————————————————————-

Build complete.
Don’t forget to run ‘make test’.

# make test
(…)

# make install
(…)

Los parentesis (…) indican que verán algunos mensajes, donde he sido específico es en donde muestro algún resultado útil para saber si vamos bien o no. Las líneas en azul son las que Ud. debe tipear (claro omitiendo el prompt ‘#’).

Luego debemos de agregar al archivo de configuración php.ini la línea "extension=xhp.so", en Debian hay dos archivos que modificar:

/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini

El primero es para agregar la extensión dentro del PHP incorporado como módulo de Apache y el segundo para hacer el cambio en PHP cuando se usa como CGI.

Más información sobre el proyecto, la nueva sitaxis que se ha agregado y como resolver algunos errores comunes, pueden encontrarse en la wiki de XHP.

Enviando mensajes SMS desde la línea de comandos

Enviar mensajes SMS desde una de nuestras aplicaciones o scripts siempre es una necesidad, la forma más fácil y obvia es sencillamente hacerlo a través de gateways de correo que algunos proveedores celulares ofrecen. Lo cual es común en USA y Europa, por ejemplo si alguien desea enviar un SMS a un celular de TMobile en USA sólo debe de poner como destinatario una dirección e-mail de esta forma 1234567890@tmomail.net donde 1234567890 es el número del celular al que deseamos enviar el mensaje.

Sin embargo esa opción no está disponible en todo el mundo, algunos carriers no la ofrecen y en su reemplazo solamente nos permiten enviar mensajes SMS a través de interfases web que requieren usualmente que resolvamos un captcha. Lo cual hace demasiado complicado automatizar ese proceso a través de un script con curl. Un ejemplo de ello es Claro del Perú.

Buscando una forma de resolver este problema es que encontré la librería pygooglevoice, dicha librería permite a cualquiera que tenga una cuenta de Google Voice el enviar/recibir mensajes SMS  de manera gratuita a cualquier parte del mundo. ¿Aplicaciones?, muchas, desde sistemas de monitoreo y alarma a sistemas interactivos de información usando mensajes SMS (podríamos por ejemplo crear nuestro propio clon de twitter).

Si desean darle una ojeada más extensa a la documentación antes de instalar la librería pueden hacerlo aquí.

La instalación es sencilla, aquí los pasos de cómo hacerla en un Ubuntu 8.04 (Hardy):

$ wget http://pygooglevoice.googlecode.com/files/pygooglevoice-0.5.tar.gz
$ sudo apt-get install python-simplejson
$ tar -zxvf pygooglevoice-0.5.tar.gz
$ cd pygooglevoice-0.5
$ sudo python setup.py install
$ cd

Listo con esos pasos tenemos instalada la librería y un utilitario llamado "gvoice" que nos permite administrar nuestra cuenta Google Voice desde la línea de comandos. Pero como nuestro objetivo es poder enviar mensajes SMS a números telefónicos de cualquier parte del mundo (bueno sólo carriers GMS están soportados), de manera automatizada, podemos usar un sencillo script en Python como este que viene de ejemplo:

from googlevoice import Voice
from googlevoice.util import input

voice = Voice()
voice.login()

phoneNumber = input(‘Number to send message to: ‘)
text = input(‘Message text: ‘)

voice.send_sms(phoneNumber, text)

Luego podremos ejecutarlo y el script nos preguntará nuestro e-mail en gmail que es usado como credencial en Google Voice, el password, el número telefónico al cual queremos enviarle un mensaje de texto y finalmente el mensaje de texto. Aunque este es un ejemplo bastante trivial las aplicaciones del mismo son enormes. Hay que tener presente que este escript no limita el tamaño del mensaje, así que si este excede los 140 caracteres será truncado.

Instalando OpenSSH en Debian 3.1

El día de ayer (27 de agosto) en la noche luego de haber hecho un mantenimiento de rutina, cuándo el server Linux Debian 3.1 arranco, no permitía conexiones ssh, revisé el server y me di cuenta de que por alguna razón que aún no logro entender, al actualizar una librería de CPAN, mi sshd sencillamente desapareció. El problema era que para reinstalarlo, el apt-get me solicitaba remover el apache2, el vsftp, el vtun (que uso para crear tuneles) y unas cuantas librerías SSL que si lo hacía corría el peligro de dejar el servidor inoperativo, así que lo único que me quedo fue intalar el OpenSSH desde fuentes, pero descubrí un cierto número de pequeños detalles que consumieron casi 2 horas de mi vida, sólo compilando el OpenSSH, para que no me vuelta ha ocurrir lo mismo y para que sirva de ayuda a cuáquiera que tenga el mismo problema, aquí les digo cómo instalarlo.

Primero hay que instalar el zlib1g-dev usando el apt-get como super-usuario:

# apt-get install zlib1g-dev

Luego hay que descargar el OpenSSH 3.8p1 usando el wget:

#  wget ftp://ftp.cse.buffalo.edu/pub/OpenBSD/OpenSSH/portable/openssh-3.8p1.tar.gz

Luego hay que descomprimirlo usanto el comando tar:

# tar -zxvf openssh-3.8p1.tar.gz

Luego hay que hacer la configuración, compilación e instalación:

# cd openssh-3.8p1
# ./configure –prefix=/opt/openssh
# make
# make install

Finalmente iniciamos el ssh deamon con el comando:

# /opt/openssh/sshd

Y listo, problema resuelto ya tenemos el sshd corriendo.

Instalando Safari en Ubuntu

Uno de los browsers que no podía probar que tal se veía mi blog era Safari, que es el browser que viene en las Mac. Sin embargo encontré un interesante tutorial en el blog Ubuntu Unleashed que explica cómo instalarlo haciendo uso del wine. Y aquí me permito traducirlo e incluir algunos screenshot que aclaran el procedimiento.

Primero necesitamos tener instalado el wine y las fuentes truetype, para ello si aún no los tenemos instalados ejecutamos este comando:

sudo apt-get install msttcorefonts wine

Luego, procedemos a copiar la fuente Arial dentro del directorio de fuentes del wine, para ello ejecutamos este comando:

cp /usr/share/fonts/truetype/msttcorefonts/Arial*.ttf ~/.wine/drive_c/windows/fonts/

Asegurese de que cuando configura wine ha seleccionado "Windows XP" como la versión de Windows, para efectuar la configuración puede ejecutar desde un terminal el comando:

winecfg

Debe de obtener una ventana cómo esta:

winecfg

Luego debemos de descargar los instaladores de Safari y del plugin de flash, que nos permitrá ver videos de youtube. Para ello ejecutamos estos comandos:

wget http://ubuntu-debs.googlecode.com/files/SafariSetup.exe
wget http://ubuntu-debs.googlecode.com/files/install_flash_player.exe

Luego procedemos a instalar el Safari ejecutando con wine el ejecutable de Windows, y deshabilitando las opciones "Install Bonjour for Windows" y "Automatically update Safari and other Apple Software" al momento de la instalación, es importante que hagamos esto porque sino la instalación no concluirá.

wine SafariSetup.exe

Luego de que hayamos concluido el proceso de instalación haciendo click en "Next>", como toda aplicación Windows, procedemos a instalar el plugin de flash, para ello ejecutamos éste código:

wine install_flash_player.exe

Ahora deberíamos de tener el ícono de Safari en nuestro desktop y además en el menu en la ruta: Applications->Wine->Programs->Safari, finalmente podemos probar el Safari visitando nuestro blog.

Safari