La muerte de symbian

En el año 2010, escribí un artículo que dio un tanto de que hablar, el artículo en concreto fue Los sistemas operativos móviles para smartphones: Android vs iOS vs Symbian vs Windows Phones. Es curioso ver como si se leen los comentarios, la gente va pasando de defensores de Symbian frente al resto de sistemas a poco a poco, ir queriendo actualizar a iOS o a Android. Bueno, escribo esto como aclaratoria, Symbian finalmente murió, y Symbian ha muerto no por que lo diga yo, sino por los hechos. Nokia compro el 100% de Symbian, por lo que el resto de marcas se interesaron por otros sistemas mas estables para los teléfonos de última generación (de todos es sabido los problemas de Symbian y los telefonos táctiles). La propia Nokia, por si aun queda algún defensor de este sistema operativo para móvil, abandono Symbian para utilizar Windows Phone, increíble pero cierto. Los planes de futuro de Symbian, en teoría mantenido con respiración asistida hasta 2016, son para teléfonos de baja gama de Nokia, el típico teléfono que tu madre se compraría.

Tengo que decir que es una lastima, ya que todos hemos crecido con Symbian, pero en la vida hay que ser fuerte y reconocer una derrota, solo nos queda mirar a los nuevos sistemas como Windows Phone, Android, iOS, etc.

Deploy de ASP.Net MVC en Apache con mod_mono

Lo que voy a escribir aquí no es una guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono, aunque la escribiré, sino como hacer el deploy de una aplicación. Cuando montamos un sistema Mono ASP.Net con MVC sobre apache con mod_mono, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son pequeños detalles pero que te pueden dar algún que otro quebradero de cabeza. Las 3 cosas a tener en cuenta son:

  • Apache no entiende que tu app es MVC, por lo que hay que decirselo.
  • Apache ni mod_mono son capaces de dictaminar tu index
  • Siempre hay que tener algo para recompilar el backend en caso de cacheo o fallo (generalmente cuando desarrollamos).

Bueno, expliquemos cada una, en primer lugar apache no sabe que tu app es un MVC de ASP.Net, por lo que cuando hagamos un deploy o creemos un proyecto nuevo de Mono ASP.Net con MVC, lo primero a crear es un .htaccess forzando a que es un MVC. El código del htaccess es:

ForceType application/x-asp-net

Con esto ya  podemos poner a funcionar nuestra aplicación web. El siguiente paso para hacer las cosas bien, sería crear un index, ¿Por qué? ¿Acaso no saben cual es mi index? Pues no, todas las pruebas, tanto en Linux como en Mac OS X, es que mod_mono no es capaz de entender cual es el index que definimos en el global.asax, por lo que lo mejor es crear un index.aspx que cargue nuestro HomeController, o el que queramos. El index estaría en el raiz del proyecto y su código sería:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<%
   this.Context.RewritePath("Home", false);

   IHttpHandler httpHandler = new MvcHttpHandler();
   httpHandler.ProcessRequest(this.Context);
%>

Lo que hacemos con este index.aspx es decirle que cuando cargue la home (el index) cargue automáticamente el HomeController. Ahora solo nos falta crear un sistema de reseteo de backend por si se queda en cache y queremos cambiar algo. Para ello creamos una carpeta, por ejemplo, reset-mono-backend y creamos un .htaccess dentro de esa carpeta. Cabe decir que al htaccess lo podemos otorgar de un sistema de autentificación y cosas por el estilo para acceder, pero como esto es un ejemplo, será lo más básico. El contenido del .htaccess será:

ForceType None
SetHandler mono-ctrl

Al entrar en /nuestroproyecto/reset-mono-backend, nos aparecerá una interfaz que nos permitirá entre otras cosas, resetear el backend. Otro día explicaré como se instala el sistema en si.

Buscar por tag, clase e id en jquery

Hace tiempo escribí un artículo hablando de rendimiento de jQuery y el uso de selectores dobles con jQuery, pero lo que no he hecho es explicar como funciona un selector de jQuery. La idea es que esto no sea "la guía definitiva de jQuery", ni nada por el estilo, sino un breve apunte para los lectores, la visión mas básica del uso de jQuery.

En este artículo voy a exponer como seleccionar de forma mas que simple utilizando un tag (etiqueta de html), una clase de css y un id. jQuery es un ente muy inteligente y por tanto, sabrá si lo que le estamos pidiendo es que convierta una etiqueta a jQuery o que la busque.

  • Buscar por tag con jQuery: este junto con el de clase, son métodos de búsqueda de poco rendimiento y que pueden dar como resultado varios objetos (ya que un tag se puede repetir), se indicaría a jQuery el nombre del tag.
  • Buscar por clase con jQuery: al igual que el anterior, es de bajo rendimiento y dará como resultado un array de objetos, ya que una clase se puede repetir.
  • Buscar por id con jQuery: es el mas optimo y el que se ha de usar siempre que sea posible. Devolverá un único objeto ya que los id's en teoría no se repiten.

Ahora vista un poco la teoría viene la practica. Lo primero es entender como se hace la llamada a jQuery, que tiene 2 formas, la original que es usando la función jQuery o la corta que es usando su alias a la función $. Veamos un ejemplo genérico de esto y luego uno por cada selector.

var selectorjQuery = jQuery("#mi_id_a_seleccionar");
var selectorAlias = $("#mi_id_a_seleccionar");

En el ejemplo anterior, el resultado sería el mismo, ya que es similar utilizar la función jQuery que la función $. Ahora veamos un ejemplo con los selectores, con un código en html y otro de código javascript.

<p>
   <a href="#">Mi link 1</a>
   <a href="#" class="enlace">Mi link 2</a>
   <a href="#" class="enlace" id="myLink">Mi link 3</a>
</p>

Ahora vamos a hacer lo siguiente, con estos enlaces, vamos a poner el color del enlace en negro para todos los enlaces, rojo para los enlaces que tienen una clase enlace y azul para el id myLink

//ponemos todos los enlaces a negro
$("a").css("color", "#000");
//los enlaces con la clase .enlace los dejamos en rojo
$(".enlace").css("color", "#ff0000");
//el enlace con el id myLink lo ponemos azulado
$("#myLink").css("color", "#336699");

Como podemos observar, las etiquetas se indican con su nombre, las clases como si de css se tratase, con un punto delante, al igual que los ids, que al igual que css utilizan una almohadilla.

Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC

Hace un tiempo empecé a oír hablar de django y empecé a interesarme por el. La verdad que al principio me llamaba mucho la atención porque la gente no hacia mas que alabar las virtudes de django. Investigando encontraba mas y mas alabanzas, incluso expertos que comparaban django con otros entornos como Mono ASP.Net con MVC o ruby.

A veces las comparaciones son odiosas y esto es que lo les pasa a los demás entornos cuando los comparamos con django. Al comparar django con Mono ASP.Net con MVC, comentaban como un mismo proyecto realizado por programadores expertos en django, realizaban muchas mas tareas que los expertos en ASP.Net en el mismo tiempo y que el resultado final del proyecto es que era mas rápido y consistente el desarrollo en django que en ASP.Net. Yo no digo que django sea un mal entorno, ni que los programadores de ASP.Net sean malos, pero la calidad de un programador de .Net realizando una web deja un poco que desear en la mayoría de los casos, no asi un programador friki de python que ha decidido hacer webs y que seguramente sea mucho mas versátil que uno de asp.net aunque hiciera la web en php y para mi esto no es comparable. Por otro lado comparaban django con ruby y no me gusto nada la comparación, ya que al comparar, decían que ruby on rails era para “nenas” y django para “hombre de pelo en pecho”. La verdad que esta comparación, es un poco ridícula, hasta llego a hacerme gracia a pesar de no gustarme.

Ahora vayamos a mi experiencia personal. Decidí instalarme django, ruby y Mono ASP.Net con MVC. Al buscar información, tutoriales o algo de guía para instalar e iniciar django, me encuentro con poca información y además centrada para linux, seguía las guías para mac y me costo sudor y lágrimas hacerlo correr (mi amigo @saikus no fue capaz). Cuando ya conseguí, intente hacer una prueba pero fui incapaz, bastante complicado para empezar sin un libro o sin que alguien te enseñe. Aun así, vi que utiliza una especie de servidor propio, por lo que para por ejemplo hacerlo correr en apache, hay que arrancarlo desde ssh y enlazarlo por un fastcgi o similar con apache, pero la cuestión es, cuanta comunidad puede generar algo que es muy muy muy dificil que sin ser pro y sin gastar un dineral en hosting, puedan hacer pruebas (yo en mi hosting no puedo instalarlo de momento).

Por ejemplo, mi experiencia con ruby o asp.net es muy mas satisfactoria, puesto que ruby es tan fácil como instalarlo desde algún apt-get, ports, descargable, etc y luego instalar las mil y una gemas necesarias. De una forma rápida y fácil puedes hacer funcionar un ejemplo o programar algo no solo en linux, sino en MacOSX, que es importante, ya que cada vez hay mas gente que usa este sistema. Por otro lado Mono ASP.Net con MVC es también muy fácil, quizás algo mas complejo que ruby, pero tan fácil como bajarse el instalable o en el peor de los casos las fuentes de la web de mono y compilar. Mono ya tiene XSP que es su propio server como ocurre con django y rails, y con mod_mono lo compilamos e instalamos en un periquete en apache.

Por que me gusta mas usar Mono ASP.Net con MVC que usar ruby o django. Django lo descarto por el costo de su instalación, porque no tengo un buen IDE donde poder programarlo y si quisiera pagar aunque fuera poco por los IDES, ¿Por qué no volverme a Windows y usar Visual Studio? Ruby es un poco parecido, es mas fácil de instalar y trabajar, pero falta un buen IDE, Netbeans tiene soporte, al igual que Eclipse para django, pero son plugins para mi gusto no estan muy muy depurados. Por el lado de Mono ASP.Net con MVC tenemos la opción de monodevelop, que si bien es cierto que sus primeras versiones eran como los plugins antes mencionados, las ultimas han mejorado sustancialmente y no hay que olvidar que en lugar de ser un IDE de java con plugins para python o ruby, es un IDE de .Net (dotnet), por lo que mvc esta soportado nativamente.

En conclusión, a django le veo demasiadas pegas que ensombrecen las virtudes que tiene. Ruby es quizás el mas equilibrado en cuanto a potencia y tiempo de desarrollo y Mono ASP.Net con MVC es mas lento en cuanto a desarrollo pero muy potente, además de no ser un framework añadido a un lenguaje (mvc si, pero no asp) sino todo un entorno preparado para la web, donde con un par de clicks es muy fácil generar clientes de servicios web, o crear un servicio web xml, una pagina web o mil cosas mas. Es por esto que yo personalmente me quedo con Mono ASP.Net con MVC.

Nace una nueva empresa, ventanilla única

Llevo demasiado tiempo sin escribir nada. Esto es debido a que tengo tantísimo trabajo que no paro. Tengo tanto trabajo a nivel personal aparte del trabajo ordinario que he decidido crear mi propia empresa de forma oficial. Es por eso que ando tan liado, porque hay que hacer muchas cuentas, prepararlo todo, pagos que hay que hacer, papeles a rellenar, es una locura. Es por eso que escribo este post, para aquel que le sirva un poco de guía y se encuentre en una situación similar a la mía.

En mi caso, no es una empresa como tal, sino darme de alta como autónomo. El proceso es simple, lo primero que hay que ver antes de darse de alta como autónomo, es si te merece o no la pena. En mi caso, en teoría voy a facturar bastante, asi que me sale a cuentas, aunque como autónomo, siempre esta la opción de darse de baja el mes que no facturemos, ahorrándonos la seguridad social. Esta práctica no es muy limpia, pero es legal. Si en lugar de autónomo, se hiciera con una empresa, no puedes disolverla tan fácilmente.

Una vez tenemos decidido que vamos a ser autónomos, el siguiente paso es acercarnos a la ventanilla única, pero ¿Qué es la ventanilla única? La ventanilla única es un servicio que ha puesto el gobierno para poder realizar todos los tramites necesarios en un único lugar. Llevando original y fotocopia (siempre, aunque no se diga, que luego pasa lo que pasa) del DNI, Número de la Seguridad Social y número de cuenta bancaria. Con todo esto en un tris te dan de alta en la seguridad social como trabajador autónomo, igual en hacienda y con tu número de cuenta te lo dejan preparado para cobrarte sin molestias.

Una vez hecho esto, solo nos faltará un pequeño detalle y es preparar nuestra oficina. Como en mi caso la empresa sería una oficina en casa, no hace falta que vaya a pedir permiso al ayuntamiento, pero si necesito un libro de visitas, que habrá que comprar y sellar para cuando empiecen a llegar inspecciones, te sellen las mismas.

Así empieza un futuro, con mucho trabajo y muchos mas papeles, persiguiendo un sueño que espero que algún día llegue.

Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState

En .Net, bien sea en C# o en VB.Net, hay un tipo de clases llamadas controladores genéricos que nos proveen de un nivel muy básico de controlador web. En ASP.Net, los handlers o  HttpHandler son un tipo de clases tan básicas, que no implementan entre otras cosas, las sesiones, por lo que tendremos que indicar explícitamente en la clase que tipo de sesión vamos a implementar.

Me voy a centrar en explicar 3 casos que son los más comunes, a la hora de implementar un handler:

  • Sin sesión: para esto no hay que hacer nada, con la declaración por defecto nos es suficiente. No tendremos acceso a la sesión, que sera nula si hacemos un context.Session
  • Sesión de solo lectura: para esto debemos implementar la interfaz IReadOnlySessionState, de tal modo que al hacer context.Session, tenga los valores de la sesión, pero no podremos añadir o actualizar datos sobre la sesión.
  • Sesión de lectura y escritura: para esto debemos implementar la interfaz IRequiresSessionState, que nos permitirá acceder a los datos de la sesión, así como añadir y actualizar los datos.
A continuación dejo unos ejemplos en C# y en VB.Net para que os hagais una idea.
[sourcecode language="csharp" title="Ejemplo de implementación de handlers en C#"] //Este ejemplo devolverá un error ya que context.Session es Nothing
public class IndalcasaSessionHandler : System.Web.IHttpHandler {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//pero value tendrá el valor original que tuviera y no el valor "nuevo valor"
//ya que no se puede escribir en la sesión
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//y actualizará el valor de la sesión correctamente
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState {
public void ProcessRequest(HttpContext context) {
Object value;

context.Session.Add("value", "un valor");
value = context.Session.Item("value");

context.Response.Write(value);
}
}
[/sourcecode] [sourcecode language="vb" title="Ejemplo de implementación de handlers en VB.Net"] 'Este ejemplo devolverá un error ya que context.Session es Nothing
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "un valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'pero value tendrá el valor original que tuviera y no el valor "nuevo valor"
'ya que no se puede escribir en la sesión
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "nuevo valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'y actualizará el valor de la sesión correctamente
Public Class IndalcasaSessionHandler
Implements System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim value As Object

context.Session.Add("value", "nuevo valor")
value = context.Session.Item("value")

context.Response.Write(value)
End Sub
End Class
[/sourcecode]

Espero que os saque de un apuro en el que alguna vez me he visto metido por no recordar las interfaces que hay que implementar para poder leer y/o escribir en la sesión en un controlador genérico de ASP.Net.

Double.Parse y Decimal.Parse con símbolos de putuación

Un problema que me encuentro a menudo en .Net por igual en Visual Basic o en C#, es cuando tengo que parsear un decimal o un double desde un string. Muchas veces, cuando parseas un double o un decimal, encontramos un error ya que en operaciones matemáticas, el símbolo de puntuación para la parte decimal es el punto, por lo que al hacer un Double.Parse(number) o un Decimal.Parse(number), lo que hace es ignorar el punto y por tanto tomar la parte decimal como si fuera parte entera. Para que esto no nos pase, tenemos que indicar que el sistema numérico utilizado es el matemático, aquel que no varia con la cultura. Con un ejemplo se verá mas claro.

Un ejemplo en C#:

[sourcecode language="csharp" title="Ejemplo en C#"] string number = "15.3";
double doNumber;
decimal deNumber;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

/*
Los valores son:
doNumber = 153
deNumber = 153
*/

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

/*
Los valores son:
doNumber = 15.3
deNumber = 15.3
*/
[/sourcecode]

Un ejemplo en VB.Net

[sourcecode language="vb" title="Ejemplo en VB.Net"] Dim number As String = "15.3";
Dim doNumber As Double;
Dim deNumber As Decimal;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

'Los valores son:
'doNumber = 153
'deNumber = 153

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

'Los valores son:
'doNumber = 15.3
'deNumber = 15.3
[/sourcecode]

CultureInfo es una clase que provee de información de las culturas y en concreto, la propiedad InvariantCulture o CultureInfo.InvariantCulture, es quien provee la información de la cultura que no varia por localizaciones, vease el simbolo de puntuación matemático. La clase CultureInfo se encuentra en el namespace System.Globalization, quedado la ruta así: System.Globalization.CultureInfo.InvariantCulture.

Guía de buenas prácticas para aumentar el rendimiento de jQuery

JQueryLlevo tiempo con ganas de escribir esta guía de buenas prácticas para aumentar el rendimiento de jQuery y de javascript en general. Uno de los principales problemas que nos encontramos por internet son que hasta hace un tiempo, cada javascript era de su padre y de su madre, por lo que perdía importancia dentro del desarrollo web y no optimizando esta parte del código. Con la inclusión de nuevas ideas a la hora de desarrollar webs y la aparición de multitud de frameworks como jQuery, mootoolssproutcore, hacen que el código javascript que escriben los desarrolladores, funcione en todos o casi todos los navegadores, pero aún así, algo falla.

Aunque ya no es como pasaba antiguamente que al entrar en una web o tenías Internet Explorer o podías olvidarte del javascript y por tanto de una gran parte de funcionalidad en la web, hoy en día esto no pasa gracias a los frameworks de javascript, es cierto que hay un problema y es el rendimiento. En este artículo me quiero centrar en el framework mas extendido, que es jQuery y una breve guía de como aumentar el rendimiento de jQuery y por tanto aumentar el rendimiento de javascript.

A continuación, detallo un listado de buenas practicas para aumentar el rendimiento de jQuery.

 

1. Acceder a id's y no a clases

Cuando vemos algun ejemplo de jQuery, siempre se nos muestra con $(".clase").html("prueba"), esto es un ejemplo que nos lleva a cometer grandes faltas de rendimiento cuando trabajamos con un proyecto muy grande. Aunque a veces no nos queda mas remedio que acceder a clases, su uso dentro de los selectores de jQuery, debemos de evitarlo siempre que podamos, ya que al acceder por clase, jQuery buscará en todo el código esa clase, todas las veces pueda, sin embargo, si utilizamos un id, al encontrar la primera coincidencia, la búsqueda parará y por tanto la ejecución será mas rápida.

$(".clase").html("prueba"); //es mas lento
$("#id").html("prueba"); //es mas rápido

 

2. Utilizar selectores dobles en jQuery

Hace poco tiempo escribí un artículo sobre el uso de selectores dobles para aumentar el rendimiento en jQuery. Básicamente y sin entrar mucho en detalle, ya que para ello hay ya un articulo dedicado, un selector doble lo que hace es crear un contexto donde buscar el selector. Imaginemos que queremos cambiar el html  de un menú (si es un absurdo) para ello, en lugar de ejecutar:

$(".menu").html("jodimos el menú");

Lo ideal es usar un contexto con base a un id, donde jquery tenga que buscar menos cantidad de datos

var header = $("#header");
$(".menu", header).html("jodimos el menú");

De esta forma, capturamos un contexto y le decimos a jQuery que busque solo en ese contexto en lugar de en toda la web, por lo que la ejecución de un selector de clase, será mas rápida.

 

3. Cachear variables que mas utilicemos y de contexto

Cuando escribimos código de jQuery, es normal que recurrentemente accedamos a ciertas partes de la página, que como hemos visto en el ejemplo anterior, utilizaríamos variables de contexto. Para agilizar la carga, es recomendable cachear estas variables, para que no tengamos que buscarlas cada vez que vayamos a utilizarlas:

var header = $("#header");
var footer = $("#footer");

.....

function bordemenu() {
    $(".menu", header).css("border", "solid 1px #000000");
}

De esta forma, no buscamos header, sino que accedemos a la misma variable que cargamos al cargar la página. Incluso, si ya sabemos de antemano que vamos a acceder muchas veces al menú, podríamos cachearlo también.

 

4. Evitar el uso de each

En jQuery, la función each no es más que un foreach que nos devuelve los nodos que hemos seleccionado. Es por esto que debemos de intentar, en la medida de lo posible, no utilizar este método para no ejecutar un foreach e intentar recorrer los nodos con un for, que aunque un poco mas complejo, su ejecución será mas rápida.

 

5. Centralizar la carga de eventos

Cuando hacemos una aplicación web muy muy grande y con mucho uso de ajax, nos damos cuenta de que cada vez tenemos mas y mas eventos y que como nos descuidemos, acabamos escribiendo casi los mismos eventos en multitud de sitios. Es por ello, que es recomendable tener una o varias funciones donde incialicemos los eventos para su carga y ejecución. Parece una tontería, pero a la larga, mas que en rendimiento, nos favorecerá en rendimiento a la hora de escalar nuestra aplicación, aunque también evitará la duplicidad de eventos sobre un mismo objeto y por tanto la ejecución será mas rápida.

 

Estos son 5 sencillos casos en los que podemos aumentar considerablemente la velocidad de ejecución de una web utilizando jQuery. Quizás, haciendo sencillos ejemplos, no seamos coscientes de esa diferencia de velocidad, pero en una macroaplicación que mueve multitud de datos asíncronamente, nos daremos cuenta que estas practicas agilizarán la página en general y agilizarán jQuery.

Hosting SVN con XP-Dev

Llevo tiempo buscando alguna formula para organizar los fuentes de mis proyectos. Cada día que pasa, tengo mas y mas proyectos y se me hace difícil organizarme, eso, sin tener en cuenta la posible perdida de información o el problema que supone cambiar de equipo. Hace tiempo tuve un hosting que ademas de poder alojar webs, podía crear repositorios SVN, el problema era que para ello, tenía que entrar por consola, crear los repositorios y poco mas se podía hacer aparte de usar los repositorios SVN. Algunos proyectos decidí que al tener una idea de que fueran opensource, podía aprovechar el servicio que ofrece Google Code, pero claro, otros proyectos son proyectos personales o que estoy desarrollando para otras empresas y Google Code, solo te permite utilizar proyectos opensource.

Investigando un poco por internet, encontré XP-Dev, un servicio de hosting que solo ofrece hosting para SVN, Mercurial y GIT. El servicio dispone de una versión gratuita por el que podremos utilizarlo para 2 proyectos privados y todos los que queramos públicos, con un espacio en disco máximo de 200 MB. El servicio gratuito nos limita un poco funcionalidades como son el acceso SSL, además, el resto de funcionalidades no se echa en falta nada , ya que dispone de un completo sistema con el que poder gestionar proyectos, con gestionar tareas, gestionar bugs, wikis, etc. todo fácilmente configurable. A partir de 4€ al mes, 5$, tenemos acceso a la cuenta básica, que nos dará acceso al servicio completo como acceso SSL, podemos crear tantos proyectos opensource o privados como queramos.

Quizás alguno piense que lo mejor y mas sencillo es montarse un servidor con SVN en casa, pero la realidad es que a veces, es mas cómodo, utilizar un servicio en nube y despreocuparnos de perder los fuentes de nuestros proyectos o poder acceder a ellos siempre que queramos y para ello, lo mejor es XP-Dev.

Podéis encontrar una lista de precios y una lista de características en la web de XP-Dev.

Los logos de las compañias de venta de viajes online

Quien me conozca, sabe que llevo trabajando en el sector del turismo online desde hace ya unos 6 años mas o menos (que se dice pronto) y como apasionado de este sector, me gustaría realizar una serie de artículos empezando por este donde analizar y comentar como es el mundo de las agencias de viajes online.

Hoy me gustaría comentar como es el mundo de los logos en las agencias de viajes online españolas y como estas se adaptan a los nuevos tiempos y a sus clientes. Voy a analizar 4 de las mas grandes agencias de viajes online que existen ahora mismo en España y son Rumbo, Atrapalo, Logitravel (que ha ido creciendo muchísimo y a muy buen ritmo) y Muchoviaje.

AtrapaloAunque trabajo en Muchoviaje.com, me gustaría comenzar por Atrapalo, ya que es mi logotipo favorito. El logo de Atrapalo.com, es un logo que ha cambiado con el tiempo, desde esa frase de "atrapalo.com" con la "a" roja señalada por flechas, hasta la actual "A" volteada con el corredor saltando. Independientemente de la página, que ahora mismo quiero valorar los logotipos, cuando veo el logotipo de Atrapalo, me da esa sensación de juventud, su "A" volteada, el chaval que salta, el rojo pasión, fuerza. Las páginas de viajes son páginas donde su clientela aunque comparan, suele ser fija por confianza que tienen en la marca y Atrapalo juega un papel muy importante porque esta captando a la juventud, desde los 18 años, hasta los 35, gente joven, con pareja o sin ella, pero sin hijos, donde llegará el día en que esas parejas crezcan y robaran cuota al resto de marcas que están centradas en otros rangos de edades, porque tendrán confianza en Atrapalo.

LogitravelEl segundo logo que mas me gusta, porque me parece que refleja una completa filosofía de la página y lo que quiere mostrar es Logitravel, que mas o menos fiel a su estilo desde sus comienzos, tiene a "Logi" como mascota y que actualmente aparece en toda la web. "Logi" es una especie de marcianillo verde muy característico que aparece vestido de azafata, piloto, en la playa con un bañador de hombre o de mujer, etc. Al igual que el logotipo de Atrapalo, creo que Logitravel se centra en un sector joven de la población, jovenes, parejas con hijos pequeños, gente muy tranquila, no tan entusiastas y emotivos como podría resultar en una primera instancia con Atrapalo. Lo que mas me gusta de Logitravel es como saben situar a "Logi" en diferentes situaciones dentro de la web para promocionar sus productos, apareciendo en la playa en vacaciones o vestido de piloto en la sección de vuelos. Digamos que lo integran de una manera excepcional en toda la web y aunque el logo de Logitravel no es gran cosa, he de darle mis felicitaciones a los diseñadores porque han sabido explotarlo a la perfección.

RumboSigo con Rumbo, la empresa de viajes online mas grande de España, perteneciente al grupo Orizonia. Su logotipo no ha variado practicamente desde sus comienzos. Su logo refleja una brújula, dando sentido entre el logotipo y el nombre de la compañia. A mi personalmente me recuerda al Telefónica de los viajes online, y no solo porque en su momento perteneció al grupo Telefónica y Amadeus, sino por su web, colores corporativos. Quizás no sean los mas baratos, ni los que tienen la mejor web de todas, ni el mejor producto, pero tienen ese algo, que inspira confianza a la hora de comprar.

MuchoviajeDejo para el final el logotipo de Muchoviaje, porque realmente es el que menos me gusta y eso que trabajo aquí. El logotipo de Muchoviaje ha cambiado muy poco con el paso de los años, mas que cambiar lo que ha hecho es ir perfilandose, eliminando una ola, cambiando un poco la tonalidad de los colores base y eliminando el sol que había detrás de la "M" de Muchoviaje. El logotipo antiguo de Muchoviaje, era igual que el actual, mas pasteloso a nivel de color que el actual, con 2 olas y 2 ondulaciones bajo la palabra "Mucho" y con un sol detrás de la "M" de Muchoviaje. Con el paso de los años, una ola ha desaparecido, dejando solo una única ola con 2 ondulaciones en las letras y el sol también ha desaparecido. Los colores del logotipo de Muchoviaje se han intensificado, dejando de ser tan pastelosos como eran en sus comienzos. Refleja perfectamente lo que son unas vacaciones de playa, el naranja arena de la playa y el verdoso mar con las olas y el sol (cuando este aún estaba). Es la marca de vacaciones para cuarentones y cincuentones, que buscan esas vacaciones en la playa, para desconectar y descansar y no consigue conectar con la gente joven, pero si con personas de mas edad.

En conclusión, cada marca tiene su prototipo de cliente bien marcado y quien consiga captar a clientes de otro rango será quien gane la batalla por la venta de viajes online. Para mi, quien mas fácil lo tiene es Atrapalo, ya que la gente mayor se suele dejar aconsejar en aspectos tecnológicos por la gente joven, que se suelen decantar mas por Atrapalo que por el resto de marcas. Todo este articulo se basa en una opinión personal, no va mas allá que un mero comentario, que puede ser mas acertado o equivocado, pero es una sensación de alguien que lleva ya unos años en este sector y que ha crecido junto con el.

Preparando la versión 2.1 del plugin UserAgent theme switcher

Estoy trabajando en la nueva versión del plugin de wordpress User Agent Theme Switcher. El plugin para la gestión de diferentes navegadores móviles, de escritorio, etc. que permite cambiar el template de wordpress entre los diferentes navegadores.

Las mejoras propuestas para esta nueva versión son:

  • Añadir WordPress como useragent reconocido y no generar alerta, aunque no sera incluido como opción configurable, ya que será solo para pingbacks y trackbacks
  • Nuevos navegadores para iPad y Kindle gracias a la colaboración de ovi_mihai
  • Nuevos bots configurables con GoogleBot y GoogleBot mobile

Espero tener listos los cambios en las próximas semanas. Gracias a todos los que enviaron los useragents no soportados y a aquellos como ovi_mihai que ayudaron con el código.

Selectores dobles con JQuery, aumentando el rendimiento de JQuery

JQueryA menudo suele pasar que al comparar diferentes librerías de Javascript, se habla de JQuery como una librería de muy fácil manejo por utilizar selectores DOM y de CSS pero a la vez se dice que por esto es mas lenta que el resto. Mi objetivo con este artículo no es explicar los diferentes tipos de selectores de JQuery sino como aumentar el rendimiento de JQuery utilizando selectores dobles de contexto.

En JQuery aparte de otras formas como objetos DOM y similares, lo normal es realizar un selector apuntando a una clase de CSS o un id. Antes de nada, comentar que el uso de clases en los selectores de JQuery, es recomendable omitirlo siempre que sea posible (no siempre se puede), ya que JQuery espera encontrar varios nodos y por tanto evaluará todo el código, por lo que es mas lento que utilizar ids, que una vez lo encuentre, dejará de buscar. Tras este miniconsejo de rendimiento de JQuery, me gustaría comentar como funcionan los selectores dobles de contexto de JQuery.

Normalmente  para hacer una selección en JQuery, hacemos algo tal que $("selector") y seleccionamos el objeto de JQuery. Un selector doble o selector de contexto es básicamente una especie de cache, un contexto donde buscar ese selector pero no en toda la página, sino en una parte de esta. Para utilizar un selector doble o selector de contexto, lo que hacemos es enviarle un parámetro extra a la consulta de selección. En mi caso me gusta enviar un objeto de JQuery que intento cargar en memoria al cargar la página, sacrificando tiempo de carga por velocidad a la hora de interactuar con la propia página. Para utilizar un selector doble o selector de conexto lo que hacemos es por ejemplo hacer $("selector", objetopreseleccionado), de esta forma, JQuery no buscará el selector en toda la página, sino que se centrará en el contexto donde se encuentra lo preseleccionado.

Para que todo quede un poco mas claro, voy a poner un ejemplo, partamos de la idea que tenemos la página partida en 4 sectores, una cabecera, un contenido dividido en menú lateral y contenido en si, y un pie. Todas estas partes cambiarán dinámicamente, así que al realizar el document ready cargaremos en variables las diferentes secciones de la web con la idea de realizar operaciones de una forma mas rápida y consumiendo menos recursos de procesador al cliente, que ya sabemos que el javascript puede ralentizar mucho una página si no se hace con cuidado.

var header, footer, menu, content;

$(document).ready(function($) {
  header = $("#header");
  footer = $("#footer");
  menu = $("#menu");
  content = $("#content");
}

Una vez que hemos cargado en memoria las diferentes secciones de la web, podremos trabajar con eventos, modificaciones y efectos de una manera mucho mas eficiente, realizando las llamadas utilizando en los selectores esas variables como contexto de JQuery.

$("#logo", header).html("mi html");
$(".article a", content).click(function() { .... });

Si utilizamos los selectores de JQuery como en el ejemplo anterior, usando un contexto para la búsqueda, ahorraremos muchísimo tiempo de proceso porque JQuery no tendrá que buscar en todo el documento, sino que lo realizará en base al contexto que le indiquemos. Quiero aclarar que como todo, hay que estudiar cuando usar o no usar contextos, ya que si la página es muy pequeña no merece la pena cargar en memoria las diferentes secciones, pero si la página es bastante grande y con muchos datos, podemos acelerar el uso de JQuery y aumentar el rendimiento de JQuery en un 250%.