Alternativas a MySQL

Quien diría que Oracle se convertiría en el nuevo enemigo público del Open Source, luego de que Microsoft haya caído en la casi total irrelevancia. El día de hoy leyendo un artículo de Ars Technica titulado "Solaris todavía con un cierto tipo de libertad, pero la distribución OpenSolaris está muerta", me enteré de la última arremtida de Oracle contra el Open Source, que sumado a la demanda que interpuso contra Google por Android, ha originado que algunos hablen de una política empresarial por parte de Oracle, que tendría por objetivo destruir el Open Source.

Lo curioso es que algunos hablen en la disputa Oracle/Google a favor de Google, como si este fuera el defensor de la libertad, cuando justamente en estos días el trato entre Google y Verizon ha recibido una lluvia de críticas por parte de los defensores de la net neutrality. Y Oracle se está dando cuenta de que comprar Sun Microsystems, no fue un buen negocio después de todo y está rascando la olla a ver que saca.

Ante todo recordemos que en este juego no hay buenos y no hay malos, aunque si nos ponemos exquisitos podríamos hablar de los malos y los menos malos. Pero todo eso es una cuestion de perspectiva, esta es una batalla de megacorporaciones por el control de los negocios del futuro. Así que no se sorprendan si luego ven que Google y Oracle se unen para pelear contra Facebook y Microsoft.

Pero a lo que ibamos, que alternativas hay si Oracle decide que no le dará soporte a MySQL, o que comenzará a cobrar por el popular programa de base de datos. Pues bien tenemos varias alternativas, entre ellas:

Postgresql, algunos la llaman la verdadera base de datos libre, otros dicen que es el único rival serio que tiene Oracle. Fue la primera base datos Open Source que utilicé alla por 1998. Pero con su reducida y fragmentada comunidad está muy atras de MySQL, aunque para la gran mayoría de situaciones podría reemplazar fácilmente a MySQL.

mSQL, o miniSQL. Como su nombre lo indica claramente no tendrán todas las cosas que MySQL o PostgreSQL puede ofrecer, pero es mucho más rápida que MySQL y toda la información está contenida en un sólo archivo. Una ventaja es que PHP incluye soporte nativo para mSQL, con lo cual resulta fácil reemplazar a MySQL en aplicaciones que no demanden mucho tráfico.

Driezzle, es un MySQL a dieta y optimizado para volver a lo básico, es decir una base de datos veloz y orientada a aplicaciones web, que fue juztamente la razón por la cual MySQL se volvió popular, pero que son características que han quedado relegadas en las útlimas versiones. En este tutorial encontraran claramente explicado como compilar e instalar Driezzle, además de como activar el soporte PHP para esta veloz base de datos.

MariaDB, es un fork de MySQL luego de que se anunciara la adquisición de Sun por parte de Oracle y los miembros del equipo MySQL temieran lo peor. El líder del proyecto Michael "Monty"  Widenius, es el autor de la versión original de MySQL. En teoría MariaDB debería ser la "opción oficial", si Oracle decide matar a MySQL. En el website OurDelta, se puede encontrar versiones de MariaDB y MySQL-5.0,  listas para las distribuciones más importante de hoy día Debian, Ubuntu, RedHat/Centos.

Se acaban aquí las opciones a MySQL, pues no. Hay muchas más alternativas, pero he mencionado sólo estas para calmarle los nervios a todos aquellos que creen ver el final del LAMP si Oracle le baja el dedo a MySQL.

¿Quieres ganar $3000?

Firefox es sin duda el browser que más resplando tiene en la comunidad de software libre, está presente en casi todas las distribuciones de Linux y es el principal contendor de Microsoft Internet Explorer, debido principalmente a su gran base de extensiones (addons o plugins como querramos llamarlas), que permiten agregar características al navegador. Sin embargo es sin duda esa flexibilidad la que abrió la puerta a una serie de ataques ultimamente que le valieron un comentario muy crítico respecto a lo inseguro que es usar Firefox en Hispasec.

Pues bien Mozilla ha decidido resolver el problema de una manera diametralmente opuesta a la que ha seguido Steve Jobs en el escandaloso caso de "Antenna-gate", nombre con el que la crítica especializada ha bautizado al problema que tiene el iPhone 4 con su antena y como Apple ha negado la existencia del problema desde el principio. Pues volviendo al caso de Firefox, Mozilla Foundation ha decidido elevar el monto de la recompensa por los errores encontrados y reportados de $500 por error a $3000 por error.

Los requisitos para cobrar los $3000 son los siguientes:

  • El error (bug) reportado debe ser original y no puede haber sido previamente reportado.
  • El error debe ser remotamente explotable.
  • El error reportado debe estar presente en la versión más reciente soportada, en el beta o el release cadidate en los siguientes productos: Firefox, Thunderbird, Firefox Mobile, o en los servicios que ofrece Mozilla que pudiera comprometer a los usuarios de los productos anteriores.
  • Los errores presentes en programas de terceros (esto incluye a las extensiones o plugin), están excluídos del programa de recompensas.

Ya saben, si desean ayudar a la comunidad de software libre y en el proceso ganar $3000 pueden comenzar a hackear Firefox en busca de 0-day exploits, suerte en su cacería de la recompensa de Firefox.

UPDATE (21/07/2010): Google siguiendo a Mozilla Foundation ha anunciado ayer que el premio por reportar una falla de seguridad explotable remotamente en Chromium ahora tendrá una recompensa de $3,133.70 detalles sobre el incremento pueden ser encontrados en el Blog de Chromium.

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.

Usando el API de bit.ly con CodeIgniter

Como habrán notado soy un fanático de CodeIgniter, un framework ligero, fácil de aprender, seguro y flexible que permite el desarrollo rápido de aplicacione web usando PHP. Esa es la razón por la cual lo uso para implementar muchas de las ideas que expono a lo largo del presente blog.

Pero, la razón de éste mini-tutorial de cómo usar el API de bit.ly, que es un servicio de redución de URL, es justamente por que he visto que Mashable, ahora muestra un numerito sobre el botón para hacer buzz de sus posts. Estuve leyendo la documentación del API de Google Buzz, con la clara intención de duplicar dicha funcionalidad en mi blog y lamentablemente encontré que no es posible encontrar el número de "buzzeadas" que un determinado website ha recibido. Al menos por el momento esa información no es accesible a través del API de Buzz. Entonces, ¿cómo han resuelto el problema la gente de Mashable?, acaso tienen un trato secreto con Google para usar funciones no documentadas que sólo han sido reveladas a ellos, a cambio de buena prensa. Pues la respuesta es menos paranoica. y ciertamente más propensa a errores. Mashable no está contando el número de veces que un artículo ha sido compartido en buzz, sino el número de clicks sobre un link de bit.ly. Una solución simple, aunque de cuestionable eficacia.

Bueno, ahora que ya sabemos el por qué, veamos el cómo.

Para poder usar el API de bit.ly dentro de CodeIgniter debemos de descargar la librería bitly-api-library-codeigniter, que está alojada dentro de los repositorios de proyectos Open Source de Google. Adicionalmente debemos crear una cuenta en bit.ly ya que con ella podremos obtener un API Key, necesaria para usar el API.

Luego de que descompacte el archivo zip que contiene la librería Bitly.php, la debemos colocar en system/application/libraries/,  luego editamos el archivo system/application/config/autoload.php y denemos agregar esta línea:

$autoload[‘libraries’] = array(‘Bitly’);

Ahora ya podemos usar la librería en nuestra aplicación. Supongamos que el nombre de usuario que registró en bit.ly es "usuarioprueba"  y que la clave (key) del API que  obtiene de bit.ly es "R_0da49e0a9118ff35f52f629d2d71bf07", entonces un ejemplo muy sencillo para obtener la estadística de cuantos clicks ha recibido un terminado enlace sería el siguiente:

<?php

class Stat extends Controller {

        function Stat()
        {
                parent::Controller();
        }

        function index()
        {
                $this->bitly->setKey(‘usuarioprueba’,
                                     ‘R_0da49e0a9118ff35f52f629d2d71bf07’);
                $URL = "http://bit.ly/14H1OB";
                list($protocol, $empty, $bitly, $hash)=split("/", $URL);
                $result   = $this->bitly->stats($hash);
                echo "<PRE>";
                print_r($result);
                echo "</PRE>";
        }
}

?>

Observer que estoy usando la función split de PHP para poder obtener sólo la última parte del URL, que es la que necesita el API para retornarnos la estadística del número de clicks que ha recibido el enlace. El resultado de la ejecución exitosa del código anterior sería este:

Array
(
    [clicks] => 6
    [hash] => 3VpSVv
    [referrers] => Array
        (
            [] => Array
                (
                    [direct] => 6
                )

        )

    [userClicks] => 2
    [userHash] => 14H1OB
    [userReferrers] => Array
        (
            [] => Array
                (
                    [direct] => 1
                )

        )

)

Como podrán observar, el valor que nos interesaría para implementar el contador de buzz es "clicks". Sumando esto a lo que ya he comentado en el post  "Si Mashable puede, ¿por qué yo no?" y un poco de JavaScript sería posible hacer un widget como el que está usando actualmente Mashable.

Mi opinion sobre el Nexus One

Aquellos que me siguen en Twitter (@volkan68) supongo habran visto el tweet que envie el marte de la semana pasada (12 de enero) en el que anunciaba que era poseedor de un Nexus One. Debo agradecer a la compañía para la que trabajo por el teléfono y el plan de voz/sms/datos ilimitado que tengo, gracias al cual he podido experimentar un poco con un smartphone Android real, hasta la semana pasada sólo había podido hacerlo a través del SDK de Android que trae un emulador que permite probar el sistema operativo para móviles de forma simulada.

Durante los últimos días he visto bastantes críticas al Nexus One, ya a los pocos dias de su lanzamiento la mayoría de clientes que adquirieron el teléfono se han quejado de lo lento en responder que es el servicio de soporte al cliente por e-mail que ha implementado Google. Luego llegaron las quejas sobre la intermitencia de la conexión 3G del teléfono, además la empresa Flurry que monitorea la venta de aplicaciones a móviles proyectó que las ventas de la primera semana del Nexus One son apenas 20,000 unidades, lo cual es ínfimo comparado con los 250,000 teléfonos que vendió Droid en su primera semana y los 1,600,000 de iPhone 3GS vendidos también durante su primera semana en el mercado.

Una de las últimas críticas que leí ayer en un artículo aparecido en Business Insider, se enfocó en la mala presentación realizada del producto durante la cual la inexperiencia de los expositores, la falta de más vistosidad en la proyección de las imágenes del teléfono y la falta de motivación para con la audiencia son las culpables según Business Insider de la pobre recepción del teléfono ante de parte del público.

Bueno, desde mi perspectiva puedo decir que es posible que desde el punto de vista de marketing y soporte el producto no sea un rival para el Droid o el iPhone, después de todo ambas empresas han gastado varios cientos de millones de dólares en promoción de sus productos y poseen cadenas de distribución donde los compradores pueden ir a ver el teléfono antes de comprarlo. Pero si se trata de las especificaciones técnicas y lo que se puede hacer con el teléfono, el Nexus One está a años luz delante de todos los demás competidores.

Les comentaré algunas cosas que me han parecido sorprendentes del teléfono, quiero dejar claro que este es mi primer smartphone así que a lo mejor mi visión no es del todo educada en la usabilidad de dispositivos móviles. Lo primero que me ha llamado la atención es lo bien integrado que está Google Voice con el dispositivo, uno puede configurar el teléfono para que cualquier llamada internacional sea hecha a tavés de Google Voice, o incluso puede ser configurado para que todas las llamadas salientes sean hechas usando Google Voice, con lo que restricciones de los minutos disponibles que provee el carrier, pueden sencillamente ser saltadas por alto gracias al servicio de VoIP de Google. Además las llamadas a Perú usando Google Voice están a 6 centavos el minuto, lo cuál es 25% más barato que Skype que factura a 8 centavos el minuto.

La instalación de aplicaciones es super sencilla, en el mismo teléfono vamos a la aplicación "Market" y alli podemos buscar/instalar/remover aplicaciones en el teléfono sin requerir de un PC. Una de las aplicaciones gratuitas que instalé es UStream Broadcaster que me permite hacer broadcasting en vivo desde el teléfono aprovechando la conexión 3G del mismo. Es por ello que le he agregado una pestaña llamada UStream a este blog en la cual he colocado el widget social de UStream que les permitirá a Uds. ver algún streaming en vivo cuando la circunstancia lo amerita.

La conexión 3G no es sorprendentemente rápida pero con 2.7 Mbps de bajada y 1.8 Mbps de subida el ver video o hacer streaming del mismo funciona de manera aceptable. Para medir la velocidad de mi conexión 3G use una aplicación llamada SpeedTest que es gratuita también. El navegar la web con dicha velocidad y el veloz procesador que tiene el teléfono hace que las páginas carguen bastante y se presenten rápido, lo único malo es que aún el teléfono no posee un plugin flash, pero youtube con html5 se ve perfectamente.

El cliente twitter que estoy usando en el teléfono es Seesmic, que responde bastante bien y hasta el momento no me ha dado ningún problema. Cuando puse algunas canciones mp3 en el teléfono me dí cuenta de que Seesmic crea una carpeta en la cuál almacena los avatares de los twitteros a los que sigo.

Luego de un poco más de una semana con el telefonito no me puedo quejar, no he tenido problemas ni con llamadas perdidas, ni problemas con al red 3G, creo que he tenido mucha suerte o se debe a que vivo en NYC y aquí la red celular está mucho mejor cuidada que en otras ciudades. De todas maneras ya les contaré si es que descubro algún problemilla en el futuro.

Aquellos que se quejan de la batería, les puedo decir dos cosas, primero si están haciendo streaming usando la red 3G el promedio que obtuve fue de 24% de uso de la carga por cada hora, bueno extrapolando los resultados de mis streaming de 10 mintuos. Eso quiere decir que con carga completa, podríamos hacer un streaming contínuo de al menos unas 4 horas. Lo cuál no me parece mal, para ahorrar batería si está en un lugar donde hay disponible wifi es preferible usar wifi pues consume menos carga. Si esta en lejos de algún hotspot wifi, desactivelo porque si no lo hace el dispositivo estará continuamente tratando de detectar algún hotspot con el consiguiente gasto doble de batería (3G + wifi).

Espero que estas líneas les hayan servido para hacerse una idea de qué se puede esperar del teléfono y que no.