miércoles, 24 de septiembre de 2014

Cómo usar SVN


Introducción

SVN es un sistema de control de versiones usado para que varios desarrolladores puedan trabajar en un mismo proyecto en forma más o menos ordenada. Tiene una arquitectura cliente servidor con controles de concurrencia para cuando varios desarrolladores estan trabajando en el mismo archivo y funciona más o menos así. En algún servidor se monta un repositorio SVN. En este lugar se van a registrar los cambios (revisiones) y los logs que se vayan generando. El cliente de SVN se baja una copia local de alguna revisión (generalmente la última), el desarrollador hace los cambios y los sube al servidor para que esten disponibles para los otros desarrolladores (además de generar un log con un comentario de que cosa modifico, para que, etc, etc, etc). La parte de configuración y puesta en marcha del servidor la dejo para otro documento y vamos a la parte importante, como usar el cliente de svn (desde la terminal). Para este documento usaré ~# como indicador de shell de root y ~$ como shell de usuario.

Instalando subversion

Primero, hay que instalar un cliente de svn. En Lihuen eso se puede hacer instalando el paquete subversion desde Synaptic o simplemente corriendo desde una terminal con permisos de root los siguientes comandos:
~#apt-get update
~#apt-get install subversion
Una vez que tengamos instalados y configurados estos paquetes, creamos una carpeta en nuestro $HOME donde guardaremos nuestra copia local del repositorio.
~$ mkdir /$HOME/svn
En este ejemplo, si el usuario es pepito, mkdir creara un directorio en /home/pepito/ llamado svn. Ahora entramos al directorio que creamos recién.
~$ cd ~/svn

Haciendo el checkout

Para obtener una copia del trabajo tenemos que conocer la ubicación de un repositorio en internet. Uno bueno para probar es el mismo del proyecto SVN donde podremos obtener una copia del código fuente del mismísimo SVN. Eso se hace de la siguiente manera
~/svn$ svn co http://svn.collab.net/repos/svn
El subcomando co tiene el mismo efecto que(de hecho, es un alias para) el subcomando checkout, asi que es lo mismo que poner
~/svn$ svn checkout http://svn.collab.net/repos/svn
Hay que tener en cuenta que esto puede tardar un buen rato, dependiendo de la velocidad de conección. Una ves terminado el proceso de descarga ya podemos empezar a modificar los archivos fuente. Generalmente, un repositorio estándar bien armado publica tres carpetas. Trunk, donde van los cambios principales y el hilo principal de desarrollo, branches, donde se introducen cambios importantes con respecto al desarrollo principal y tags, donde se congelan los cambios para una determinada versión. (Esto debería estar mejor explicado en el documento sobre configuraciones del servidor SVN) A medida que introducimos modificaciones, por ejemplo en la rama trunk, el estado de nuestra copia con respecto al repositorio original cambia. Podemos ver el estado de la copia de trabajo con el subcomando status
~/svn$ cd svn
~/svn/svn$ svn status
A    svn/trunk/subversion/tests/cmdline/svneditor.bat
M    svn/trunk/subversion/tests/cmdline/import_tests.py
!    svn/trunk/subversion/tests/cmdline/svnadmin_tests.py
?    svn/trunk/subversion/tests/cmdline/log_tests.py
D    svn/trunk/subversion/tests/cmdline/special_tests_data
C    svn/trunk/subversion/tests/cmdline/special_tests_data/bad-special-type.dump
Y asi. Los códigos de la izquierda son los indicadores de estado, y se pueden ver con
~/svn$ svn help status
Los pasteo aquí como referencia los más relevantes.
     ' ' no hay modificaciones
     'A' Agregado
     'C' Presenta conflicto
     'D' Eliminado
     'I' Ignorado
     'M' Modificado
     'R' Reemplazado
     'X' Este ítem no está versionado, pero es usado por una
         definición de externals
     '?' el ítem no está bajo control de versiones
     '!' ítem faltante (removido por un comando ajeno a svn) o incompleto
     '~' ítem versionado obstruido por algún otro ítem de un tipo diferente
     'L' Copia bloqueada
 
La información de actualización aparece en la octava columna (con -u):
     '*' hay una nueva revisión en el servidor
     ' ' la copia de trabajo está actualizada

Los campos restantes son de ancho variable y están delimitados por espacios:
   La revisión de trabajo (con -u o -v)
   La ultima revisión que se hizo commit y su autor(con -v)
   La ruta de copia de trabajo siempre es el último campo, para que
   pueda contener espacios en blanco.

El subcomando help

Lo anterior nos introduce al subcomando help. Con:
~/svn$ svn help subcomando
Podremos ver la ayuda para el subcomando subcomando. Incluso en Lihuen, con bash_completion, si presionamos la tecla tab despues de poner svn help o svn , nos mostrará todos los posibles subcomandos.

Subiendo los cambios

Una ves que modificamos un archivo, si corremos el subcomando status nos debería mostrar la ruta al archivo precedido por la letra M indicando que fue modificado. Para compartir los cambios con los demás desarrolladores es necesario subir los cambios al repositorio. Esto se hace con el subcomando ci.
~/svn/svn$ svn ci
SVN necesita un comentario acerca de el o los archivos que se estan subiendo, por lo que abrirá el editor de texto por defecto. Una ves ingresado el comentario y guardados los cambios, iniciará el proceso de subida de archivos. Si el comentario no es muy largo y se quiere evitar el paso del editor, se puede introducir el comentario en la misma invocacion a ci.
~/svn/svn$ svn ci -m "Agregado el archivo foo.src; Modificado el archivo bar.src para proveer la funcionalidad pedida"
Es posible que el repositorio no deje subir cambios salvo a usuarios registrados. Si este fuera el caso necesitará un usuario:contraseña para poder subir los cambios. El subcomando ci es en realidad un alias para commit, por lo ke poner uno u otro produce el mismo resultado.

Agregando archivos nuevos

Cuando se crean archivos o carpetas que no existian en la copia bajada del repositorio, en necesario agregarlas al control de versiones. Si corremos el subcomando status despues de haber creado archivos nuevos, aparecerán precedidos por un carácter ?, indicando que son archivos o carpetas desconocidas. Para agregar un archivo o una carpeta y todo su contenido al control de versiones se usa el subcomando add
~/svn/svn$ svn add archivo.src carpeta/
Cuando se agregan direcctorios al control de versiones, se ignorarán los archivos terminados en ~, ya que se asume que son backups. Los archivos seran agregados al repositorio en el siguiente commit.

Borrando archivos

De la misma forma que se pueden agregar archivos, se pueden borrar.
~/svn/svn$ svn delete archivo.src carpeta/
Este comando marcará para borrar el archivo archivo.src y la carpeta carpeta/ Si archivo.src o algún archivo dentro de carpeta/ fueron modificados, no se borrarán a menos que se indique el parámetro --force. Los archivos o carpetas seran borrados cuando se haga el commit. Son alias para delete, rm, del y remove.

El subcomando update

Cada vez que volvemos a trabajar sobre una copia de un repositorio pasado cierto tiempo, es necesario asegurarnos de que estamos trabajando sobre la última copia del repositorio. Para esto corremos el subcomando update
~/svn/svn$ svn update
En la revisión 106.
~/svn/svn$
Si hay archivos nuevos, se mostrarán precedidos por una A. Hay otros códigos que marcan diferentes estados para archivos y carpetas. Los mas reelevantes son:
   A  Añadido
   D  Borrado
   U  Actualizado
   C  Conflicto
   G  Combinado
Para detalles pruebe svn help update Un archivo marcado como Combibado indica que dos o más desarrolladores lo modificaron en diferentes lugares. Un archivo marcado como Conflicto indica que dos o más desarrolladores lo modificaron en la misma línea. Más adelante veremos como resolver conflictos en archivos. Además el subcomando update nos permite copiarnos una revisión particular.
~/svn/svn$ svn update -r 104
En la revisión 104.
~/svn/svn$

Viendo el historial de cambios

Puede ser de utilidad saber que usuario modificó cierto archivo y que cambios realizó. Para esto se usa el subcomando log
~/svn/svn$ svn log
Esto mostrará todos los comentarios de cada uno de los commits hechos al repositorio. La salida de este comando puede ser muy larga, dependiendo del número de revisiones que tenga el repsoitorio. Para ver los logs de un número limitado de revisiones se puede usar el argumento -r
~/svn/svn$ svn log -r 31:35
Mostrará solamente los logs de las revisiones 31 a 35. Para ver además las rutas de los archivos modificados se puede usar el argumento -v Aquí es donde se nota la importancia en la calidad de los comentarios. Cuanto más claro sea el comentario, menos líneas de mail o chat intercambiaremos con el resto de los desarrolladores preguntando por que es lo que hicieron en la última actualización.

Viendo las diferencias entre versiones

Para ver los cambios realizados a un archivo en particular entre la versión actual y la anterior pordemos usar el comando svn diff, algunas de las opciones son:
$svn diff nombre_archivo
Este comando indica las diferencias entre la versión del svn actualizado y la copia local nuestra.
$svn diff -r rev1:rev2 nombre_archivo
De esta forma podemos ver las diferencias entre dos versiones específicas, rev1 es la mas vieja y rev2 es la versión mas nueva contra la que queremos comparar.

Cambiando el lugar donde se hacen los cambios

A veces, la raíz del repositorio cambia de nombre, o de puerto. Sin embargo, cuando svn hace updates o commits, los hace contra el nombre antiguo. Es en estos casos cuando usamos el subcomando switch.
~/svn/svn$ svn switch --relocate ruta_al_repo_antiguo nombre_del_repo_nuevo

Realizando un export

Si deseamos trabajar con los archivos fuera del ambiente svn, podemos exportar para evitar copiar los archivos ocultos svn mediante el subcomando export
~/svn/svn$ svn export carpeta_origen carpeta_destino 
La carpeta destino no debe existir.

Etiquetando una versión

El etiquetado de versiones sirve para estabilizar los cambios de la rama trunk. Es como sacar una foto del proyecto y agregarle un nombre para que a partir de ese momento se lo conozca así. Así por ejemplo, la revisión 297 pasará a llamarse miprograma-version-0.5-1.
Para taguear una versión basta con correr el siguiente comando
~/svn/svn$ svn copy http://nombre_del_repo/trunk -r #revisión http://nombre_del_repo/tags/nombre-de-la-etiqueta -m "comentario"
Si se quiere etiquetar la ultima revisión se puede omitir el parámetro -r
Con el uso de SVN descubrimos que existe una mejor manera de taguear versiones, que consiste en hacer primero un export y luego un add.
Esto tiene dos principales ventajas. La primera es que el tag no entra al árbol svn inmediatamente (solo entra después de que se hace el add) y la segunda es que permite tener tags privados que no necesariamente tienen que agregarse al árbol después.

Excluyendo archivos

Si en el directorio que estamos trabajando se generan o agregamos manualmente tipos de archivos que no queremos subir al repositorio svn podemos generar una lista que los excluya. Nos posicionamos en el directorio de trabajo y ejecutamos en comando:
svn propedit svn:ignore .
Se abrirá un editor que permite listar por ejemplo:
*.aux
*.log
Guardamos y actualizamos, de esta forma de ahora en mas los archivos con las extensiones. aux y log, no se subirán al repositorio


Referencias

Libro de SubVersion en español (alcanza para empezar)
http://svnbook.red-bean.com/nightly/es/index.html
Libro de SubVersion en inglés (más actulizado)
http://svnbook.red-bean.com/

martes, 23 de septiembre de 2014

MediaWiki Error: “Parse error: syntax error, unexpected T_NAMESPACE, expecting T_STRING


After upgrading my PHP to 5.3.2, I received the following error when accessing MediaWiki (1.6.12):
Parse error: syntax error, unexpected T_NAMESPACE, expecting T_STRING in /usr/local/www/apache22/data/wiki/includes/Namespace.php  on line 46
There are three solutions:
  1. Downgrade your PHP from 5.3 back to 5.2
  2. Upgrade your MediaWiki to a newer version.
  3. Fix the codes.
In my case, the first couple solutions do not work for me, and therefore I choose 3.
  1. Backup your wiki file first.
  2. Access your webserver and go to the MediaWiki/includes directory.
    For example:
    cd /usr/local/www/apache22/data/wiki/includes
  3. Edit Namespace.php
    nano Namespace.php
  4. Go to line 46, change the following from:
    class Namespace {
    to:
    class MWNamespace {
    Save the file.
  5. Now, let’s create a script:
    nano wikifix.sh
    Copy and paste the following:

    for fl in *.php; do
    mv $fl $fl.old
    sed 's/Namespace::/MWNamespace::/g' $fl.old > $fl
    done
    Save the file.
  6. Change the file to executable by:
    chmod u+x wikifix.sh
  7. Search the keyword Namespace:: and replace it by MWNamespace:::
    ./wikifix.sh
    Warning: Don’t run the script twice!
  8. Delete the script.
    rm wikifix.sh

viernes, 12 de septiembre de 2014

Red Hat: Cómo incrementar la SWAP

Extraido de la pagina: 
http://orlandoolguin.wordpress.com/2011/11/08/red-hat-como-incrementar-la-swap/

En este post, veremos cómo se puede incrementar el tamaño del área Swap de Red Hat Enterprise Linux. Posiblemente pueda aplicar a otros linux, pero para eso, tendrán qué validarlo.

Nota. Antes de comenzar es preciso recalcar que estas operaciones, se deben hacer con el usuario root, y que la forma de incrementar el tamaño de la Swap, es por medio de la creación de un archivo que sirva de espacio alterno para esta.

Verificar tamaño actual

Vamos a comenzar, para hacer esto, primero tenemos qué saber qué tamaño tiene la Swap en este momento. Para hacer esto, se usa el siguiente comando:

free -m

En nuestro ejemplo:
 
[root@metallilaptop opt]# free -m
             total       used       free     shared    buffers     cached
Mem:          8106        613       7492          0        114        302
-/+ buffers/cache:        196       7909
Swap:         5023          0       5023

Como se puede apreciar, en la computadora donde lo estoy corriendo, se tienen 5,023 Mb de espacio en ésta área. Una forma alterna de ver este dato, es por medio del comando:

grep SwapTotal /proc/meminfo

por ejemplo:
 
[root@metallilaptop opt]# grep SwapTotal /proc/meminfo
SwapTotal:     5144568 kB

Crear archivo extensión

Ya que se ha determinado de qué tamaño se requiere la extensión, hay que crear un archivo que sirva como extensión al tamaño de la Swap. Para esto, se usa el siguiente comando:
 
dd if=/dev/zero of=/opt/archivo_ext_swap bs=1k count=cantidad_de_kb

Por ejemplo:
 
[root@metallilaptop opt]# dd if=/dev/zero of=/opt/extension_swap bs=1k count=3156992
3156992+0 records in
3156992+0 records out
3232759808 bytes (3.2 GB) copied, 18.7375 seconds, 173 MB/s

con esto, ya en /opt está creado un archivo llamado extension_swap con un tamaño de 3,083 Mb. Este archivo, debe tener privilegios 600 como se ve a continuación:
 
[root@metallilaptop opt]# chmod 600 extension_swap
[root@metallilaptop opt]#

Convertir extensión en Swap

El archivo que se creó en el punto anterior, no funciona por sí solo como una extensión de la Swap, para eso, hay que aplicarle el comando:
 
mkswap nombre_de_archivo

por ejemplo:
 
[root@metallilaptop opt]# mkswap extension_swap
Setting up swapspace version 1, size = 3232755 kB

Añadir espacio a la Swap

Ya que está el archivo listo para usarse como extensiónd de la Swap, basta con activarlo con el comando:
 
swapon /opt/archivo_ext_swap

por ejemplo:
 
[root@metallilaptop opt]# swapon /opt/extension_swap
[root@metallilaptop opt]#

Verificar el nuevo tamaño

Ya que se activó la extensión de la Swap, hay que verificar que ya se ha incrementado el tamaño:
 
[root@metallilaptop opt]# grep SwapTotal /proc/meminfo
SwapTotal:     8301552 kB
[root@metallilaptop opt]#
[root@metallilaptop opt]# free -m
             total       used       free     shared    buffers     cached
Mem:          8106       3738       4367          0        114       3385
-/+ buffers/cache:        238       7867
Swap:         8106          0       8106

¿Ya fue todo?

Esta configuración que se acaba de hacer, funciona nada más para la presente sesión. Una vez que sea reiniciada la computadora o que se apague, la siguiente vez que arranque, la Swap tendrá el tamaño original ignorando la extensión que se agregó.

Para evitar esta situación, se tiene que automatizar que cada vez que inicie el sistema operativo, se habilité la extensión que se creó.

En este caso, en Red Hat Enterprise Linux, se hace uso del archivo rc.local que se encuentra localizado en /etc/rc.d, para agregar la instrucción swapon.

Por ejemplo:


[root@metallilaptop ~]# cd /etc/rc.d
[root@metallilaptop rc.d]# more rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
no tiene la instrucción; y después de editar con el vi:
[root@metallilaptop rc.d]# vi rc.local
[root@metallilaptop rc.d]#
[root@metallilaptop rc.d]# more rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

swapon /opt/extension_swap
 
Con esto, se asegura que cada vez que inicie la computadora, se agregue la extensión a la Swap de manera automática.
Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.