# MediaWiki

MediaWiki es un software para wikis libre programado en el lenguaje PHP. Es el software usado por Wikipedia y otros proyectos de la Fundación Wikimedia (Wikcionario, Wikilibros, etc). Ha tenido una gran expansión desde 2005 y existe un gran número de wikis basados en este software que no mantienen relación con dicha fundación, aunque sí comparten la idea de la generación de contenidos de manera colaborativa. Se encuentra bajo la licencia de software GNU General Public License.
MediaWiki puede ser instalado en los servidores web Apache, Internet Information Services, Cherokee, Hiawatha, LiteSpeed Standard (necesita la extensión Math), nginx, y lighttpd y puede usar como motor de base de datos MySQL/MariaDB, PostgreSQL y SQLite.
También se llama MediaWiki al espacio de nombres (ver más abajo) donde se hallan entre otras cosas los mensajes de su interfaz listos para su traducción a la lengua local de cada wiki, en caso de no estar todavía traducidos.

## Historia

MediaWiki fue desarrollado originalmente para Wikipedia por Magnus Manske, con el fin de sustituir a UseModWiki como motor del wiki (al que los colaboradores de Wikipedia llamaron "Fase I"). A la primera versión se la llamaba, simplemente "software de Wikipedia fase II."
A mediados de 2002 el programa fue reescrito y mejorado, dando lugar a la llamada "fase III", y ha seguido desarrollándose desde entonces a partir de ese código. El 29 de agosto de 2003 se bautizó al programa, hasta ese momento sin un nombre oficial, como "MediaWiki", un juego de palabras con el nombre de la Fundación Wikimedia, que patrocina su desarrollo. La primera versión con este nombre se llamó, entonces, "MediaWiki-stable 20030829". Se empezó entonces a pensar las nuevas versiones pensando en posibles usuarios ajenos a Wikipedia, mejorando especialmente en aspectos como la instalación del software.
El nombre "MediaWiki" es criticado en ocasiones por ser fácil de confundir con el de la fundación por parte de gente ajena a Wikipedia.

## Características

* A diferencia de los wikis clásicos, los nombres de las páginas no tienen por qué estar en CamelCase, lo que permite tener nombres más naturales.
* Espacios de nombres: permiten separar páginas de distintos tipos. Así, se puede tener un espacio de nombres para artículos, otro para plantillas, otro para debates, etc. que el software trata de distinta forma.
* Páginas de discusión: cada página del wiki tiene una página de discusión propia, dedicada a hablar de su mejora u otros fines.
* Soporte de TeX, para visualizar fórmulas matemáticas. Las fórmulas pueden mostrarse de varias formas, según las capacidades del navegador.
* Listas de seguimiento, de tal forma que cada usuario pueda seguir los cambios en los artículos de su interés.
* Sistema de plugins que permite extender fácilmente el software. Los plugins instalados se listan automáticamente en "Páginas especiales".
* Capacidad de bloquear temporalmente usuarios o páginas.
* Soporte de plantillas personalizadas con parámetros.
* Creación de líneas de tiempos a través de código wiki.
* Sistema de categorías jerárquico, que permite crear listados de artículos o de thumbnails de imágenes.
* Admite varios niveles de usuario, así como la posibilidad de que solo los usuarios registrados puedan editar, o de impedir el registro de más usuarios. Así, puede utilizarse como sistema de gestión de contenidos o como groupware.
* Soporte para almacenamiento de memoria virtual o caché, también conocidos como memcached y el sistema de caché Squid.
* Pieles o máscaras ("skins") personalizables por cada usuario.

## Control de ediciones de páginas

MediaWiki posee un servicio de alta disponibilidad que permite la edición de artículos de distintos usuarios vía HTTP siguiendo unas guías de estilo específicas. Es común que un usuario empiece a editar un registro y lo cancele o cierre la sesión sin haberlo guardado, por lo que no son factibles los bloqueos, y que no acceda ningún usuario mientras, por esta razón, no se bloquea en servicios HTTP, ya que se prima que todos los usuarios puedan acceder, aunque un usuario esté editando.
Esto lleva al punto de que dos usuarios puedan editar el mismo texto a la vez, lo que supondría un problema en caso de que ocurra, aunque no suele ser muy frecuente.
Por ello, la solución que ha implementado MediaWiki es el control de concurrencia optimista (OCC), definiéndose como un método de control de concurrencia que se aplica a sistemas transaccionales, es decir, se permite que un grupo de instrucciones de carga y almacenamiento se ejecuten en un camino atómico, proporcionando un alto nivel de abstracción que permita la coordinación de lecturas y escrituras simultáneas de datos compartidos en sistemas paralelos.
El funcionamiento de la OCC por definición asume que múltiples transacciones se pueden completar frecuentemente sin interferir entre sí, mientras se ejecutan, las transacciones se van ejecutando con normalidad y antes de hacer commit, cada transacción validará que ninguna otra ha modificado los datos que ha leído o escrito y en caso de entrar en conflicto, la transacción que iba a hacer commit hará un rollback.
Por lo tanto, si suponemos que dos usuarios van a editar la misma página, en cada uno de ellos se grabará un timestamp que marcará el inicio de la transacción, a continuación, cada uno modificará los valores correspondientes y escribirá nuevos datos, comprobará si hay otras transacciones que han modificado datos que se ha utilizado en dicha transacción y finalmente, a la hora de hacer commit, se comparará con la base de datos observará que hay un conflicto y normalmente anulará la transacción, aunque puede seguir otros esquemas de resolución como que se invoque a un algoritmo de resolución de conflicto, que en este caso va a ser que el último usuario concilie las diferencias entre el usuario anterior y el mismo.
Dada esta situación vamos a suponer que tenemos dos usuarios llamados Natalia y Paco, van a editar una misma página de MediaWiki, lo que puede ocurrir es:
* Natalia y Paco hacen grandes cambios: Lo que tendrían que hacer ambos es añadir una gran sección de texto y poner ambas informaciones, y una vez que esté hecho, echar un vistazo a las dos versiones y decidir entre los dos que versión es mejor
* Paco hace grandes cambios y Natalia hace pequeños cambios: En este caso, ella podrá optar por trabajar desde la versión de Paco y volver a fusionar sus cambios, agregando texto a través del conflicto de edición o la plantilla de mediawiki de editar conflicto advirtiendo a Paco que ha hecho eso, entonces este podrá revisarlo y tener la página con la información de ambos
Por cada usuario que esté modificando, aparecerá un cuadro de edición que contiene el texto que va a enviar ―subir― cada uno de los usuarios, por lo que se cree en la buena fe de los usuarios y que Natalia no pondrá su texto en la parte superior perteneciente a Paco.
Normalmente, los problemas conflicto de edición, se resuelven fusionando las contribuciones de los editores.