May 15

Descastigado por google

 

Hace tiempo comenté que me habían crakeado el blog, metiendo enlaces ocultos de spam y que google me había castigado por ello, disminuyendo de forma considerable mi número de visitas.

De aquella actualicé mi versión de wordpress a la última versión disponible de forma automática en mi hosting. Pero eso no bastó. Al poco tiempo había vuelto a ser crakeado, así una y otra vez. El número de visitas seguía cada vez más bajo.

Al final me decidí a lanzarme de cabeza al agua. Me descargué manualmente la última versión de wordpress y la instalé a mano totalmente en mi hosting. Tuve el consabido problema de los acentos, pero que ya sé cómo arreglar. La instalación no me dio ningún problema especial.

Y ha sido todo un éxito. Con esta nueva versión no solo no me han vuelto a crakear, sino que a los pocos días noté el efecto en las visitas, como se puede ver en el gráfico. Google me había descastigado

Estadísticas google analytics

 

May 14

chuidiang-editores

 

Acabo de subir a google-code los fuentes de otro pequeño proyecto que me traigo entre manos, chuidiang-editores.

De momento son simplemente unas clases que heredan de JFormattedTextField y hace de editores simples: un EditorNumerico, EditorDate, EditorLongitud, EditorLatitud, etc. Por supuesto, intentando que sólo admitan números correctos, que se puedan poner restricciones, como que el número esté entre un mínimo y un máximo, etc.

También hay un EditorPanelGeneral. Es un JPanel al que se añaden editores de una forma simple y él se encarga del Layout y de colocarlos de forma automática. Este JPanel admite como dato un Hashtable. Con las claves identifica a qué editor pertenece el dato y se lo pasa. En el método getDato() devuelve un Hashtable con los datos de cada uno de los editores.

Y eso es más o menos lo que hay. La intención final es ligar todo esto con base de datos, de forma que para un conjunto de columnas dadas de unas tablas, se construya automáticamente el formulario y más adelante, facilitar también el tema de consultas e inserciones, así como la presentación en un JTable de los resultados, con sus botones de crear/editar/borrar, filtro, etc.

Ahí van algunos enlaces:

y sólo falta lo de siempre, porque empezar he empezado con ganas. Lo que hay que ver es lo que dura.

May 12

log4j 1.2.15

 

Normalmente en mis proyectos maven añado el log4j, siempre la versión 1.2.12. No por ningún motivo en particular. Símplemente era la versión disponible la primera vez que lo añadí a un proyecto maven y luego ha prevalecido el copy-paste de esa dependencia de un proyecto a otro.

El otro día cree un proyecto en casa y no tenía ningún sitio de donde copiar esta dependencia, así que me fuí a internet y busqué cómo ponerla. Puse la 1.2.15, que es la última que encontré disponible para maven.

Me pongo a compilar con maven, a generar el proyecto para eclipse y … ¡¡ Sorpresa !!. Da fallo. Busco el motivo y resulta que entre los jar que no puede bajarse, está el javamail, el activation.jar y algún otro más de los de SUN. Efectivamente, SUN no permite distribuir sus jar, por lo que oficialmente no se puede hacer. En los repositorios maven que hay por el mundo, no están estos jar de SUN, así que maven no se los puede bajar. Hay que bajárselos a mano y ponerlos en tu repositorio local de maven.

Y digo yo… ¿necesito javamail para log4j? Y aunque sea así, ¿voy a usarlo?. Pues más bien no. No tengo ningún interes en recibir por correo el log de mi aplicación y tampoco tengo ningún enemigo al que odie lo bastante como para mandárselo. Mejor dicho, sí lo tengo, pero lo que no tengo son ganas de quedarme de patitas en la calle.

Creo que esta vez se han pasado un poco. Entiendo que un momento dado, ante un error crítico, alguna aplicación crítica quiera enviar un correo a alguien. Pero, ¿es con un log.error(…) la mejor forma de hacerlo?. Desde luego puede ser cómoda en vez de usar javamail directamente, pero ¿tienen que cargar todas las aplicaciones que quieran un uso normal de log4j cargar con javamail?. A mi, desde luego, no me gusta.

Y aquí es donde llegamos a un punto donde siempre he tenido mis dudas. Por un lado la lógica y la elegancia me dicen que debería hacerse algo como log4j-core.jar con lo básico de log4j, es decir, sacar los log por pantalla o por fichero y poco más. Luego, deberían hacerse otros jar de amplicación, como log4j-mail.jar, log4j-bd.jar, etc, de forma que cada uno cargue sólo con lo que necesita. Sin embargo, la pereza me pediría que hubiera un único log4j-con-todo.jar y despreocuparme de andar buscando los que debo. Si me sobra el 90% del jar, da igual, no pasa nada.

Y esas dudas son las que siempre me corroen en el trabajo. Ante un proyecto gigante… ¿hacemos muchos jar pequeñitos por temas, de forma que en otros proyectos podamos llevarnos aquellos mini-jar que necesitamos? o por el contrario ¿hacemos un mega jar con todo y si un proyecto no necesita parte de él no pasa nada?

En la primera opción, al empezar un proyecto, debemos empezar a elegir jars que necesitamos y a coger también los jar de los que dependen esos jar. Afortunadamente maven nos ayuda en el proceso. Sin embargo, la segunda opción es menos elegante pero infinitamente más cómoda. Cuando empiezo el proyecto, me copio el mega-jar-que-lo-tiene-todo y a trabajar, sin más complicaciones.

¿Tú qué eliges?. ¿Elegancia o pereza?

May 11

Ubuntu Hardy Heron: Mi gozo en un pozo

 

Bueno, pues parece que canté victoria demasiado pronto. Aunque conseguí hacer funcionar bien mi Ubuntu Hardy Heron con la tarjeta gráfica ATI y Compiz, sólo fue un espejismo. No sé muy bien si se debe a que se fue la luz y se cayó de golpe el linux, o si símplemente al apagar y reiniciar. El caso es que al arrancar se queda la pantalla negra. Si arranco en recuperación de errores y reconfiguro el servidor de X, arranca, pero no puedo entrar en mi usuario de administración.

Investigando, descubro que el usuario normal sí entra, pero porque no tiene permisos para arrancar no sé qué (lo veo en el fichero de .xsesssion-errors, mientras que el usuario de administración sí los tiene, arranca lo que sea y se le cae la sesión, por lo que vuelta a carátula.

Si desinstalo compiz y desinstalo el driver específico de la ATI, entonces todo va de maravilla. Si instalo el driver de la ATI, linux símplemente no arranca, se queda la pantalla negra. Si pongo compiz, el administrador se sale o se le queda la pantalla blanca. En fin, no tengo ganas de seguir peleando con ello, al menos de momento. Fuera el driver de ATI y fuera Compiz. Tengo un escritorio normalito, pero al menos puedo trabajar.

Por cierto, Ubuntu Hardy Heron viene con Firefox 3.0 Beta. Pues ya le estoy viendo pegas, supongo que son de Firefox. El caso es que según escribo este post, cada vez que aprieto <INTRO> para cambiar de párrafo, se me mueve la barra de scroll vertical del navegador, por lo que mi caja de texto cada vez está más abajo o más arriba. Tras cuatro o cinco <INTROs>, tengo que tocar la barra de scroll para situar mi caja de texto en un sitio visible, ya que tiene a irse fuera de la pantalla.

No me pasa sólo con wordpress, sino también con otros editores de foros y demás. Así que ya me veo desinstalando este Firefox para poner el antiguo.

Otra pega más de este Firefox Beta es que de momento no admite la barra de google (o la barra de google no admite este Firefox, me da lo mismo). El caso es que no puedo ponerla y echo de menos algunas de sus funcionalidades, como ver el pagerank de la página que estoy visitando o ir directamente a las palabras que he buscado en google.  O el tooltip de traducción a español que sale cuando pones el cursor sobre una palabra inglesa.

Y todo esto me hace pensar un pequeño detalle. Hay mucha gente, entre los que me incluyo, (e incluyo por ejemplo al Dr Max Glaser), que dicen que Linux es mucho mejor que Windows y queremos pasarnos definitivamente a Linux y olvidarnos de Windows. Pero muchos no lo acabamos de hacer porque Linux sigue teniendo sus faltantes, sus problemas y sigue sin ser todo lo fácil que debiera. Ojo, no digo que si sabes un huevo, tienes mucha paciencia y te dedicas a ello no puedas afinarlo, pero de momento no es una cosa fácil al alcance de cualquiera.

¿Por qué queremos entonces pasarnos a linux? ¿Símplemente por odio a Microsoft? ¿Símplemente porque hemos oido que linux es mejor?. La experiencia de los usuarios normales no da la impresión de que linux sea mejor, desde luego. He tenido varias distribuciones de linux desde hace muchos años, más de diez: Mandrake, Red Hat, Suse, Ubuntu, y NUNCA, NUNCA he tenido un linux que no se me quedara colgado de vez en cuando o me diera problemas o en el que tuviera todo mi hardware bien instalado o en condiciones de uso (mi nuevo ubuntu Hardy Heron sigue sin dejarme montar cómodamente, ni de cualquier otra manera, los pen drive, problemas de permisos con los que tendré nuevamente que pelearme). Según mi experiencia, la realidad y el motivo por el que no nos pasamos totalmente a linux es

  • Queremos linux porque nos gusta el mundo del software libre y le tenemos algo de tirria a Microsoft. Es decir, ninguna razón práctica y real de peso, salvo que seas un extremista.
  • Linux da muchísimos más problemas que Windows y salvo que seas una persona con cierta experiencia en administración linux y tengas paciencia para afinarlo, no lo vas a tener 100%, salvo que suene la flauta y te hayas comprado un ordenador 100% compatible linux.

Posiblemente, linux sí sea mucho mejor y más fiable como servidor para una red (servidor web, de disco o lo que sea), pero es algo que un usuario normal como yo no tiene en su casa. No veo ningún motivo real y práctico para tener ubuntu instalado… y sin embargo ¡¡lo tengo!!. No quiero quitarlo.

En fin, supongo que es cuestión de tiempo. Supongo que Ubuntu ira bien con las tarjetas ATI cuando salga la distribución Ubuntu Super ATI y mi tarjeta esté obsoleta y justo esa distribución no la soporte.

May 10

Actualización a Ubuntu 8.04 Hardy Heron

 

Ayer decidí actualizar mi versión de Ubuntu Gutsy Gibbon por la nueva Hardy Heron. Como siempre, una odisea. Debo tener un ordenador la mar de raro porque no hay forma de que funcione todo bien a la primera.

Hago la actualización lanzando el comando

sudo update-manager -c

me pide la password de root y me saca la lista de actualizaciones indicándome arriba que hay una nueva versión disponible. Le digo actualizar, espero unas cuantas horas (tardó un montón en bajarse todo) y actualizo. Por supuesto, el sistema se rebota.

La primera pega. Mi password de usuario tiene caracteres especiales y no consigo entrar. El teclado está cambiado y no se escriben los caracteres que yo quiero. Así que a probar hasta que doy con la clave y consigo entrar.

Segunda pega, pantalla blanca y no sale el escritorio. Está ahí, porque veo el cursor cambiar de forma según lo paseo por encima y cuando "pincho a ojo" sobre donde supuestamente están las cosas, veo que el sistema parece que responde. A investigar qué pasa y sobre todo, cómo arreglarlo.

Lo primero, supongo que es cosa de la configuración de usuario, puesto que la carátula de entrada al menos sale. Así que con "Ctrl-Alt-F2" me paso a una consola de texto, entro como administrador y creo un nuevo usuario. Con "Ctrl-Alt-F7" vuelvo al modo gráfico, entro con el nuevo usuario y funciona bien. Va quedando acotado el problema, parece que es la configuración del antiguo usuario.

Para arreglar lo del teclado en la carátula de entrada y ver de paso si se arregla la configuración del usuario antiguo, decido reconfigurar el servidor de X. comando

sudo dpkg-reconfigure xserver-xorg

Nuevamente me pide la password de administrador y luego empieza a contarme todo el rollo de configuración de idioma y teclado, para que vaya metiendo. Tras rellenarlo todo y reiniciar el servidor de X con "Ctrl-Alt-Backspace" ya parece arreglado lo del teclado. Sin embargo, el antiguo usuario sigue dando pantallazo blanco.

Al final, recordando que intenté instalar beryl en su día, me meto por los directorios .gnome2, .gconf y me cargo todo lo que no se parece al usuario recien creado y todo lo que huela a beryl. También me cargo los directorios .beryl y .berylmanagerrc. Vuelvo al modo gráfico, entro y esta vez si va bien, usuario arreglado. Sí, ya sé que es un método chapuza de ensayo y error, pero al menos salió.

Finalmente, la última "peguilla". Compruebo que por defecto Compiz está funcionando y tengo los efectos de escritorio de ventanas "blandas" y cubo que da vueltas (tras habilitarlos), pero que van lentos como ellos solos. Así que voy a "sistema"->"administracion"->"controladores de hardware" y veo que el driver específico de mi tarjeta ATI no está habilitado. Lo habilito y finalmente va todo de maravilla.

Total, una tarde de lluvia entretenido en casa.

May 06

Clase Desktop en Java 6

 

Gracias a este tema del foro de java, he descubierto la clase Desktop de Java 6. Esta clase permite abrir e imprimir ficheros con la aplicación por defecto que indique el sistema operativo. También permite lanzar el navegador por defecto con una URI determinada o el cliente de correo.

Un código tan tonto como este

Desktop.getDesktop().open(new File("c:/pingucd/readme.txt"));

en windows abrirá el notepad con el fichero readme.txt.

Interesante y simplifica bastante algunas cosas.

May 01

Python con MySQL

 

Hay una tontería de la conexión de python con MySQL que me ha llamado la atención y aprovecho para comentar aquí. El tema es que según obtengamos el cursor de la conexión para hacer las consultas, podemos acceder a los resultados de una manera o de otra.

Si obtenemos el cursor de esta manera

conn = MySQLdb.connect (….)
cursor = conn.cursor()

una vez que hagamos una consulta y obtengamos una de las filas resultado, debemos acceder a cada uno de los campos usando un índice de un array

cursor.execute ("select * from tabla")
fila = cursor.fetchone()
# para acceder al primer campo
print fila[0]  

Sin embargo, al obtener el cursor podemos decir que queremos que las filas sean dictionaries, en vez de tuplas, de manera que podemos acceder a los campos usando el nombre del campo, en vez de un índice. Para ello, basta con obtener el cursor de esta manera

conn = MySQLdb.connect (…)
cursor = conn.cursor(MySQLdb.cursor.DictCursor)

y así podemos acceder a los campos a través de su nombre

cursor.execute("select * from tabla")
fila = cursor.fecthone()
# para acceder a uno de los campos
print fila["nombre_columna"]

Una tontería, pero estoy acostumbrado a java y a C++ y no a lenguajes tan flexibles.

 

Apr 30

Pequeño éxito … ¡Y más trabajo!

Como comenté hace unos días, terminé mi pequeña aplicación en python que permite recoger de la gente los tiempos que han dedicado a cada uno de los proyectos y luego genera automáticamente un Excel para entregar al encargado de guardar todo esto oportunamente.

Pues bien, esa aplicación tonta ahorra a mi jefa un trabajo de un par de días de andar preguntando a cada uno a qué se ha dedicado y generar el excel a mano, así que le ha encantado. Tanto, que ha empezado a comentárselo a los demás jefes con el mismo problema y también les ha encantado. ¡¡ Todos quieren !!.

Y claro, cada uno quiere mejoras, añadidos y cosas variadas. Lo que era una aplicación cutre, que básicamente es un script capaz de admitir los datos de la gente desde el navegador y generar un excel, tiene pinta de que se va a convertir con el tiempo en una señora aplicación.

Los jefes que tienen gente, quieren usarla, así que en principio les vale tal cual. La única pega es que cada uno luego querrá el excel de su gente en concreto y no un excel general con todos. Eso me hará meter una nueva columna en la tabla "gente", para indicar quién es su jefe. Y me obligará en la parte de obtener resultados a poner un pequeño combobox que diga "elige al jefe cuya gente quieres convertir en excel".

Por otra parte, están los jefes responsables de los proyectos, con poca gente a su cargo, pero si con un proyecto con muchas contraseñas y muchos dineros. Para ellos el excel es lo de menos, pero lo que si están pidiendo es que quieren una forma de ver cuánta gente carga a su proyecto e incluso un histórico, para saber en cada una de las contraseñas del proyecto, cuánto llevan gastado. Tendré que poner una nueva consulta en la que seleccionando un proyecto salga un listado de toda la gente que se ha dedicado a él.

En fin, tiene pinta de que va a ir creciendo. Lo que generaba un excel con unas veintitantas personas dedicadas a unos siete u otro proyectos, van a ser ahora cerca de sesenta personas dedicadas a una veintena de proyectos. Lo que era una consulta simple, se va a convertir en un par de consultas con cláusula where pedida desde la web.

Y hablando de pequeños éxitos por tareas hechas de motu propio. Hace ya un par de años se me ocurrió que una wiki podía ser buena idea y la instalé. Dentro del departamento se va usando, como siempre, unos pocos más que otros muchos. Pero el caso es que se ha ido corriendo la voz por la empresa. El otro día tuve que mostrarle la wiki a uno de los jefazos (cosa que ha sido bastante comentada entre mis compañeros con su parte de coña ;-) ). Parece que quieren poner una a nivel de la empresa.

Todo esto me recuerda mucho al artículo que leí de Joel Spolsky "Logrando resultados cuande se es un peón". Cuando ves una necesidad que tus jefes no resuelven, una buena opción es perder un poco de tiempo en resolverla tú y si se hace bien, se acaba aceptando por todos. También me da un poco de pena comprobar que muchos de los problemas se resuelven o algunas cosas salen adelante porque algún "currito" tiene la iniciativa de resolver el problema o tirar del carro, sin que nadie se lo pida y sin que ningún jefe, teóricamente responsable del tema, tome cartas en el asunto y organice o apoye la iniciativa desde el principio (y, por supuesto, ponga los medios).

Apr 29

Equivalentes entre celebridades y lenguajes de programación

Pues eso, equivalentes entre celebridades y lenguajes de programación.

Apr 25

sitemap para SMF

Hace tiempo comenté en un post que el foro SMF es un desastre para que lo indexe google y, de hecho, no aparecía en google ninguno de los temas de mi foro de java. Intenté instalar el plugin seo4smf para tratar de arreglarlo, pero no conseguí que me funcionara. Al final, como comenté en aquel post, me hice un pequeño programa java que generara un fichero sitemap.xml para colgarlo en el foro.

Esa opción no era buena del todo. Conseguí que google indexara los temas del foro, pero tenía que actualizar el sitemap periódicamente a mano. Así que decidí hacerme un pequeño script sitemap.php que hiciera de sitemap para google de forma automática.

Este script, al llamarlo, consulta en la base de datos el campo id_topic de la tabla smf_topics. Es la única información que necesita para generar el fichero XML de sitemap. El script dice que devuelve un "Content-Type : application/xml" para que cuando google lo consulte piense que es un fichero XML, luego envía los tags XML correspondientes al sitemap.

Adjunto el código php por si a alguien le interesa

<?php
header(’Content-Type: application/xml’);
include (’Settings.php’);

print (’<?xml version="1.0" encoding="UTF-8"?>’);
print (’<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">’);

$link = mysql_connect ($db_server, $db_user, $db_passwd) or die ("<center>No se puede conectar con la base de datos\n</center>\n");
$query=’select id_topic from smf_topics’;
$result=mysql_db_query ($db_name, $query, $link);

while ($row = mysql_fetch_array ($result))
{
   print (’<url>’);
   print (’<loc>’);
   print (’http://foro.chuidiang.com/index.php?topic=’.$row[0]);
   print (’</loc>’);
   print (’</url>’);
}
mysql_free_result($result);
print (’</urlset>’);
?>

El include "Settings.php" únicamente incluye un fichero de configuración del foro, en el que están las variables con el nombre de la base de datos $db_name, el usuario $db_user y la password $db_passwd. Ojo, no le busqueis pegas, que las tiene. Yo no tengo ni idea de PHP.