MariaDB vs MySQL

Si en su momento probé a comparar MySQL vs PostgreSQL (ganaba el primero en velocidad y el segundo en seguridad y estabilidad), ahora llega una comparación mucho más morboda: MariaDB vs MySQL.

Para los que no sepáis qué es MariaDB, se trata de un fork del SGBD MySQL. Cuando este fue compado por SUN Microsystems el creador de MySQL decidió hacer la guerra por su parte. Con la compra de Sun por parte de Oracle las alarmas sobre el futuro de MySQL saltaron, lo que hizo que el proyecto MariaDB cobrara fuerza.

La mayoría de las versiones de MariaDB están basadas en MySQL, lo cual les da la desventaja de ir siempre unas  semanas por detrás, pero la ventaja de que cuando sale su versión esta es como la de MySQL pero con los bugs corregidos y con algunas implementaciones propias de ideas recogidas de comentarios por la red de los usuarios de MySQL.

MariaDB ha sido pensado como un sustituto de MySQL, es decir, ha sido diseñado para que el usuario de MySQL pueda migrar a MariaDB con el mínimo conflicto. De hecho un cliente MariaDB puede conectarse a un servidor MySQL y viceversa. Si desinstalas tu versión de MySQL (manteniendo todos los scripts, bases de datos, procedimientos, vistas, etc) e instalas la versión de MariaDB con el mismo número (por ejemplo, si tenías MySQL 5.1.53 intalas MariaDB 5.1.53) todo funcionará igual. De hecho hay bancos de pruebas en los que afirman que es más fácil migrar los scripts de MySQL 5.0 a MariaDB 5.1 que a MySQL 5.1, yo no he probado, pero es info que viene de gente a la que respeto bastante en este terreno (y que saben bastante más que yo, que para eso son ingenieros).

Entre las ventajas que MariaDB aporta frente a MySQL está el que en el prompt del cliente está siempre visible a qué base de datos estás conectado, incluye mayor cantidad de motores de almacenamiento, al borrar una tabla es capaz de detectar si hay consultas que van a tirar de ella en las vistas y las elimina del plan de consulta (ganando velocidad y minimizando mensajes de error), permite usar «columnas virtuales» (calculadas y actualizadas en ejecución) y su caché segmentada permite un acceso más rápido a la misma.

Las ventajas de MySQL a día de hoy: el servicio técnico de pago en principio es más completo (el gratuíto creo que se lo cargaron hace un año) y siempre van a ir con unas semanas de ventaja en cuanto a actualizaciones (claro, con el handicap de que los bugs no estarán corregidos y en la de MariaDB sí).

Pero para mi, el punto que da la victoria a MariaDB es que sigue siendo totalmente libre (licencia GNU-GPL) mientras que MySQL ahora es «open core» (que suena a tienda del Corte Inglés).

Darwin Streaming Sever: Instalando y configurando en Linux

Sorprendentemente hoy voy a hablar de un producto de Apple. Bueno, medio producto de Apple porque no tiene soporte de Apple sino de la comunidad open source, pero se trata de un versión libre de un producto Apple. Darwin Streaming Server es la versión libre de QuickTime Streaming Server. Existe en versión para Linux y es de un uso muy simple, así que puede ser una opción muy interesante.

Si, por ejemplo, quieres montarte tu «radio on line» en una red local, para tus compañeros de trabajo o de clase, puedes hacerlo. Si quieres compartir vídeos en streaming con instrucciones y tutoriales también podrás. Podrías hasta hacerte tu youtube personal.

Antaño Apple ponía los binarios para Windows y Linux a descargar, pero a partir de la versión 6 debieron pensar «si quieres comodidad paga» y ahora sólo hay descargable la versión para Mac o el código fuente, por lo que te tocará bajar el código fuente y compilar (old school total, eh). Tranquilo, yo también me asusté pero el colega Brian Shaffer (bueno, digo yo que se llama Brian Shaffer el tío, por el nombre de la web, igual estoy metiendo la pata) ha dejado un par de scripts en su web. Aquí replico el de Ubuntu (hay otro para Debian):

#!/bin/bash
sudo apt-get install build-essential wget
sudo addgroup –system qtss
sudo adduser –system –no-create-home –ingroup qtss qtss

wget http://static.macosforge.org/dss/downloads/DarwinStreamingSrvr6.0.3-Source.tar
tar -xvf DarwinStreamingSrvr6.0.3-Source.tar
sudo mv DarwinStreamingSrvr6.0.3-Source DarwinStreamingSrvr6.0.3-Source.orig
wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-6.0.3.patch
sudo patch -p0 < dss-6.0.3.patch
sudo mv DarwinStreamingSrvr6.0.3-Source.orig DarwinStreamingSrvr6.0.3-Source
wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-hh-20080728-1.patch
sudo patch -p0 < dss-hh-20080728-1.patch

#need to answer n then y
cd DarwinStreamingSrvr6.0.3-Source
sudo mv Install Install.orig
wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/Install
chmod +x Install
sudo ./Buildit
sudo ./Install

Guarda esto en un script y ejecútalo como root, debería ir sin problema. Durante la instalación es posible que te pida un nombre de administrador y una contraseña. Simplemente introduce lo que corresponda (vamos, el nombre y la contraseña que quieras tener).

Ya debería estar instalado, ahora toca iniciarlo e iniciar el panel de administrador usando los comandos:

cd /usr/local/sbin/DarwinStreamingServer

/usr/bin/perl /usr/local/sbin/streamingadminserver.pl

Para acceder al panel de administrador conéctate al puerto 1220 del servidor y se os abrirá una pantalla de Login. Ahí ya podréis elegir y configurar las opciones que os interesen. Como hay muchas posibilidades ya os dejo a vuestra elección lo que queráis hacer. Podéis buscar información en la página de desarrolladores de Apple o en la página del IES San Clemente (tutorial elaborado por Rafa Veiga, que es un crack).

Implementar un árbol de datos genérico en VB.NET

Curiosamente Visual Basic .NET no incluye una clase de tipo árbol genérica, cosa que descubrí en mi último trabajo, donde me vi obligado a definir e implementar un árbol genérico con diversos métodos, incluyendo uno de búsqueda recursivo (que no incluiré en el ejemplo porque se basaba en los índices de la base de datos, por lo que no sería un método genérico), y que finalmente quedó a medio hacer por finalizarse mi periodo en la empresa.

El árbol genético en cuestión requiere de dos clases: una clase árbol y una clase nodo. La idea es que la clase nodo tenga una colección de otros nodos dentro (sus hijos), para crear la estructura de árbol. También tienen un método que dice si el árbol está vacío y si un nodo es una «hoja» (es decir, si carece de hijos). El método de búsqueda ya depende del tipo de árbol que quieras construir y de por qué propiedad quieras buscar, pero hay algoritmos generales por toda la red. Aquí os dejo el código de las dos clases:

Public Class Tree(Of T)
 Private m_Root As TreeNode(Of T) = Nothing
 <Description("El nodo raíz del árbol."), _
 Category("Data")> _
 Public Property Root() As TreeNode(Of T)
 Get
 Return m_Root
 End Get
 Set(ByVal value As TreeNode(Of T))
 m_Root = value
 End Set
 End Property

Public Sub Vaciar()
 m_Root = Nothing
 End Sub

Public Function IsEmpty() As Boolean
 If(Not m_Root Is Nothing)
 Return true
 End If
 Return false
 End Function

Public Function MakeRoot(ByVal node_item As T) As TreeNode(Of T)
 m_Root = New TreeNode(Of T)(node_item)
 Return m_Root
 End Function

Public Overrides Function ToString() As String
 Return m_Root.ToString()
 End Function
 End Class

Public Class TreeNode(Of T)
 Public NodeObject As T
 Public Children As New List(Of TreeNode(Of T))

Public Sub New(ByVal node_object As T)
 NodeObject = node_object
 End Sub

Public Function AddChild(ByVal node_item As T) As TreeNode(Of T)
 Dim child_node As New TreeNode(Of T)(node_item)
 Children.Add(child_node)
 Return child_node
 End Function

Public Shadows Function ToString(Optional ByVal indent As Integer = 0) As String
 Dim texto As String
 texto = New String(" "c, indent) & NodeObject.ToString & vbCrLf

For Each child As TreeNode(Of T) In Children
 texto &= child.ToString(indent + 3)
 Next child

Return texto
 End Function

Public Function IsEmpty() As Boolean
 If(Not Children Is Nothing)
 Return false
 End If
 Return true
 End Function

End Class

En fin, espero que este texto os sea de ayuda, suerte con la implementación de la búsqueda, que es lo más complejo, pero un árbol perfectamente equilibrado es una forma de optimizar tu programa y ahorrar recursos en las búsquedas.

Seguridad: Protege tu privacidad en sencillos pasos.

Es evidente que este mundo de internet no es todo lo seguro que debería, y que las leyes que pretenden «mejorarlo» no son más que excusas para hacerles el juego a determinados lobbies y multinacionales.

Nadie está libre de ser hackeado ni de sufrir un disgusto con sus datos en línea, pero aunque no se pueda conseguir una seguridad del 100% eso no quiere decir que no se puedan minimizar los riesgos, solo has de seguir estos consejos para disfrutar de las redes sociales y otros servicios de internet de forma segura:

  • Conéctate siempre en redes seguras. Intenta no utilizar redes públicas en la medida de lo posible, y si te estás enganchando sin permiso a la red del vecino asegúrate de que este no sea informático (tengo colegas que se han divertido mucho a causa de un vecino listillo que les estaba auditando la red).
  • En tu casa fortifica siempre tu red, y vigila que no haya intrusos en la misma. Es importante que nuestra red doméstica esté bien monitorizada, sobre todo con el advenimiento del IOT.
  • Mantén tu sistema operativo limpio de virus y malware. No hace falta que te gastes una pasta pero tampoco vayas por ahí sin antivirus. Recuerdo la frase de una «genia» de la informática que me decía «Los antivirus son una mierda, antes en el trabajo no tenía y funcionaba todo, ahora cada dos por tres me está dando avisos» (olé!!!! igual los datos de tu empresa ya los tienen a la venta hasta en un rastro de Taiwan, por guay).
  • Ten un sistema operativo seguro y siempre actualizado. Ya seas usuario de Android, Linux, Windows, Apple… da igual, las actualizaciones de seguridad siempre instaladas para minimizar riesgos. Ojo con los dispositivos IOT, que suelen ser vulnerables al tener pocas posibilidades de actualización.
  • Los pagos con tarjeta, por dios, siempre en páginas seguras. Si la página tiene el https tachado, publicidad de sitios porno y los alerts de windows salen en chino o en cirílico… pues mejor no pagues ahí. Ojo a las que te pidan tu contraseña de Paypal sin redirigirte antes a su plataforma. Puedes mirar esta guía para compras en línea.
  • Cuidado con lo que instalas. Bájate las cosas siempre de sitios de confianza, mejor de la web del fabricante que de páginas de terceros. En caso de apps para móviles mira siempre que tengan sentido los permisos que te solicitan.
  • Si transportas datos en un dispositivo de almacenamiento externo, tipo pendrive o disco duro, lo mejor es cifrarlo.

Esto son consejos generales, ahora me permito unos para redes sociales y foros:

El más importante para mi: Si no quieres que algo no sea público, no lo subas. Esto es así, todo lo que alojes en cualquier servicio es susceptible de acabar llegando a malas manos. Así que si hay algo que quieras mantener como privado, lo mejor es no publicarlo por muchas medidas de seguridad que pretendas ponerle. Recuerda esta máxima: la red no olvida, las cosas que subes no «se pierden en los mares de internet» sino que permanecen durante años almacenadas en servidores que no están bajo tu control. Añado además una serie de consejos:

  1. Soy partidario de separar tu actividad social en varias cuentas, no tanto por «ocultarse tras un pseudónimo» sino por mantener un poco separadas distintas esferas de tu vida. Además, ese pseudómino no te hace tan anónimo como crees, así que no digas nada desde esa cuenta que no dirías desde una que tuviese puestos públicamente tu nombre, apellidos, DNI y dirección.
  2. Para el curriculum utiliza un e-mail que sólo uses recibir información laboral, no mezcles ese correo con otras cuentas para intentar minimizar el spam.
  3. Ten una cuenta de correo «basura» para registrarte en redes sociales, foros o para usar en concursos on-line y otras chorradas que creas que pueden derivar en exceso de spam. Si tienes dudas del servicio pero quieres probarlo y necesitas un correo, esta cuenta «burn-out» es lo ideal.
  4. No subas fotos donde aparezcan terceras personas sin su permiso. Tampoco subas fotos tuyas si no estás muy seguro de que quieres que sean públicas a largo plazo. Si llegar a la paranoia tampoco, aunque hayas leído que a una profesora de Minnesotta la despidieron por poner una foto bebiendo un vaso de vino es improbable que eso te ocurra (además, en España no sería siquiera legal que lo hicieran).
  5. No des demasiada información sobre tu lugar de trabajo, empresa, dirección postal… Si estás en una red social orientada al empleo, como LinkedIn es normal que pongas tu lugar de trabajo, pero en Instagram o Twitter no suele ser relevante y podrías estar revelando demasiada información sobre ti.
  6. No aceptes amistad de nadie si no sabes quién es.
  7. Cuidado con las aplicaciones tipo «juegos«, «tests» y demás que enlazan con tus cuentas en redes sociales. Las aplicaciones de terceros podrían tener acceso a datos que no quieres que conozcan, recuerda que el escándalo de Cambridge Analítica vino por esas aplicaciones.
  8. Ten cuidado con las cosas que piden geolocalización, he visto conseguir la dirección de una persona simplemente cruzando datos de Foursquare con los de Facebook.
  9. Controla qué cosas están como públicas y cuales como privadas, aunque recordando la máxima que aunque estén como privadas no implica que estén totalmente seguras.
  10. Si tienes la opción de «resetar» tu cuenta (borrar los mensajes antiguos en masa), hazlo cada seis meses. Recuerda que lo escribes en la red queda en la red para siempre.
  11. Y recuerda, ten siempre una buena contraseña, una contraseña fuerte. Los servicios de gestores de contraseñas son muy cómodos para esto.

Y si no quieres seguir estos consejos pues haz como Richard M. Stallman, no tengas cuentas y no tendrás que preocuparte de casi nada (porque nada te libra de que otra persona cuelgue una foto tuya «comprometedora«, aunque también te contamos cómo actuar en ese caso.).

Recursividad: Función que calcula el factorial y programa que imprime una sucesión de Fibonacci en C o C++.

Soy débil, lo reconozco. No se decirle que no a los imperativos de una dama, tal vez por un primitivo impulso machista de querer impresionar y mostrarme como «el que todo lo soluciona», pero eso lo dejo en manos de psicoanalistas. El caso es que me han pedido que explique la recursividad en la programación, y para qué voy a explicarlo a una sola persona si puedo ponerlo aquí y que lo lea todo el que lo necesite (aunque la verdad, si lo buscáis en Google hay miles de ejemplos).

La recursividad es un recurso (qué «rebuznante» suena ponerlo así) muy potente a la hora de programar. Una función recursiva no es otra cosa que una función que se define en función de si misma. Dicho a sí a muchos os ha sonado a chino, ya que es un concepto muy abstracto, no es algo en lo que uno piense de forma natural, no es algo intuitivo. Citando la wikipedia la recursividad es

«…la forma en la cual se especifica un proceso basado en su propia definición.»

«Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser dividido en instancias más pequeñas (< N) del mismo problema y se conozca la solución explícita a las instancias más simples, lo que se conoce como casos base, se puede aplicar inducción sobre las llamadas más pequeñas y suponer que estas quedan resueltas.»

Simplificando al máximo la definición, a nivel de programación: la recursividad es una función que se llama a si misma. Cada vez que se llama a una función, se crea un juego de variables locales, de este modo, si la función hace una llamada a si misma, se guardan sus variables y parámetros, usando la pila, y la nueva instancia de la función trabajará con su propia copia de las variables locales. Cuando esta segunda instancia de la función retorna, recupera las variables y los parámetros de la pila y continua la ejecución en el punto en que había sido llamada.

Cuando estudié la recursividad en primero de DAI, los ejemplos que tuvimos que programar fueron dos: Una función que calcula un factorial y una función que calcula una sucesión de Fibonacci. Ambos son ejemplos clásicos.

Seguramente Taboada, mi profesor de Fundamentos de la programación me mataría por resolver así la función del factorial, porque siempre insistía en que «una función sólo puede tener una salida», pero después de tanto tiempo programando en VB.NET y en Java ya no me rompo la cabeza con eso y le pongo varias salidas aunque el ejemplo esté en C.


/*Función para un factorial, que recibe un entero*/

int factorial(int n) {
  if(n < 0) return 0; /*Si el número es negativo no se puede calcular el factorial*/
  else if(n > 1) return n*factorial(n-1); /* Recursividad, la función se llama a si misma */
  return 1; /* Si es igual a uno, devuelve uno y se termina la recursividad */
}

Podéis obviar la primera comprobación (la de si n<0) si en el main (o donde llaméis a la función por primera vez) ya comprobáis que no le estáis pasando un negativo (no se puede hacer el factorial de números negativos).

Sobre la sucesión de Fibonacci podéis informaros en ese link a la wikipedia, que es un coñazo explicarla. El programa que la calcula en C (y C++) sería el siguiente (esta vez pondré el programa completo y no sólo la función, porque da la casualidad que lo llevaba dentro del pendrive):

#include<stdio.h>

/*Programa que calcula una sucesión de Fibonacci*/
 void main(void)
 {
 int num=0;/*Entero que almace la cantidad de números a calcular*/
 int resultado=0;/*entero que almacena el resultado*/

printf("SERIE DE FIBONACCI\n");
 printf("Introduce la cantidad de numeros: ");
 scanf("%i",&num);
 printf("\t");

for(int i=0;i<=num-1;i++)
 {
   resultado = fibonacci(i);
   printf("%i ", resultado);
 }

printf("\n");
 }

/*****************************************************/
 /*Función que calcula la serie de Fibonacci*/
 int fibonacci(int n)
 {
 if (n<2)
  return n;
 else
  return fibonacci(n-1) + fibonacci(n-2);
 }

De nuevo pedir perdón por el sangrado, como en otras ocasiones, pero cuando hago copypaste desde Notepad++ o desde Notepad el wordpress no me mantiene la sangría (curiosamente desde GEDIT sí que lo mantiene, un minipunto para Linux). En todo caso, si copiáis y pegáis debería furrular.

En fin, y con esto os lego aquí este conocimiento que a mi me transmitió en su día el profesor José Taboada (aunque no estaría de acuerdo con la función del factorial, como dije antes). Espero que os sirva de utilidad.

Instalar Ubuntu en un Mac

Ok, te dejaste llevar por el glamour. Tenías el día gafapasta, te fuiste al Corte Inglés o a la tienda Apple y te compraste un MacBook. Te fuiste de guay durante tres meses «miradcomomolamimacestododealuminioasíquevalehastacomoarmadefensiva» pero tras ver comprometidos todos tus datos fundamentales y al haber intentado usar el ordenador para programa te has dado cuenta de que necesitas un sistema operativo de verdad. Tranqui, yo te lo soluciono. El haber gastado una pasta por tener una manzanita en la parte de atrás no, con eso tendrás que cargar toda tu vida, pero al menos podrás usar Ubuntu en tu equipo (ojo, todo esto lo he probado en una máquina virtual de VMWare, la teoría es que debería tirar sin problemas en un Mac con procesador Intel, y he visto un par de tutoriales que hacen algo similar y dicen que funciona sobre la máquina física, no lo he probado en una máquina física porque nadie me presta un mac para que trastee, cuando probéis por si acaso haced un backup de todo lo importante).

Los pasos a seguir son cuatro: Descubrir qué versión de Linux puedes instalar en tu mac, particionar el disco duro, instalar rEFIt e instalar ubuntu.

El paso uno te lo aclaran en los propios foros de Ubuntu donde podrás encontrar la info que necesitas para la instalación. Comprueba qué versión de MacBook tienes y bájate la distri de Ubuntu que consideres.

Particionar el disco duro no te va a dar muchos quebraderos de cabeza, dado que cuando Jobs se abrió de piernas frente a Bill Gates para que le salvara de la ruína a finales de los 90 se empezó a sopesar la posibilidad de instalar windows en un Mac. Gracias a eso dispones en tu sistema MacOS de Boot Camp, una aplicación que te permite fácilmente particionar el disco duro . Bueno, fácilmente en cuanto a facilidad de uso porque en la VM el programa no tiraba muy bien, y necesité varios intentos, pero el uso es simple: A un lado la partición del MacOS y al otro la nueva, en medio puedes picar y arrastrar para agrandar una y acortar otra. Luego simplemente es darle al botón particionar.

Tras la partición, y nunca antes, toca instalar rEFIt. Te lo puedes bajar de Sourceforge  ya que es software libre. Una vez instalado reinicias y verás que te muestra una bienvenida donde seleccionar el SO.

Si metes el disco de arranque de Linux te dejará seleccionarlo rEFIt como inicio, así que deste ahí lanzáis el cd y procedéis a la instalación de Ubuntu. Procedéis como en una instalación normal pero al llegar al punto de establecer las particiones lo hacéis manualmente, intentando utilizar las mínimas posibles (hay quien dice que en este tipo de instalación no se necesita SWAP pero yo, por si acaso, la utilizaría, yo en mi prueba puse SWAP y una partición para «/»). Al acabar elegid las opciones avanzadas e instalad sólo en la partición de Ubuntu el GRUB, para que no interfiera con el rEFIt en el arranque.

Una vez terminada la instalación te puedes encontrar con que hay cosas que no funcionan. No panic, man, no panic. En el enlace que te di arriba para que comprobaras qué versiones podías instalar en tu MacBook puedes clickar sobre lo que has instalado y ver qué drivers pueden faltar y hay que instalar a mano (ya vienen los comandos a lanzar desde el terminal para arreglar el problema).

Y con esto y un bizcocho deberías tener ya un sistema operativo libre corriendo sobre el equipo paradigma del capitalismo y el software privativo. Si tenéis un Mac old school, de cuando llevaban procesadores PPC y eran realmente unos pedazo equipos podéis intentar los mismos pasos utilizando una distri de Linux para procesadores PPC. Creo que en Ubuntu dejaron de dar soporte a PPC en la 9.10 (dato no confirmado, me suena haberlo leído en su día, pero su día habría sido hace dos años) pero todavía puedes encontrar distros para esos procesadores (que según Jobs «se calientan mucho», homenomejodas, que le daban mil patadas a los Intel).

Remapear el teclado (Windows y Linux)

Mucha gente puede no verle la utilidad a remapear un teclado. Yo hace dos años no se la habría visto, pero cuando una camarera torpe vertió cocacola sobre mi portátil y me jodió las teclas de shift izquierda y control. El shift va dando un poco igual, me queda el derecho y la tecla de bloqueo  de mayúsculas, pero el control ya me jodía, porque el portátil sólo tiene una tecla de control. Y ahí me busqué la vida para aprender a remapear un teclado en Windows Vista. También se del caso de un listillo que pilló un portátil tirado de precio en ebay, y luego se encontró que era un portátil alemán y el teclado era QWERTZ en lugar de QWERTY.  Aquí os dejo cómo hacerlo tanto en linux como en Windows.

  • Windows: La web 140Geek recomienda el uso de SharpKeys. Yo lo que utilicé fue KeyTweak, y no creo que merezca mucha explicación el uso de dicho programa porque es bastante simple e intuitivo. Te muestra un mapa de tu teclado, picas sobre la tecla que quieres cambiar y en un combo eliges la función que quieres que tenga ahora. Pulsas aceptar para seguir y vía, tirado.
  • Linux: En Linux es un poco más complicado, pero tiene la ventaja de que no tienes que instalar nada dado que el propio sistema te permite mapear el teclado. Lo primero que necesitamos es conocer el código de la tecla, que podemos conseguir si en el terminal escribimos el comando xev el cual nos abrirá una ventanita para pruebas. Si pulsas una tecla mientras se está ejecutando xev te devolverá un texto de cinco líneas en principio bastante incomprensible. Tranqui, tu busca por medio y verás que en un sitio pone keycode seguido de un número. Memoriza bien ese número y ejecuta el comando xmodmap -e «keycode ElNúmeroEnCuestión = La tecla que quieres que sea». Por ejemplo, para convertir la tecla de Windows izquierda en el espacio sería xmodmap -e «keycode 134 = space «(ojo, en mi teclado la tecla de windows es la 134, en otro teclado puede ser otra).

Otras opciones… podéis tirar el portátil, pagar al servicio técnico, enchufarle un teclado por usb e inhabilitar el que está escarallado,etc. Eso ya depende de vosotros, pero el remapeo es una opción barata. Todo depende, claro, de qué tecla se haya estropeado. Supongo que en determinados casos el arreglo compensa.

Instalar SCUMMVM en Linux (porque yo lo valgo)

Voy a hacerle la competencia a Aerilon (la verdad es que no he comprobado si ya había una entrada sobre esto en su blog) y voy a dar una pequeña y rápida lección de cómo instalar ScummVM en Linux, que os permitirá utilizar en vuestro sistema libre los juegos de LucasArts creados para el motor Scumm (Maniac Mansion, El Día del tentáculo, la saga Monkey Island…).

Lo primero es crear un directorio para guardar los juegos y otro para las partidas salvadas.

mkdir /home/$TuUsuario/scummvm

mkdir /home/$TuUsuario/scummvm/juegos/

mkdir /home/$TuUsuario/scummvm/savedGames

Lo siguiente, claro, es descargar el scumm (bueno, podrías haber hecho esto antes que lo anterior.

sudo apt-get install scummvm

Ya está todo lo difícil (eso era lo difícil, sí, así que imaginaos la parte fácil… bueno, no la imaginéis porque viene a continuación). Ahora sólo nos queda ejecutar el Scumm y configurarlo.

Bueno, tras ejecutar el programa os llevará a una consola para seleccionar juego e iniciar. Sólo tenéis que pulsar Add Game y buscar el directorio donde está el .exe del juego (el que deberías haber creado en el paso uno). Una vez seleccionado el juego pulsamos «Choose».

Ahora nos saldrá una pantalla con varias pestañas para configurar el juego. En la primera (GAME) podemos configurar lo más básico, como con qué nombre aparecerá en el menú, en qué plataforma se ejecuta (normalmente suele ser DOS) o el idioma.  En la pestaña PATHS podéis elegir la ruta para las partidas guardadas (directorio que también hemos creado en el paso uno). El resto son la configuración gráfica y de sonido. A mi siempre me ha funcionado bien a la primera, así que primero probad, y si va bien pues sin problema. Si tenéis algún conflicto de sonido o gráficos ya tenéis que trastear por ahí, pero si habéis configurado alguna vez las opciones de sonido y gráficas de un viejo juego de MS-DOS no deberíais tener ningún problema.

Y así ya está instalado ScummVM en vuestro sistema. Si tenéis los juegos originales podéis desempolvar el viejo cd y jugar, por cierto. Y si no, a buscarse la vida toca.

Implementar Trim, LeftTrim y RightTrim en Javascript

Todo informático ha tenido que pelearse alguna vez con los espacios en blanco que a algunos usuarios les da por meter antes o después de una cadena de texto. Prácticamente todos los SGBD y varios lenguajes implementan la función trim, que simplemente elimina dichos espacios (trim a ambos lados, leftTrim a la izquierda y rightTrim a la derecha). Por desgracia Javascript no incorpora este método, pero don’t worry, que aquí estoy yo para echaros una mano. Porque haciendo uso de una expresión regular esto se soluciona con dos líneas de código por cada función.

//Función trim

function trim(strAModificar)
{
return strAModificar.replace(/^\s+|\s+$/g,"");
}

//Función rightTrim

function righTrim(strAModificar)
{
return strAModificar.replace(/\s+$/,"");
}

//Función leftTrim

function leftTrim(strAModificar)
{
return strAModificar.replace(/^\s+/,"");
}

En las versiones más antiguas de Javascript, que no soportaban expresiones regulares, la cosa era un pelín más coñazo (tenías que hacer un bucle for que fuera haciendo substrings eliminando la última letra o la primera letra si era un espacio en blanco), pero a partir de la versión 1.2 ya véis que no tiene problema alguno.

Implementar la función Split en Transact-SQL

Prácticamente todos los lenguajes de programación que tienen un tipo de datos string tienen una función split. Dicha función recibe como parámetro una cadena o un caracter con el separador que queremos usar y corta la cadena sobre la que lo aplicamos por ese caracter, devolviendo generalmente un array de cadenas. Es decir, si tenemos una cadena «hola, soy, Manolito» y aplicamos un split que recibe como parámetro la coma («,») obtendríamos un array que tendría en su posición cero «hola», en su posición uno «soy» y en su posición dos «Manolito».

El caso es que en T-SQL no existe esta función, una soberana putada porque muchas veces nos va a hacer falta. Imaginad que desde un programa le tenéis que pasar un array de enteros para una comprobación ¿cómo lo hacéis? Pasáis el array a una cadena y lo metéis como parámetro, ok. Pero en ese caso lo que tenéis como parámetro no es una array de enteros, sino una cadena con enteros, y para determinadas comparaciones puede fallar. Pero tranquilos, implementar la función split no es difícil.

CREATE FUNCTION Split(@Cadena varchar(150), @Limite char(1))
RETURNS @Resultado table (word varchar(50))
AS
BEGIN
  DECLARE @Indice INT
  DECLARE @AUXILIAR varchar(200)
  SELECT @Indice = 1

  WHILE @Indice !=0
  BEGIN
    SELECT @Indice = CHARINDEX(@Limite,@Cadena)
      IF @Indice != 0
        SELECT @AUXILIAR = LEFT(@Cadena,@Indice - 1)
      ELSE
        SELECT @AUXILIAR = @Cadena

      insert into @Resultado(word) values(@AUXILIAR)

      SELECT @Cadena = RIGHT(@Cadena,LEN(@Cadena) - @Indice)
      IF LEN(@Cadena) = 0 BREAK
  END

RETURN
END

Si copiáis y pegáis debería funcionar a la perfección (sólo la he testeado en SQL-Server pero debería tirar en MySQL, PostgreSQL y, en general, en todos los SGBD que tiren de T-SQL). Edito para comentar que obviamente esto devuelve una tabla, no un array ni un string.