Invocar constructores genéricos por reflexión

Explicaré brevemente cómo se puede invocar un constructor genérico por reflexión (del namespace System.Reflection) dado que a veces solamente tenemos el Type del genérico y no se puede pasar entre dado que no es el nombre de una clase.
Para mi caso, es una acción de un método web que me pasa un string con el nombre de la entidad a procesar por lo que el proceso, que es un método genérico, no se podía llamar de este modo:

public void ProcessStuff(Type type, object data)
{
    var processor = new Processor(); // Esto da error

    var results = processor.process(data);
}

Entonces, esto es un problema ya que el método ProcessStuff en este caso no puede ser genérico, lo que solventaría así el problema:

public void ProcessStuff(object data)
{
    var processor = new Processor();

    var results = processor.process(data);
}

Así que el namespace System.Reflection viene en nuestra ayuda y el secreto está en el método MakeGenericType. El método final es algo así:

public void ProcessStuff(Type type, object data)
{
    var constructor = typeof(Processor).MakeGenericType(new[] { type }).GetConstructor(new Type[] {}); // Obtiene el constructor sin parámetros
    var processor = constructor.Invoke(new object[] { });

    var processMethod = processor.GetType().GetMethod("Process", new[] {typeof(object)}); // Obtiene el método del objeto creado
    var results = processMethod.Invoke(processor, new[] {data}); // Llama al método
}

Y eso es todo. Es un poco más engorroso, por supuesto, pero nos puede sacar de más de un lio y ahorrarnos un montón de switches.

Posted in Productividad | Tagged , , | Leave a comment

NHibernate Burrow y NHibernate Search

English version

En este post voy a explicar cómo he conseguido hacer funcionar ambos proyectos a la vez usando los eventos de NHibernate que sustituyen a los clásicos interceptors. A través de estos eventos, permitimos que NHibernate.Search indexe los elementos marcados para tal efecto sin tener que obtener explícitamente la sesión, cosa que solamente deberemos hacer a la hora de buscar en los índices a través de la sesión de NHibernate.Burrow.
Para empezar, habría que configurar adecuadamente la aplicación (App.config):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="NHibernate.Burrow" type="NHibernate.Burrow.Configuration.NHibernateBurrowCfgSection, NHibernate.Burrow" />
    <section name="nhs-configuration" type="NHibernate.Search.Cfg.ConfigurationSectionHandler, NHibernate.Search" />
  </configSections>
  <NHibernate.Burrow>
    <persistenceUnits>
      <add name="PersistenceUnit1"
           nh-config-file="hibernate.cfg.xml" />
    </persistenceUnits>
  </NHibernate.Burrow>
  <nhs-configuration xmlns='urn:nhs-configuration-1.0'>
    <search-factory>
      <property name='hibernate.search.default.directory_provider'>NHibernate.Search.Store.RAMDirectoryProvider, NHibernate.Search</property>
      <property name='hibernate.search.default.indexBase'>~/Index</property>
    </search-factory>
  </nhs-configuration>
</configuration>

El NHibernate.Search no maneja demasiado bien el tema de la sección y busca una llamada nhs-configuration, así que es mejor no cambiarle el nombre. Por otro lado, habrá que crear un fichero hibernate.cfg.xml con la configuración de NHibernate. Por ejemplo, para testado se puede usar una base de datos en memoria de SQLite:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
    <property name="connection.connection_string">Data Source=:memory:;Version=3;New=True;</property>
    <property name="connection.release_mode">on_close</property>-->

    <mapping assembly="Mapped.Assembly" />
    <mapping assembly="Mapped.Assembly2" />
  </session-factory>
</hibernate-configuration>

Sin olvidar las secciones de mapping-assembly donde se indicaran los ensamblados a mapear.
Después, lo más interesante es la inicialización de Burrow para que tenga en cuenta los eventos de Search. Por ejemplo esto es lo que tengo al inicio de cada caso de test:

            var framework = new BurrowFramework();

            Configuration config = framework.BurrowEnvironment.GetNHConfig("PersistenceUnit1");

            // Poner los EventListeners
            config.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener());
            config.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener());
            config.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener());

            framework.BurrowEnvironment.RebuildSessionFactories();

La última línea es importante porque actualiza la sesión de NHibernate con los cambios realizados. Esto en realidad también se podría haber puesto en el fichero nhibernate.cfg.xml poniendo dentro de la sección session-factory lo siguiente:

        <listener class="NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search" type="post-update" />
        <listener class="NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search" type="post-insert" />
        <listener class="NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search" type="post-delete" />

Con eso no haría falta añadir manualmente los manejadores ni regenerar los session factories.
En resumen, de este modo las entidades indexables (ver el post de Dario Quintana al respecto de NHibernate.Search) son tratadas automáticamente por la librería sin tener que hacer nada especial.
Ahora solamente quedaría hacer búsquedas sobre los índices. Por ejemplo en este caso este simple test crea una sesión de NHibernate.Search y hace una búsqueda sobre una entidad indexada, basándome en el ejemplo de Darío:

        [Test]
        public void SearchIndexedUser()
        {
            var session = Search.CreateFullTextSession(new BurrowFramework().GetSession());

            var qp = new QueryParser("UserName", new StopAnalyzer());
            var nhQuery = session.CreateFullTextQuery(qp.Parse("test"), typeof(User));

            var results = nhQuery.List();

            Assert.AreEqual(1, results.Count);
        }

Hay que tener en cuenta una cosa importante: Nhibernate.Search tiene en cuenta las transacciones y NHibernate.Burrow hace uso intensivo de las mismas, así que si en el test se crean los datos que luego se quieren buscar en el índice habrá que hacer lo siguiente:

            new BurrowFramework().CloseWorkSpace();
            new BurrowFramework().InitWorkSpace();

Con este código terminamos todas las transacciones pendientes por acometer de Burrow y se crea una nueva de modo que todos los cambios pendientes en los índices se persisten.
Y eso es todo. Con esto se pueden integrar de forma sencilla estos dos interesantes y útiles proyectos que de otro modo sería complicado ya que no se puede modificar directamente la sesión de Burrow además de ser incómodo el uso de interceptors ya que hay que trabajar un poco para poder usar varios a la vez, por lo que el mecanismo de eventos es mucho más limpio.
Finalmente comentar que ambas cosas las he hecho compilando el código del trunk tanto de NHibernate.Burrow como de NHibernate.Search que se puede conseguir en el SVN de nhcontrib contra la versión actual estable de NHibernate, la 2.0.1GA.
Espero vuestros comentarios.

Posted in Programación | Tagged , , , | 2 Comments

Resumen de 2008

Como referencia, he recopilado lo 10 posts más interesantes, leídos y populares de 2008:

Esto y mucho más fue lo que dio de sí el año 2008. Espero en 2009 ser algo más prolífico, por lo menos un post por semana. Con llegar a unos 50 posts estaría bien, pero tampoco hay que abusar.

Que paséis un buen 2009.

Posted in Blogging | Tagged | Leave a comment

Los amigos informáticos

Logo Informática

Logo Informática

Está habiendo mucho revuelo en el mundillo de la informática con esto de la huelga de informáticos y de que según dicen quieren acabar con la carrera de informática.

Personalmente, lamento que gente como el CPIIA esté liderando o por lo menos haciendo más eco de la noticia, donde en su web se pueden leer declaraciones como esta:

Desaparece la ingeniería en informática. Se cumple el deseo de muchos. Por fin desapareceremos y dejamos el camino libre al ejercito de aficionados y “reciclados” para erigirse como los nuevos y verdaderos informáticos. Dejaremos de ser un problema.

Desde luego, debo sentirme aludido con lo de “reciclados” ya que supongo que para estos bendecidos por Santa Tecla, yo no soy ni mucho menos un verdadero informático.

No entiendo porque dicen que es el deseo de muchos ver desaparecer a los informáticos. En mi día a día trabajo con verdaderos informáticos y también con aficionaduchos de tercera como industriales o telecos, esos reciclados que usurpan los puestos de trabajo que tanto merecen los verdaderos informáticos. Y no voy a decir que estén todos igual de preparados para ciertas cosas, pero el desarrollo de software es un conocimiento transversal y eso es algo innegable, por lo que, al igual que ocurre con la lengua o las matemáticas o la física, no solamente los verdaderos filólogos, matemáticos o físicos tienen el poder divino de deleitarnos con su conocimiento.

Y otra perla:

Nunca tendremos atribuciones profesionales. No la hemos tenido hasta ahora y al desaparecer ya no las tendremos nunca. No sabemos que pasará con los nuevos títulos aunque por su caracter local a cada universidad no parece posible que lleguen a tener atribuciones.

Qué obsesión con las atribuciones. No todas las ingenierías tienen atribuciones ni mucho menos todas las especialidades universitarias. De hecho, la mayoría no tienen grandes atribuciones como pueden tener los arquitectos, sino pequeñas, que puede que den trabajo a algún titulado pero desde luego no es el pan de cada día de la mayoría.

Estoy plenamente de acuerdo con que es cierto que hay mucho personal no cualificado haciendo labores de informático, pero también existe “Está pasando”  en Telecirco dónde hay quien hace labores de periodista. Y médicos con títulos falsos y conductores de autobús sin carné, pero es lo que hay. Ciertamente la informática está devaluada por muchos motivos pero no creo que poniéndose en contra de gran cantidad profesionales que sin ser verdaderos informáticos hacen muy bien su labor consigan nada positivo.

Así pues, aunque en mi opinión no debería desaparecer informática porque hay conocimientos suficientes para que exista una carrera al respecto (aunque desde luego no tan mayoritaria como es ahora), no pienso apoyar la huelga porque la encuentro excluyente y estoy harto de oir lloriquear a los verdaderos informáticos de que si los falsos y impostores informáticos les quitamos los puestos de trabajo. Eso sería así si hiciesemos mal nuestro trabajo o cobrásemos menos que ellos por lo mismo, pero señores, esto no es así. No tenemos ninguna ventaja competitiva sobre ellos, lo que no es un problema nuestro, sino de los informáticos verdaderos, que no han sabido dar una plusvalía a sus aptitudes.

Posted in General | Tagged , | 7 Comments

El síndrome NIH redux

Ya escribí en su momento sobre la cultura NIH, pero un interesante post de Jeff Atwood invita, como siempre a la reflexión sobre cuando es conveniente reinventar la rueda.

El caso es que se plantea hacer una función para sanear el HTML que introducen los usuarios de modo que se eviten los posibles ataques XSS. Alguien le dice que para que hacerlo si eso seguro que ya esta hecho a lo que Jeff responde con este post, indicando que el conocimiento sobre el saneamiento del HTML es una parte fundamental de su negocio.

En ese momento, se hace referencia a un artículo de Joel Spolsky en defensa del NIH, donde se introduce el siguiente cuestionario:

  1. La reutilización de código es:
    1. Buena
    2. Mala
  2. Reinventar la rueda es:
    1. Bueno
    2. Malo
  3. El síndrome NIH es:
    1. Bueno
    2. Malo

Cuestionario al que toda persona de bien debería responder 1), 2) y 2). ¿Verdad?

Entonces viene la defensa. Vale, reutilizar código, tanto nuestro como de otros es bueno. Vale, reinventar la rueda es una pérdida de tiempo, seguramente otros hacen mejores ruedas y vamos a perder el tiempo. Vale, el síndrome NIH es una lacra social.

Pero… ¿existe algún motivo por el que valga la pena reinventar la rueda?

Joel lo dice claro:

Si es una función principal de tu negocio, hazla tú mismo, no importa lo que sea.

Es decir, si lo que hay que desarrollar es nuestro propio negocio, hay que reinventar la rueda y invertir esfuerzo en hacerlo. No importa lo que sea, pero si nuestro negocio depende de ello y es parte del conocimiento de nuestra empresa, lo mejor será hacerlo uno mismo.

En mi caso por ejemplo, tenemos desarrollado un gestor de proyectos. En su momento, fue un producto estrella y lo lógico es que hiciésemos el desarrollo y además, lo usásemos. Ahora mismo, ya no es parte del negocio así que convendría buscar una solución externa a la gestión interna de proyectos.

También tenemos desarrollado un gestor de tickets, que nunca se pensó como parte del negocio por lo que nunca se tuvo que haber hecho, se podría haber usado perfectamente uno de los miles de gestores de tickets comerciales que existen, como por ejemplo se está haciendo con el CRM.

Pero ahora mismo estamos enfrascados en el desarrollo de un ECM. Vale, hay ECMs comerciales impresionantes a los que posiblemente nunca alcancemos, pero vender ECMs personalizados para el cliente es nuestro negocio y tenemos que saber hacer ECMs. Podríamos revender otros ECMs pero entonces la empresa debería cambiar su enfoque de negocio.

Via | Programming is hard, let’s go shopping!

Posted in Programación | Tagged | Leave a comment

Primera beta de ASP.NET MVC

Todos los que estamos metidos en la programación en ASP.NET hemos oido hablar a estas alturas del nuevo framework MVC que Microsoft está preparando para el disfrute del personal. Las ventajas de usar un entorno de este tipo frente al clásico ciclo de vida de los WebForms son múltiples, ofreciendo una mejor testabilidad, una correcta separación de las responsabilidades de cada componente y un entorno acorde con el desarrollo actual de aplicaciones web. Ya escribí en su momento sobre la cantidad de cosas que no me gustan de los WebForms.

Pues bien, ya ha salido la primera beta que perfila las funcionalidades de la release final después de haber pasado un proceso de 5 previews que han ido evolucionando el producto en base a las necesidades del equipo de desarrollo pero también de una gran cantidad de desarrolladores que nos hemos embarcado en esta aventura. Aun queda algo de trabajo, pero el framework está mucho más pulido que en las primeras releases y, aunque seguro que algunas cosas se podían haber hecho de otro modo, su publicación final puede revolucionar el panorama del desarrollo en ASP.NET. De hecho esta beta ya no cambia demasiadas cosas respecto a la Preview 5 y el cambio es bastante sencillo.

En Variable Not Found leí por primera vez las novedades que traía, y luego como no, ScottGu y Phil Haack escribieron sus habituales posts describiendo minuciosamente las novedades que nos podemos encontrar más allá del listado que cambios que acompaña la release.

Muchas novedades son sobretodo la mejora de cosas existentes y una mejor integración con Visual Studio pero me ha gustado especialmente la inclusión de JQuery en el proyecto por defecto, siendo el primer producto Microsoft en integrar esta librería tal como se había anunciado. Esta “adopción” permitirá la propagación de esta librería y será de gran ayuda a la hora de desarrollar aplicaciones visualmente más ricas.

Como recomendación, no hay que perder de vista el estupendo proyecto MvcContrib, un proyecto Open Source enfocado a mejorar y añadir funcionalidades al propio framework MVC, como por ejemplo más componentes HTML, ayudas para el testado o integración con varias librerías de IoC. Horas después de sacar la beta, ya han actualizado la librería para funcionar con ella.

Y también no olvidar la librería MVC Futures, que incluye algunas estupendas funcionalidades como ActionLinks genéricos usando expresiones lambda de modo que no se especifica el nombre del controlador y la acción sino directamente el nombre de la clase y del método, impidiendo de ese modo los errores tipográficos que se puedan cometer. ScottGu asegura que estas funcionalidades seguirán siendo actualizadas con los nuevos lanzamientos del MVC Framework y estarán disponibles en la versión 1 cuando llegue el momento, por lo que no hay que temer usarlas.

Y eso es todo. Recomiendo encarecidamente a todo aquel que trabaje desarrollando para ASP.NET que le eche un vistazo al proyecto porque en mi opinión es de lo más interesante que se está desarrollando en el mundo del desarrollo web bajo la plataforma .NET, además de que enfatiza las buenas prácticas y mejora la productividad y la claridad de los desarrollos.

Enlace | ASP.NET MVC

Via | ASP.NET MVC Beta: novedades

Posted in Programación | Tagged , | Leave a comment

Instalando Flash 10 en Ubuntu 64 bits

Leí ayer con cierta ilusión que Adobe sacaba el Flash Player 10 simultáneamente para Mac, Linux y Windows (con algunos problemillas por lo visto) pero por lo visto siguen olvidando que somos muchos los usuarios de Linux en 64 bits.

Para Ubuntu existen unas cuantas opciones. Para empezar se puede descargar directamente de la web de Adobe y apañárselas uno mismo, pero por suerte hay gente que piensa y nos hace vagos. Por no decir que ahora mismo no me va la descarga del .deb (su enlace está mal pero se puede conseguir igualmente), que de todos modos no funciona en 64 bits.

La siguiente opción es por ejemplo, ver que en la nueva versión de Ubuntu estará el nuevo Flash, así que nos podemos bajar el .deb (abajo del todo, la versión amd64) de esa distribución (o configurar apt para que lo haga, pero es más complicado).

Acto seguido:

sudo dpkg -i flashplugin-nonfree_10.0.12.36ubuntu1_amd64.deb

Y por lo menos a mi me salta un precioso error:

*** NSPlugin Viewer  *** ERROR: libnss3.so: cannot open shared object file: No such file or directory

Por lo visto es algún tema de que faltan unas librerías en /usr/lib32, que no tengo ganas de buscar. Es tarde y quiero ver el Flash en marcha. Sigo googleando y encuentro una página con un script .sh [queleimporta.com] para hacer todo lo que siempre quise.

Es más, se puede hacer incluso en una línea:

wget http://queleimporta.com/downloads/flash10_en.sh &amp;amp;&amp;amp; sudo chmod +x flash10_en.sh &amp;amp;&amp;amp; sudo sh ./flash10_en.sh

Como tenía curiosidad por ver lo que hacía, lo he descargado, pero hace lo normal, quitar todo lo que pueda crear conflicto, borrar cosas que no sirven, descargar las librerías de 32 bits que faltaban y copiar los archivos descargados de Adobe. En fin, lo lógico.

Ah, cuidado al ejecutar que cierra el Firefox de forma un tanto brusca.

Finalmente, cuanto esté todo instalado y el Firefox reiniciado se pueden visitar unas bonitas demos que prepararon los de Adobe.

Enlace: La forma más fácil de instalar flash 10 en Ubuntu 64 bits [queleimporta.com]

Posted in Linux | Tagged , , | 4 Comments

Test de Joel, autoevaluación

El otro día llegué a un interesante post sobre qué preguntarle a nuestro futuro empleador en una entrevista. Después de leerlo me di cuenta de que si en una entrevista llego a preguntar todo eso y encima valoro las respuestas que me dan, no sé sin encontraría trabajo en el inframundo del desarrollo de software (si trabajas en un sitio que cumple, por ejemplo, 8 de los 12 puntos, por favor ¡contrátame!), por lo menos en España.

Lo importante en definitiva es que se basa en The Joel Test: 12 Steps to Better Code. Son 12 sencillas preguntas que esconden toda una filosofía de buenas prácticas deseables en cualquier entorno de desarrollo. También googleando he encontrado un excelente artículo sobre estas 12 preguntas aplicadas al desarrollo web. Estas son:

  1. ¿Usas control de versiones?
  2. ¿Puedes tener listo el producto en un solo paso?
  3. ¿Compilas el producto a diario?
  4. ¿Tienes una base de datos de errores?
  5. ¿Solucionas los errores antes de escribir nuevo código?
  6. ¿Tienes una planificación actualizada?
  7. ¿Tienes unas especificaciones?
  8. ¿Tienen los programadores un entorno de trabajo tranquilo?
  9. ¿Tienes las mejores herramientas que puedes comprar?
  10. ¿Tienes testers?
  11. ¿Escriben código los candidatos durante su entrevista?
  12. ¿Haces pruebas de usabilidad de “vestibulo”? (O sea, a cualquiera que pase por allí y esté dispuesto)

Aunque en realidad se podrían hacer muchas más, si se realizan la mayoría de ellas probablemente se esté trabajando de forma decente. Si no, la cosa se puede poner complicada: posiblemente vives diariamente en un infierno incomprensible.

Ahora toca la parte complicada. ¿Qué nota sacamos en mi empleo actual? Vamos a ver

  1. Sí, desde hace un tiempo y por supuesto para nuevos desarrollos. Subversion que no es ni el mejor ni el peor pero tiene herramientas chulas como TortoiseSVN y VisualSVN. Además está bastante extendido y se encuentra fácilmente soporte y ayuda.
  2. No, de momento. Es algo necesario y está planificado. Supuestamente con MsBuild o Nant lo podemos conseguir.
  3. Sí. Para el producto actual usamos TeamCity con cierto éxito, gratuita para pequeños grupos. Eso sí, faltan aun los scripts completos del paso 2.
  4. Sí, usamos Redmine y una herramienta interna (bastante inservible, la verdad), aunque no se si el Redmine me acaba de gustar del todo. En fin, mientras tengamos todos los errores registrados bueno es.
  5. Más o menos. A veces el tiempo apremia, pero se debería hacer. La compilación del paso 3 comprueba los tests unitarios, lo que no significa que encuentre todos los bugs, obviamente.
  6. Sí, lo intentamos, aunque a veces vamos dando palos de ciego sin saber muy bien el rumbo.
  7. Eso creo. El flujo de generación de especificaciones es bastante malo, por lo que muchas veces no son lo suficientemente rigurosas ni explícitas.
  8. Depende de la oficina. En la que yo estoy es excelente.
  9. No. Siempre hay pegas para adquirir herramientas pero estamos mejorando.
  10. No oficialmente. Se prueban las cosas bastante mal y sin rigor.
  11. No, lo que me atañe y voy a ver qué puedo hacer al respecto. De momento me leere la Guerrilla Guide to Interviewing a ver qué saco de interesante.
  12. No. Parece que ahora quieren contratar a unos expertos en usabilidad para guiarnos, aun así dudo que se realicen pruebas de este tipo

Así que mi JoelScore(tm) es de unos 6/12. Aprobado raspadillo y por los puntos 1, 3 y 4, lo cual no es por tirarme flores, pero creo que he contribuido bastante a instaurar estas herramientas y procesos. A ver si el año que viene llegamos a 8 o 9/12, lo que estaría bastante bien.

En resumen, aconsejo a todo el mundo que trabaja en este mundillo que lea las preguntas, que lea lo que significan las preguntas y se autoanalice para ver en qué estado está y qué puede hacer por mejorarlo.

Posted in Programación | Tagged , , | Leave a comment

La ignorancia

Ayer me quejé a mi banco online de que había una operación que no podía realizar a través de mi Mac, ya que solamente funcionaba con Internet Explorer y obviamente es un producto que no está disponible para mi plataforma. Esta fue su respuesta:

  • Resolución de Pantalla: 800 x 600 píxeles.
  • El acceso lo puede realizar con los navegadores Microsoft Internet Explorer versión 5.5 y Netscape Navigator 6.0.
  • La intensidad de cifrado del navegador ha de ser, como mínimo, de 128 bits.

No contentos con eso, además añaden:

Así mismo le recomendamos la instalación de las últimas versiones de dichos navegadores, para que pueda aprovechar al máximo todas las posibilidades que le ofrecemos.

Realmente algo complicado, ya que hace ya algún tiempo que Netscape dejó de estar disponible y la versión 6.0, además de ser altamente inestable, apareció en el año 2000. Sin comentarios. Por no decir que Explorer 5.5 también apareció ese año para versiones de Windows anteriores a XP, que aun no existía. Así que dudo bastante que su aplicación funcione en ninguno de esos dos navegadores.

Así que ni corto ni perezoso les indiqué que no me resultaba posible conseguir ninguno de esos navegadores en mi Mac, pero que tenía Safari y Firefox, siendo este último el segundo navegador más usado y que merecía ser considerado como tal y estar soportado ya que está disponible en multitud de plataformas a parte de Windows.

Y esta fue la respuesta:

En primer lugar agradecemos su sugerencia y damos traslado de la misma a nuestros servicios centrales para su valoración y posible implementación.

Se agradece, pero lo mejor viene a continuación:

Asimismo, le informamos de que la página —– está optimizada para trabajar con PC.

Esto ya es lo último. ¿Cómo de optimiza una web para trabajar con un hardware completo? Podría alegar que mi Mac es un PC dado que pocas diferencias tiene con uno de estos ahora que es 100% Intel, salvo el sistema operativo. Veo que mucha gente sigue asociando PC = Windows, lo que ya sabía pero no es lo que espero de un servicio de atención de un banco online.

En resumen: hay que dar soporte a Firefox como poco en todas las aplicaciones web ya que es la única manera de asegurarse que casi cualquier persona podrá disfrutarlas en cualquier plataforma independientemente de su sexo, religión o condición social. Y no solo eso, sino que debería ser considerado como un tipo de discriminación y penalizado como tal. Además, con la aparición de Chrome es posible que el mercado de los navegadores de haga más heterogéneo con el tiempo.

Y otro consejo: que nadie ponga en 2008 que la web está optimizada para Explorer 5.5 y Netscape 6.0 porque es sencillamente mentira.

Posted in Programación | Tagged , , , | 4 Comments

Google Chrome, ¿y ahora qué?

No he podido resistir escribir algo sobre Google Chorme después de ver el estupendo comic de Scott McCloud. Otra vez la gran G da la campanada y se lanza de pleno a la guerra de los navegadores 2.0. Hasta los menos tecnófilos se habrán enterado de la noticia porque ha salido en todas partes.

Pero a mi me ha gustado mucho la noticia por muchos motivos. Por un lado, que Google es una marca de prestigio (posiblemente mucho más que Microsoft), con lo que mucha gente del entorno Windows reacia a usar Firefox va a tener otra opción muy interesante, lo que puede romper de verdad la lamentable hegemonia de Internet Explorer.

Por otro lado, me encanta que usen el motor Webkit porque es el que usa Safari y Konqueror y eso aumentará la necesidad de hacer sitios web compatibles con este motor. Se pueden ignorar un poco a los maqueros (aunque cada vez son más) y por supuesto se ignoran olímpicamente los linuxeros, pero Google simplemente no se puede ignorar. Así que habrá que hacer las cosas bien.

¿Y ahora qué? Pues muchos tendremos que plantearnos cómo enfocar la orientación de los sitios web y la adherencia a los estándares debe ser una necesidad. Ahora se puede cubrir gran cantidad de visitantes simplemente asegurando que la navegación es correcta en Firefox y Internet Explorer 7, pero claro, no se puede olvidar el 6 porque hay gente que inexplicablemente no se actualiza (la mayoría debe ser por tener versiones muy viejas de windows o ilegales de XP). Así que con esos ya son 3 versiones. Ahora también Chrome, ya son 4 navegadores y 3 motores dispares entre sí.

Así que, cada vez está más claro que la única opción viable va a ser adherirse a los estándares web, especialmente de CSS y ser implacable con las malas implementaciones. Y si nuestra web no se ve con un navegador defectuoso (especialmente IE6), insistir a nuestros clientes que no es de recibo usar esos navegadores y por nuestra parte, cumplir a rajatabla los estándares, que para algo están.

Eso sí, habrá que ver si en esta nueva guerra de navegadores no hay que lamentar bajas como hubo que hacer en la primera. Larga vida a Netscape.

Posted in General | Tagged , | Leave a comment