Archivos de la categoría: Programación

Rails, escalabilidad y otras zarandajas

No es la primera vez que atacan a Rails diciendo que no es escalable. En esta última ocasión, el desencadenante ha sido una entrada en TechCrunch acerca de que quizá Twitter abandonase Rails (desmentido ya por el propio Evan Williams en un tweet).

Rails NO es el problema.

Puedes hacer un desarrollo que soporte millones de usuarios al mes y puedes hacer desarrollos que no aguanten más de tres o cuatro peticiones por segundo. Ya sea con Ruby, con PHP, con Java o incluso si te pones con .NET.

Lo que decide si un sistema va a poder ser escalable o no es que en su momento hayas diseñado correctamente el modelo de datos. Que no hayas escatimado, pero tampoco hayas abusado, en los índices que vas a necesitar. Que no todo sea base de datos y te apoyes en ficheros de texto para ciertas cosas. Que tengas bien distribuidos los equipos que van a actuar como servidor de la aplicación, como servidor de ficheros, como cachés, como servidor de base de datos. Que sepas en qué proporción van a tener que ir creciendo dichos servidores. Que juegues con las cabeceras HTTP (benditas 304). Que conviertas a tu desarrollo en básicamente un generador de HTML estático que no toca base de datos a no ser estrictamente necesario.

El que lo hayas hecho en Rails, en Merb, en Django, en CakePHP o a pelo al final acaba siendo lo de menos… La clave de que teu proyecto escale es el trabajo antes de empezar a escribir la primera línea de código. Y aun así te encontrarás con problemas.

Apache + Passenger = Rails para todos

Hace poco más de una semana vio la luz la versión pública de Passenger, más conocido por todos como mod_rails. La comunidad Rails se ha revolucionado y no es para menos.

Desde las primeras versiones de Rails una de las mayores pegas que ha tenido este framework han sido las puestas en producción. A diferencia de PHP y su mod_php, Rails no ha contado con nada equivalente a subir los ficheros a tu servidor y tener la aplicación ya funcionando. Han ido saliendo aplicaciones como capistrano, que te permitían automatizar los despliegues de una aplicación. Han salido servidores como mongrel, que evitaban el gran problema de ejecutar Rails como si fuera un CGI (cargar Rails, cargar aplicación, servir petición, descargar todo de memoria). Con esto estabas cubierto tanto en el caso de tener un servidor propio o contratar un alojamiento especializado en Rails, pero estas soluciones no eran fáciles de implantar de forma masiva en los proveedores generalistas de hosting.

Gracias a este pequeño módulo para Apache el despliegue de tus aplicaciones Rails va a poder ser tan sencillo como subir los ficheros por FTP, introducir la URL de tu página en el navegador y verla funcionando. Sin tener problemas si una de las instancias se queda bloqueada o muere. Pudiendo reiniciar la instancia de la aplicación con solo hacer un touch restart.txt. Pudiendo parametrizar todo lo que necesites.

Upload & Play ;)

Instalando git en Mac OS X

Hoy es el tercer aniversario del proyecto git.

Proyectos grandes como el propio kernel de Linux o más recientemente el framework Ruby on Rails usan este sistema distribuido de control de versiones. Y desde hace unas semanas que por fin decidí darle una oportunidad, este blogger se une a las legiones cada vez más numerosas de personas que han migrado de otros SCM como subversion a git.

Aunque existe la posibilidad de instalar git en tu Leopard desde MacPorts o con alguno de los múltiples empaquetados que hay por internet, en esta entrada voy a aprovechar para explicaros cómo instalar git en tu equipo desde cero.

Paso 0: Requisitos previos

Antes de seguir, es básico que tengamos instalado XCode, para lo cual o bien lo hacemos desde nuestro DVD de instalación de Leopard o bien nos vamos al Mac Dev Center de la Apple Developer Connection y nos lo bajamos.

Todo lo que vamos a escribir lo haremos en un terminal. Mi recomendación es usar iTerm, aunque hay gente que está más habituada a utilizar la propia applicación Consola. A vuestra propia elección.

Comienza la diversión ;)

Paso 1: Descarga de git

Este primer paso es un poco manía personal de tener organizado todo en carpetas. En este caso crearemos una carpeta src desde la que funcionaremos a lo largo de todo este tutorial:

mkdir src
cd src

A continuación procedemos a la descarga y desempaquetado de git:

curl -O http://kernel.org/pub/software/scm/git/git-1.5.4.5.tar.bz2
tar xvfj git-1.5.4.5.tar.bz2
cd git-1.5.4.5

Ya estamos listos para compilar.

Paso 2: Compilación e instalación

Leopard viene sin gettext, así que respecto del habitual make && sudo make install tendremos que añadir una opción para tener una compilación de todos los programas sin fallos:

NO_MSGFMT=yes make prefix=/usr/local all

Con esto estamos diciendo que a la hora de compilar no utilice msgfmt (parte de gettext) y que luego cuando instalemos lo haremos dentro de /usr/local.

Ya tenemos git compilado. Si queremos, antes de continuar podemos ejecutar una amplia batería de tests para asegurarnos de que no ha habido ningún fallo:

make prefix=/usr/local test && echo $?

Puede que no tengas la suficiente paciencia para ver como se ejecutan todos los tests (y no son precisamente pocos). Por ello, gracias a ese echo $? veremos si la ejecución de los tests ha ido bien (debería aparecer un 0 en la última línea antes del prompt del sistema).

Con git ya compilado y con todos los tests superados, procedemos a instalarlo:

sudo make prefix=/usr/local install

Ya tienes git instalado en tu equipo :)

Paso 3: Instalación del manual

Este paso es optativo, aunque siempre viene bien tener las manpages.

curl -O http://www.kernel.org/pub/software/scm/git/git-manpages-1.5.4.5.tar.bz2
sudo mkdir /usr/local/man
sudo tar xjv -C /usr/local/man -f git-manpages-1.5.4.5.tar.bz2

Con esto, estamos descargando las manpages correspondientes a la misma versión que hemos instalado de git y descomprimiéndolas en su sitio.

Ya solo nos queda abrir en nuestro editor favorito el fichero .bash_profile y añadir lo siguiente:

export MANPATH="/usr/local/man:$MANPATH"

Esto le decimos a man que también tenga en cuenta a la hora de buscar manpages la ruta /usr/local/man.

Primeros pasos con git

Lo primero que haremos será configurar git con nuestro nombre y el email que aparecerá como autor de los commits que hagamos a los repositorios:

git config --global user.name "Tu nombre"
git config --global user.email tu@correo.ejemplo.com

Ahora nos vamos a la carpeta de nuestro proyecto y ejecutamos lo siguiente:

git init
git add .
git commit

Ya tenemos nuestro proyecto bajo el control de git. Lo que hagas de aquí en adelante ya depende de ti.

Si puedo prepararé dentro de poco un pequeño tutorial de manejo de git. De todas maneras si no puedes esperar y quieres ponerte a funcionar desde ya te aconsejo que eches un vistazo al manual de usuario, o si ya venías de subversion al tutorial “git para usuarios de subversion” (ambos documentos en inglés).

Happy coding :)

Ticket 9384: CLOSED

Hace unos días avisaba vía twitter de la creación del ticket 9384 en el trac de Adium por un problema que había detectado debido a la caída en el rendimiento de este cliente de mensajería conforme pasaban los días. Sin entrar en la causa técnica del error (que para eso está el ticket), después de veintitantos comentarios por fin este domingo se pudo dar el ticket por corregido, y, por tanto, como cerrado.

Da gusto volver a la caza de bugs y a la colaboración en la medida que se puede en los proyectos que sigo :)

Próximo objetivo: Canon EOS 40D

A principios de año puse en marcha, a través de la entrada “Gadgetomanía”, una manera de conseguir todos aquellos gadgets que me gustaría tener aunque no son vitales para mi día a día.

El primer objetivo (conseguido) fue un Nokia N95, del cual ya os hablé en “Adiós, iPhone” y con el que estoy encantado.

Ahora el punto de mira está puesto en esta preciosidad:

Canon EOS 40D

Lo nuevo en jQuery 1.2

Sí, ya se que la nueva versión de jQuery salió hace alrededor de una semana, pero hasta hoy no he tenido tiempo de pararme un momento y ver la gran cantidad de características nuevas que trae. Y de entre me gustaría resaltar las siguientes:

Mejoras en AJAX

  • Cargas parciales: Ahora .load() permite que le pasemos un selector que indica la parte de la página a cargar que queremos devolver. Útil por ejemplo si tienes que hacer algo parecido a un widget pero no tienes tiempo de poder “trocear” la página. Por ejemplo: $("#destino").load("/pagina #div-interesante");
  • getScript y getJSON remotos: Se acabó el tener que tirar de ficheros a modo de proxy. Con estos dos métodos podemos incluir tanto otros javascript como obtener datos de servicios web externos. A usar con moderación si tienes que invocar a código externo a tus proyectos, que luego no tengamos sorpresas desagradables ;)
  • Evitar cacheo de navegadores: Cuantas veces nos habremos encontrado con que nuestro código estaba bien pero el proyecto hacía cosas raras, para acabar descubriendo que no llegábamos a hacer la petición porque la página estaba cacheada por el navegador. Ahora con una nueva opción en $.ajax()podremos forzar el no cacheo de la página y estar seguros de que obtenemos lo que queremos, librándonos del típico añadido de ?version=loqueseaen las peticiones o los cambios con header()para forzar las cosas.
  • .loadIfModified y getIfModified obsoletas: Se añaden como nueva opción dentro de $.ajax().

jQuery UI

Es bastante habitual entre los que usamos jQuery terminar usando el tándem jQuery + Interface (sin ir más lejos, es en lo que se apoya el Multimarcador). Con jQuery UI por fin tenemos un sustituto “oficial” de Interface al que sin duda habrá que darle una oportunidad. Al menos por lo que se ve en las demos y la documentación van muy bien encaminados.

De todo un poco

  • Nuevos selectores: Ahora disponemos de :has() que nos ayuda a seleccionar los elementos que al menos contengan un elemento del tipo que especifiquemos; :header, que nos selecciona todos los h1, h2, h3, h4, h5 y h6 que haya en el documento (como indican en la propia documentación, útil si por ejemplo queremos crear una tabla de contenidos sobre la marcha); y :animated, que selecciona aquellos elementos que en ese momento estén siendo animados. Por último, los selectores XPath son ahora un plugin.

  • .height() y .width() para los document y los window: O lo que es lo mismo, que ahora de serie tenemos un método muy sencillo para poder centrar elementos en la pantalla o en el documento, ya que podemos saber el ancho y alto de un documento o de la parte visible del mismo. Y esto combinado con que ahora también tenemos un .offset() oficial da mucho, mucho juego.

  • Los eventos pueden tener su propio namespace, lo cual nos facilita muchísimo el poder eliminar de forma selectiva los eventos que asociemos a un elemento.

  • La documentación, movida al wiki, y por lo que se ve, han aprovechado para darle un lavado de cara. Por lo que comentan, están trabajando para que esta nueva documentación también se pueda compatibilizar con sitios como Visual jQuery.

Qué ganas tengo de poner en marcha buena parte de estos cambios en nuestros proyectos de 20 Minutos… (A ver si cierta persona se da por aludida :P).

La vida en 20 Minutos (II): Powered by jQuery

En la primera parte de esta serie de historias ya comenté que uno de los factores del éxito de 20 Minutos es que aquí la mayoría de los proyectos suelen ser de un tamaño que permite hacer la mayoría de ellos en poco tiempo. A esto también hay que unirle la predisposición que hay de aprender de las costumbres que traemos la “savia nueva” del equipo.

Uno de los primeros proyectos de los que tuve que hacerme cargo fue el del Top 20 Música. En dicho proyecto dentro de la interactuación con el usuario iba a ser necesario el uso de javascript a un nivel algo más elaborado de lo que venía siendo habitual en el resto de secciones del periódico, así que aproveché entre las elecciones que tenía que hacer para sugerir el uso de
jQuery. Y por lo que se puede ver, parece que gustó ;)

¿Que fue lo que me llevó a elegir jQuery y defender y recomendar su uso futuro? En primer lugar, ya había tenido que lidiar con jQuery en mi anterior trabajo como responsable de toda la parte técnica (incluido el desarrollo) de Fresqui. Por una parte elegimos jQuery porque veíamos que era la elección que estaban haciendo para Drupal 5.0, así que si en algún momento se planteaba la migración hacia dicha versión, íbamos a tener un factor menos del que preocuparnos. Por otro lado, necesitábamos algo más potente y menos pesado que la combinación Prototype + script.aculo.us.

En segundo lugar, a lo largo del desarrollo de la versión 2.0 de Fresqui llegamos en algunos momentos a poner jQuery al límite, encontrándonos con una serie de fallos un tanto retorcidos. Ni corto ni perezoso me puse en contacto con el autor principal, John Resig, y le comentamos la serie de bugs que habíamos localizado en su excelente librería. En cuestión de horas fue capaz de encontrar la causa de dichos fallos y proveernos de una versión directamente construida desde svn para que pudiésemos continuar con el desarrollo. Él estaba encantado de que usásemos su librería en un sitio como Fresqui, y nosotros estábamos encantados con la respuesta que nos había proporcionado en esa ocasión y en posteriores, así que ambos tuvimos una pequeña etapa de colaboración.

Si combinas el buen soporte que tiene con la sencillez y ligereza, queda claro porqué no hubo ningún impedimento en sustituir la implementación manual que se hacía hasta ahora de la parte AJAX por una parte más potenciada por jQuery. De hecho, el Top 20 ha sido el primero, pero no el último de los proyectos que hacen uso de él (sin ir más lejos, fijaros en la paginación de los comentarios de las noticias), hasta el punto de que dentro de las cabeceras por defecto ya viene incluido.

De todas maneras tengo entre manos uno de los proyectos más ambiciosos de 20 Minutos en los últimos tiempos y os puedo decir que la parte jQuery del top o de los comentarios queda en muy poquita cosa comparado con éste ;) Lo contaré en más detalle en la tercera o cuarta entrega :P

© 2002-2008 LinuxAdicto.org. El contenido y algunas imágenes están bajo la licencia Reconocimiento-NoComercial-CompartirIgual 3.0