Publicado el plugin de WordPress UserAgent theme switcher 2.0

UserAgent theme switcherEn este puente del Pilar, cuando deberia de disfrutar de unas vacaciones, he pillado un gripazo que no me deja moverme de la cama, y como no puedo hacer otra cosa, he decidido finalizar el desarrollo del plugin de WordPress User Agent Theme Switcher. El plugin que ya se encuentra en su versión 2.0 trae importantes mejoras frente a su predecesor, ya que ademas de haberlo reescrito desde cero, se ha añadido funcionalidades, se han separado por funcionamiento las páginas, para que sea mas sencillo modificar las opciones y se ha dado soporte a unos cuantos navegadores mas. La lista de cambios respecto a la versión 1.2 es la siguiente:

  • Se ha reescrito todo el código del plugin para aumentar el rendimiento y para facilitar el desarrollo de futuras mejoras
  • Se ha separado la página de administración en 3 páginas, la de temas por navegador, el modo debug y la futura configuración del cache
  • Se han añadido etiquetas a los navegadores, como gecko a Firefox, mobile a Safari Mobile, Opera Mini, etc. para poder asignar un template por etiqueta para por ejemplo un tema para moviles con la etiqueta mobile
  • Se han añadido iconos para los navegadores y las etiquetas.
  • Se ha traducido todo el plugin al ingles para realizar las traducciones en otros idiomas en futuras versiones
  • Se ha añadido un boton para donar.
  • Se ha añadido soporte para Internet Explorer 9
  • Se ha añadido soporte para Camino para Mac
  • Se ha añadido soporte para Opera Desktop
  • Se ha añadido soporte para IceWeasel
  • Se ha actualizado Safari Mobile para que incluya el navegador del IpodTouch

Recuerdo a quien use este plugin, que puede reportar navegadores no soportados con el modo debug, algo que permitirá ir mejorando poco a poco el plugin.

El que quiera descargarlo puede hacerlo desde el administrador de WordPress buscando «User Agent Theme Switcher» o desde la pagina del plugin en WordPress

Algunas capturas:

Skype para Android, todo son problemas

SkypeEstoy muy interesado en poder tener Skype para Android, porque me permitirá realizar llamadas a amigos aprovechando la tarifa plana de 3g y no pagandola, por lo que para mi en algunos casos es interesante. Varias veces a la semana, suelo entrar en el Android Market en busca de la esperadísima versión oficial de Skype y con mas intensidad después de que Skype, en una clara estrategia de eliminación de la competencia ha negado el acceso a Nimbuz, Fring y similares al API de Skype, algo que decía a voces que estaban a punto de sacar la versión oficial.

Mi desilusión viene al ver que por fin esta la aplicación de Skype para Android en el Android Market, pero al intentar instalarla no he podido. Lo habré intentado como 10 veces sin éxito, a lo que automáticamente he ido a la web de Skype para Móviles skype.com/m y me cargaba una página para descargar Skype para Android, pero al pinchar en descargar me aparece una página de error 404. Indignadisimo, al ver que no había manera de bajarse Skype para Android, me he puesto a investigar por varios foros y blogs, encontrando solo quejas de usuarios diciendo que la versión esta muy verde, con muchos fallos y que no funcionaba bien.

Ahora digo yo, que pasa, ¿Que han eliminado la aplicación porque realmente no estaba lista para la puesta en producción? ¿Han sacado Skype para Android antes de tiempo por las criticas recibidas por cortar el servicio a Fring, Nimbuz y similares? Solo se que estoy muy triste, después de esperar con tanta ansia este programa y primero no poder instalarlo y después que no he visto a ningún usuario que no diese alguna queja sobre el programa. La verdad, esperaba mas de una empresa informática no española y mucho menos con tanto nombre como Skype.

Publicada la versión 0.2 de puntoengine

He publicado la nueva versión de Punto Engine PHP, o PEP en su versión 0.2. Esta versión trae importantes mejoras con respecto a la versión anterior, ya que administra mucho mejor el sistema de templates para poder hacer páginas dinámicas mucho mas fácil y rápido. Entre las mejoras cabe destacar:

  • Añadido un archivo de changelog para poder ver las modificaciones.
  • Ahora el Kernel permite recuperar la ruta virtual (la que accede desde el navegador) aparte de la ya implementada ruta física.
  • Los Servlet tienen ahora un atributo de url para poder realizar controles si fuera necesario.
  • En el web.xml se puede configurar el modo debug para poder tener una traza mas detalla del error que se produjo.
  • En el Servlet se ha añadido un atributo debug para en caso de desarrollo, poder realizar trazas si se desea.
  • El metodo SendRedirect para redireccionar la pagina hacia otra, ahora tiene una funcionalidad como .Net donde si añadimos la clave «~/» al principio de la url, esta sera sustituida por la url del proyecto.
  • Ahora los Servlets pueden tener una MasterPage para tener un template base desde el que cargar el contenido.
  • En los templates, si ponemos la clave «~/» en un enlace, css o similar, sustituira esta por la ruta del proyecto.
  • Se han cambiado los mensajes que aun aparecian en los errores de «IDCS Server» por «Punto Engine Server».
  • Se ha cambiado el HomeController por TestController y se han añadido diferentes funcionalidades de MasterPage y diferentes ejemplos a mostrar para ver su funcionamiento.
  • Se ha corregido un error que provocaba que cuando se lanzaba una excepción no fatal, se seguian mostrando otros errores encadenados.
  • Se ha borrado temporalmente el acceso mediante web.xml al PepAdmin ya que es aun no es funcional.

Las mejoras de esta versión son bastante importantes y permiten un desarrollo mas fluido de las páginas. Para quien quiera descargarlo puede hacerlo entrando en la web del proyecto puntoengine.

Namespaces o espacios de nombre virtuales en javascript

En la mayoría de lenguajes de programación relativamente maduros o potentes, existe lo que denominamos namespace o espacio de nombres. Los namespace no son otra cosa que unos contenedores de nombre donde podremos contener clases, funciones y variables que pueden repetirse con el mismo nombre en otros espacios de nombre o namespace sin que ello suponga un error. Un ejemplo claro de cual es la verdadera utilidad organizadora de los namespace o espacios de nombres es en las librerías gráficas de los lenguajes de programación, ya que en estas librerías un elemento muy común suele ser la clase Window que hace referencia a una ventana pero que puede estar dentro de GTK, QT, .Net, API de Windows, etc. (esto no es muy correcto puesto que GTK seria GTKWindow pero es por poner un ejemplo). Javascript, como un lenguaje ya mas que maduro con el paso de los años y relativamente estandarizado por los navegadores modernos, pese a ser un lenguaje de programación multiparadigma, al igual que haga PHP, también tiene namespaces o espacios de nombre, aunque debido a la debilidad de las variables estos namespaces son mas virtuales que reales.

Entendiendo que es y para que sirve un namespace, para declararlo en javascript, lo que debemos de hacer es utilizar arrays para generarlo. Gracias a la debilidad y dinamismo de las variables en javascript, podemos asignar a una variable un array de posiciones por nombre y acceder a estas mediante un signo de puntuación «.» y no por su clave común de array [«clave»], por lo que aquí es donde viene el truco. Básicamente lo que hacemos al declarar un namespace en javascript es asignar a un variable un array con las posiciones del namespace y luego ya dentro de estas posiciones, acceder como si desde .Net o Java se tratase. Con un ejemplo se ve mas sencillo.

var Indalcasa = { Utilidades : {} };

Indalcasa.Utilidades.MiClase = function() {
  this.variable = "valor";

  this.metodo = function(parametros) {
    return this.variable + " " + parametros;
  }
};

var iClase = new Indalcasa.Utilidades.MiClase();
iClase.variable = "nuevo valor";
alert(iClase.metodo("prueba"));

El ejemplo anterior mostrará una ventana de alert con un mensaje tal que «nuevo valor prueba», ya que hemos instanciado la clase, le hemos cambiado el valor al atributo de la clase y en el método de la clase, concatenamos el valor del atributo de la clase al parámetros que hemos pasado. Esto es un pequeño y sencillo ejemplo de lo que se puede hacer con javascript, namespaces y clases.

Publicada la version 0.1.1 de puntoengine

Ayer publiqué la versión 0.1.1 de puntoengine. Puntoengine o Punto Engine PHP acortado PEP, es un framework en fase alfa para PHP del tipo MVC o Modelo Vista Controlador. Este framework basa su funcionalidad en una mezcla de diferentes frameworks web como son ASP.Net, Java Servlets y PHP en un antiguo framework propio llamado RLM Engine. Actualmente, pese a estar en una fase de desarrollo muy verde, pero ya es completamente operativo y se pueden construir webs con un sistema de Servlets como se haría una web en Java. La versión 0.1.1 en su revisión 7 de puntoengine se trata de la versión ya publicada 0.1.1 de puntoengine pero con la documentación completa del código, lo que facilita a quien quiera ver y estudiar el código y su funcionamiento, que sea mas fácil de seguir. Para la versión 0.2 de puntoengine se espera la creación de un administrador, actualmente en fase de desarrollo para poder gestionar entre otras cosas los Servlets instalados y la preparación para futuros plugins como puede ser el sistema de CMS.

Este es un proyecto a largo plazo y muy ambicioso que espero llegue lejos y pueda utilizarlo para construir diversas webs que tengo en mente. Según un calculo realizado siguiendo el sistema COCOMO, actualmente el proyecto con casi 1500 lineas de código, tendría un coste privado de unos 6.000€. Para el que quiera echar un vistazo e incluso colaborar con el desarrollo, documentación o aportando incidencias, puede hacerlo en la web del proyecto puntoengine.

Android ya es el segundo sistema operativo móvil en el mundo

Como cito en el título de este post, Android ya es el segundo sistema operativo móvil mas usado en este mundo. Según un estudio que ha realizado la consultora tecnológica Gartner según el crecimiento y uso de cada sistema operativo móvil, Android acaba de superar a BlackBerry, convirtiendose en el segundo sistema operativo móvil mas usado y con una estimación de que en los próximos 4 años alcance a la todopoderosa Nokia y su Symbian, pudiendo superar a esta en 2014. Según este estudio, en la actualidad y como se espera en los próximos años, Nokia con Symbian, seguirá al frente de los dispositivos móviles pero perdiendo cuota de mercado poco a poco frente a Android.

En la actualidad, el listado de sistemas operativos móviles mas usados es el siguiente:

  • Nokia, Symbian: 107.662.400 unidades, 40.1% cuota de mercado
  • Google, Android: 47.462.100 unidades, 17.7% cuota de mercado
  • RIM, Research In Motion, BlackBerry: 46.922.900 unidades, 17.5% cuota de mercado
  • Apple, iOS (Iphone): 41.461.800 unidades, 15.4% cuota de mercado
  • Microsoft, Windows Phone: 12.686.500 unidades, 4.7% cuota de mercado

Según las previsiones de crecimiento, y aunque desconozco si se han contado con los futuros proyectos que Google plantea para Android, como Google TV, se espera que en tan solo 4 años, Android alcance a Symbian, por lo que para 2015 y si las cosas no se tuercen, podríamos ver desbancada a Nokia de la privilegiada primera posición en el mundo de los dispositivos móviles. Las previsiones para 2014 son las siguientes:

  • Nokia, Symbian: 264.351.800 unidades, 30.2% cuota de mercado
  • Google, Android: 259.306.400 unidades, 29.6% cuota de mercado
  • Apple, iOS (Iphone): 130.393.000 unidades, 14.9% cuota de mercado
  • RIM, Research In Motion, BlackBerry: 102.579.500 unidades, 11.7% cuota de mercado
  • Microsoft, Windows Phone: 34.490.200 unidades, 3.9% cuota de mercado

Veremos si la evolución e innovaciones de las compañías hacen de esto una realidad o no. De momento y en opinión de un humilde servidor, Android, si el resto de compañías siguen con sus actuales políticas, se convertirá en breve en el numero uno de los sistemas operativos móviles, ya que Nokia no evoluciona ni innova, estaba genial cuando tenia móviles de toda la vida, pero ha llegado tarde y con grandes tropezones a la carrera de las nuevas tecnologías móviles. BlackBerry que mantendrá su posición corporativa y Apple con iOS y sus políticas restrictivas, no llegaran a donde todos esperan que lleguen. Solo el tiempo dirá que pasara y pondrá a cada compañía en su lugar.

Buscando aparcamiento con Open Spot para android

Echando un vistazo a la web de Google Labs, me encuentro con una aplicación para Android que ha desarrollado Google bastante curiosa. La aplicación en cuestión es Open Spot, se trata de un programa, similar a un GPS con Google Maps, que nos indica plazas de aparcamiento libres para que podamos aparcar. El funcionamiento es muy sencillo, un usuario que va a desplazarse con el coche, indica al programa que va a dejar su aparcamiento libre, aunque supongo que también se puede hacer a pie si vemos un hueco, y automáticamente a los usuarios que esten cerca y tengan Open Spot para Android abierto, les aparecerá un POI en el mapa indicando que ahí se encuentra una plaza libre de aparcamiento. La verdad es que además de ser una aplicación bastante curiosa, es muy útil ya que para aquellos que vivimos en grandes ciudades, nos puede ahorrar mucho tiempo y gasolina que gastamos a base de dar vueltas a las manzanas para encontrar el dichoso aparcamiento. Resaltar también que el usuario puede recibir karma de otros usuarios que hayan encontrado aparcamiento gracias a el, por lo que puede resultar hasta divertido utilizarlo. Como nota restaltar que de momento solo se encuentra disponible en Estados Unidos, Canada y Paises Bajos, pero esperemos que llegue a España pronto. Si quereis echar un vistazo os dejo la web de Open Spot.

Open Spot marcando un spot

Open Spot recuperando Spots

Convertir un texto a mayusculas (toUpper) o minusculas (toLower) con transformadas xslt

Muchas veces, cuando necesitamos manipular texto desde transformaciones xsl, nos encontramos con el caso de que tenemos un texto en mayúsculas o un texto en minúsculas y queremos convertirlo a minúsculas o mayúsculas respectivamente. En cualquier lenguaje, solemos tener métodos para hacer un ToUpper, strtoupper o por el contrario ToLower, strtolower y similares, pero en xsl, al ser tan genérico, no disponemos de ese tipo de funciones, aunque si deberían de estar.

Para suplir esta necesidad, me he creado 2 funciones muy útiles que utilizan la funcion traslate, que comentare en otro articulo. Básicamente lo que hacemos es intercambiar una cadena por la otra en base a lo que va entrando por un texto. Con estas funciones podemos llamar a StringToLower o StringToUpper como si de un template normal se tratase, indicandole el texto que queremos convertir a mayúsculas o convertir a minúsculas y automáticamente nos convertirá la cadena.

El código seria el siguiente:

<!-- Variables globales -->
<xsl:param name="lower" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:param name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
 
<!-- Convierte una cadena de texto, todo en minusculas -->
<!-- @param string text Cadena a convertir a minusculas -->
<!-- @return Cadena en minusculas -->
<xsl:template name="StringToLower">
  <xsl:param name="text"/>
  <xsl:value-of select="translate($text,$upper,$lower)"/>
</xsl:template>
 
<!-- Convierte una cadena de texto, todo en mayusculas -->
<!-- @param string text Cadena a convertir a mayusculas -->
<!-- @return Cadena en mayusculas -->
<xsl:template name="StringToUpper">
  <xsl:param name="text"/>
  <xsl:value-of select="translate($text,$lower,$upper)"/>
</xsl:template>
 
<xsl:call-template name="StringToLower">
  <xsl:with-param name="text"
      select="'Mi texto que quiere ser Reemplazado a minusculas'" />
</xsl:call-template>
<xsl:call-template name="StringToUpper">
  <xsl:with-param name="text"
      select="'Mi texto que quiere ser Reemplazado a mayusculas'" />
</xsl:call-template>

El resultado de esta tranformacion del StringToLower seria «mi texto que quiere ser reemplazado a minúsculas» y la segunda llamada con el StringToUpper seria «MI TEXTO QUE QUIERE SER REEMPLAZADO A MAYUSCULAS». Esto es algo muy útil para trabajar con textos.

Publicado el plugin de WordPress UserAgent theme switcher 1.2

UserAgent theme switcherAyer publiqué la versión 1.2 del plugin de WordPress «UserAgent theme switcher». Es plugin para quien no lo conozca es un plugin de WordPress que mediante un sencillo administrador, nos permite indicar que tema se mostrara a que navegador. De esta forma podemos crear o descargar un tema especifico para dispositivos moviles y decirle que iphone o android utilicen este tema. Entre las principales novedades que se presentan en esta nueva versión, se encuentran:

  • Se ha mejorado el patrón de Safari Mobile, ya que este difiere levemente de si se trata de Android o iPhone.
  • Si usas el modo debug, ahora puedes eliminar useragents de la lista de no soportados.
  • Si usas el modo debug, ahora puedes reportar un useragent no soportado.

Aunque puede ser una tontería, usar el modo debug puede ser importante para el desarrollo y mejora del sistema, ya que ayuda a detectar y reportar useragents no soportados aun y que puedan ser añadidos en un futuro.

Skype Mobile para android

SkypeSi algo hecho en falta en Android es mi querido Skype, busque como loco en el market y en la web de Skype pero aun no hay una versión oficial para poder utilizar este programa en nuestros android. Según he visto por la web de skype, parece que hay algunas versiones de prueba beta para teléfonos de Verizon y también se encuentra skypelite que es digamos el chat de Skype pero no nos permite llamar por voip. La alternativa a todo esto viene de la mano de Fring, que si registramos nuestra cuenta de Skype podremos llamar a nuestros contactos. Teniendo en cuenta que la mayoría de los teléfonos nuevos que se compran, se hace mediante un contrato por tarifa plana de datos, Skype puede suponer una autentica revolución, ya que podremos aprovechar esa tarifa plana para realizar llamadas a nuestros contactos sin gastarnos un solo céntimo. Espero con ansias la versión definitiva y abierta de Skype para Android, que según parece aparecerá en otoño de este año, aunque hasta entonces habrá que conformarse con Fring.

Descodificar Quoted Printable para leer correos de GMail en Visual Basic

Un amigo esta realizando un proyecto en Visual Basic .Net, que entre otras cosas se conecta a GMail para recibir correos e introducirlos en una base de datos para mostrarlos en un panel de administración. Hasta aquí todo normal, el problema viene cuando en los correos utiliza caracteres, que vamos a llamar extraños, como tildes por ejemplo. Cuando recibimos por código un mail que por ejemplo contenía la cadena «conexión», este texto no se nos devuelve así, sino que nos devolvería «conexi=F3n» y he aqui el problema, ya que esto no es codificación normal de UTF-8 a ASCII o similares sino que es completamente diferente.

Los servidores de correo utilizan protocolos bastante antiguos, en los que todo se basta en texto. Para separar encabezados se utilizan saltos de linea tipo «rn» o «n» y por ejemplo para adjuntar archivos hay que declarar una marca y decirle que el contenido del archivo esta entre marca y marca. Como no, todo esta basado en texto ASCII por lo que los caracteres extraños, letras con acento, eñes y similares, suelen encontrarse en una codificación que se llama «Quoted printable».

Quoted Printable o simplemente acortado QP es un sistema de codificación de 8 bits compatible con ASCII que basa su codificación de caracteres extraños en un formato de un símbolo igual seguido de 2 posiciones hexadecimales. Se rige por el estándar RFC-1345. Aunque algunos lenguajes traen incorporado por defecto funciones o librerías para codificación y descodificación de caracteres, .Net no tiene nada para descodificar este tipo de codificación. A continuación os mostrare un ejemplo de función de Visual Basic para la descodificación de estos caracteres, que básicamente recoge estos caracteres hexadecimales, los convierte a entero y obtiene el caracter de ASCII extendido de 255 caracteres, no el tradicional de 128 caracteres. De esta forma, obtendrá el carácter correcto ya traducido. Os dejo el ejemplo de la función:

Función de descodificación de cadenas de texto Quoted Printable

Public Shared Function QuotedPrintableDecode(ByVal text As String) _
As String
  Dim i As Integer
  Dim DecodedString As StringBuilder
  Dim Chars As Char()
  Dim CharsValue As String
  Dim HexValue As Integer

  Chars = text.ToCharArray()
  DecodedString = New StringBuilder

  For i = 0 To Chars.Length - 1
    If Chars(i) = "=" Then
      CharsValue = Nothing
      HexValue = Nothing

      If Chars(i + 1) = "0" Then
        CharsValue = Chars(i + 2)
      Else
        CharsValue = Chars(i + 1) & Chars(i + 2)
      End If

      HexValue = Val("&H" & CharsValue)

      If CharsValue.ToUpper = Hex(HexValue) Then
        DecodedString.Append(ChrW(HexValue))
        i += 2
      Else
        DecodedString.Append(Chars(i))
      End If
    Else
      DecodedString.Append(Chars(i))
    End If
  Next

  Return DecodedString.ToString
End Function

Ahora solo hace falta llamar a esa función pasando la cadena a convertir:

Public Shared Sub Main()
  Dim text As String = "conexi=F3n"
  Console.WriteLine(Application.QuotedPrintableDecode(text))
End Sub

El resultado de aplicar esto seria la cadena «conexión». Para que funcione es necesario importar el namespace System.Text, pero solo para el StringBuilder

Imports System.Text

Espero que os sirva de ayuda.

Indalcasa ahora también en ingles

En mis esfuerzos por la promoción de este blog y de mejorar como profesional, darme a conocer y llegar a mas y mas público, he decidido que el blog que en español esta bastante bien posicionado y tiene un número de visitas aceptable, crear una rama del blog en ingles. El blog en español esta muy bien posicionado dentro de los buscadores, tiene casi 200 visitas únicas diarias y teniendo en cuenta que no tiro de amistades, sino que son visitantes reales interesados por el contenido y que acceden casi en un 100% de buscadores, salvo alguna excepción como twitter, facebook y rss, es el momento de seguir creciendo y llegar a otro tipo de publico.

Revisando las analíticas de la página, la inmensa mayoría de los visitantes son españoles, entorno a un 35% y el resto se reparte entre ArgentinaMéxico y Chile con un 20% mas o menos cada uno. Pero hay una minoría que no es despreciable si contamos el numero de visitas mensuales, que provienen de países como EEUU, Inglaterra u otros países. Es por esto que he decidido crear la rama o versión inglesa de este blog, para acceder a esos usuarios internacionales que quizás les cueste entender el contenido o que son minoría porque Google no muestre los mismos resultados desde EEUU que desde España cuando un usuario busca contenido en ingles y en el blog se encuentra en español. Por supuesto no voy a trabajar con 2 blogs diferentes, ya que sería una locura, sino que la versión inglesa simplemente seria un mirror del blog principal pero con el contenido integro en ingles. Actualmente me encuentro en proceso de traducción de los artículos mas antiguos para ir publicandolos poco a poco en la versión inglesa mientras esta es rastreada y posicionada poco a poco y cuando la versión inglesa alcance al blog principal, se escribirán los artículos en español y posteriormente se publicaran en su versión en ingles.

Para desarrollar esto he tenido varias opciones, una de las cuales era utilizar plugins de WordPress como WPML que nos permiten mostrar el contenido en multidioma traduciendo poco a poco el contenido que se desee, paginas, artículos, etc. Lo he estado probando durante un rato y aunque muy pero que muy interesante y esta muy bien estructurado y sencillo de utilizar, al final he decidido no utilizarlo. El final ha sido crear un subdominio en.indalcasa.com con la versión inglesa del blog, puesto que aunque WPML se adecuaba a mis necesidades básicas, por temas de publicidad, analíticas y demás, prefiero crear un espejo completo y no ensuciar la base del blog principal. De esta forma puedo poner códigos de analytics diferentes, publicidades diferentes adecuandose a cada idioma y algún detallito mas, puesto que existen ciertos problemas o errores que cometí en los comienzos de este blog que prefiero subsanar en la versión inglesa y no arrastrarlos conmigo.

Espero que disfrutéis o al menos los no hispanohablantes disfruten de la versión inglesa de Indalcasa o como lo diría ahora, Indalcasa english version.

Siguenos también en en.indalcasa.com

Scroll al inicio