lunes, 11 de noviembre de 2013

Charla en el Google Dev Fest Sur

Bueno... despues de mucho tiempo me he acordado que tenía un blog. Ya, lo poco que escribo lo hago en twitter.
Pero quería poner esto aquí. Para que no se me olvide. Magnífica experiencia y pedazo de evento.


viernes, 16 de septiembre de 2011

Y... bueno ya es hora de venderme

Ya llevo tiempo pensando en la poca publicidad que doy al trabajo que realizo. Y analizando el trabajo de otras personas mucho más famosas que yo y cuya trayectoria es sobradamente conocida, hoy me encuentro con muy poca autoestima, así es que necesito recordarme algunas cosas, que me hacen pensar en lo banal de esas reputaciones que en muchos casos se deben más al éxito comercial de los proyectos en los que se han implicado que al mérito técnico, al buen análisis y diseño, o a la elección de la tecnología más adecuada.

Desde que comencé con la programacion en el sector privado allá por el año 2002 o desde que cree una red social para mi proyecto fin de carrera en PHP allá por el año 2003, y tras el éxito comercial de este tipo de portales al cual no supe dar salida en su momento, la enumeración de trabajos que he realizado en "background" sin importarme que se supiera que mi mano está ahí ha sido innumerable.

Soy inquieto y quiero aprender más siempre. Por eso estoy seguro de que siempre tendré actitud y potencial para cumplir con cualquiera de los objetivos que se me plantean. Y lo he demostrado.

He desarrollado mis habilidades haciendo uso de varios conocidos frameworks, como struts e hibernate en Java y con el desarrollo frameworks propios que siempre me han resultado más útiles, escalables y sencillos, quedando demostrado en los desarrollos que hoy en día andan... por ahí...
y que por otro lado me abren las puertas para que tras un largo periodo, tenga acceso a dirigir proyectos y por ejemplo, analizar y codificar un gestor de trámites administrativos que incluye el diseño de cualquier procedimiento con la administración y su adecuación a la legalidad sobre la e-administración. Un proyecto sin precedentes que la Junta de Andalucía seleccionó para incluir en su repositorio de aplicaciones disponibles para su uso como software libre para cualquier administración en esta tierra.

El trabajo que he realizado pasa por el análisis y desarrollo para empresas en distintos sectores que también incluyen sectores como la aeronáutica, la formación y el e-learning, pero también he dirigido procesos de certificación de calidad y realizado labores de consultoría.

Entre muchos otros trabajos se me ocurre también destacar el proyecto "Dentro Video" para Joomla, con la investigación y desarrollo de su sistema de almacenamiento y taggeo, el análisis y desarrollo de un sistema de grabación televisiva y de analizar, diseñar y codificar la primera escuela de poker en Internet que reproduce, almacena y auto-corrige las manos subidas de cientos de miles de jugadores en internet, con un proceso de minería de datos que en su conjunto, conforma una de las herramientas de formación y análisis del poker mas novedosas en el mundo.

Y todo bajo la potencia y escalabilidad del framework que desarrollé hace ya algunos años con el que además me he lanzado al universo del "reality mining" con City Analytics, un sistema que en tiempo real ofrece información sobre el movimiento de las personas en las ciudades, integrándome con todo tipo de clientes en PHP, Ruby o Python y además estando a cargo de los sistemas que soportan tal cantidad de datos.

Y tras tanto desarrollo y después de haber visto como "programadores" (según ellos) de toda índole mienten descaradamente a costa de otros incautos como yo, me encuentro que no es suficiente porque nunca dije "Esto es mío", por que nunca dije "Esto lo hice yo".

Pero ya va llegando el momento. Y sobre todo después de estudiar en la universidad, donde ahora me encuentro que no sirvió de nada, puesto que el gobierno reconocerá un título a todos aquellos que se aprovecharon de mi trabajo, y que puedan acreditar que llevan 10 años en este trabajo. Así, por el intrusismo laboral y por listos, ahora, perfectos inútiles podrán conseguir un título. Debí ponerme a trabajar sin estudiar, puesto que ahora, tendría más dinero y el título que tanto trabajo me costó conseguir. Desde luego esta es la mejor forma de fomentar la ignorancia y la "cutrez", en lugar de potenciar la calidad, que es lo único que le queda al mundo occidental.

viernes, 29 de julio de 2011

En un periquete

Tanto tiempo sin escribir que ni recuerdo por donde iba... y es que han sido casi cuatro meses de infarto.

Por un lado el trabajo. En Ciudad 2020 no paramos, siempre tenemos nuevos retos y nuevos proyectos. He estado integrándome con todo tipo de clientes y aplicaciones que beben de nuestra API, y además en Mayo terminé con el desarrollo del mapa de movilidad de Córdoba. Un proyecto muy interesante en el que he aprendido más de la API de Google Maps V3 de lo que jamás pensé que me haría falta.... jejeje. Encontré especialmente interesante el sistema de InfoWindows y el sistema que dibuja el HeatMap, que se complementa con java.awt.Graphics2D en el servidor.

Y lo hemos presentado al mundo en el "Living Labs Global" en Estocolmo, donde estuve en un Workshop group con Lewis Carl de Oracle debatiendo sobre "Cloud Computing".



Por otro lado City Analytics sigue creciendo y madurando, de forma que hemos incluido muchas mejoras en el rendimiento, tras algún que otro traspiés, hasta que hemos liberado la versión 1.9 del cliente. Esto unido a nuevos servicios como el Checkin Físico y otras novedades que incorporaremos en breve me ha tenido bastante ocupado.

Y por otro lado, hay algo que se ha hecho un hueco en mi vida, y que está creciendo de forma que casi asusta. Pero ya no hay quien lo pare. No hay palabras para esto y solo aquellos que lo han sentido lo pueden entender. Me viene al pelo esa frase de la canción de Los Suaves que dice que "hay cosas que solo se dicen con silencio y yo callándome te las digo". Mi hija vino al mundo el día 9 de abril.

lunes, 28 de marzo de 2011

Optimización de MySql InnoDB en un servidor Linux

Tras un arduo proceso de investigación y documentación, voy a describir el proceso a seguir para configurar un servidor MySql para producción. Las bases consultadas no son otras que la documentación oficial en dev.mysql.com y mysqlperformanceblog.com.

En la configuración de un servidor debes pensar en una instalación que tenga un rendimiento acorde con lo que se necesita, empezando por la instalación del sistema operativo. Como es de imaginar principalmente MySql realiza tareas pesadas sobre los discos duros, por lo tanto la elección de discos duros con bajos tiempos de búsqueda es importante pero también es importante si tienes varios discos, optar por usar RAID 0 para unirlos, lo cual afecta bastante al rendimiento de las búsquedas.

Después será necesario revisar la implementación y el diseño de tu base de datos. Respecto al diseño no contaré nada puesto que depende de la aplicación/es que hagan uso del Data Source con MySql, pero respecto a la implementación si que hay un par de cuestiones a tener en cuenta:
  • Manten el tamaño de los campos de tu BBDD lo más pequeño posible. Si puedes usar mediumint en lugar de bigint hazlo, y a colación e igual de importante es que:
  • No utilices campos `varchar`. Y si lo necesitas, al final de la tabla. Dependiendo de tus necesidades por supuesto, pero ten en cuenta que en su lugar puedes usar el tipo `char`. Un tamaño variable para las cadenas ahorra espacio en disco pero un tamaño fijo permite un acceso más rápido a los datos puesto que no hay que calcular la longitud del registro variable como ocurre cuando tenemos un `varchar` y saltamos al siguiente registro. InnoDB realiza algunas optimizaciones por ejemplo convirtiendo `varchar` de tamaño menor de 4 en `char`, pero es deseable que calcules la longitud máxima de un campo y crees campos de tamaño `fixed`. Dentro de poco cuando regalen TeraBytes con las cajas de galletas, esta pérdida de espacio con registros `fixed` no será tan importante como el rendimiento de las consultas a tu servidor... ;)
  • Crea solo los índices que necesitas y elimina índices duplicados. Los índices benefician el proceso de lectura pero pueden complicar el de escritura, así que debes tener cuidado con esto. También ocurre que borras y creas una tabla un varias veces cambiando el script, modificando... y al final, revisando te das cuenta de que tienes un índice duplicado. Si el tamaño de tu tabla no es muy grande, el gasto en memoria puede no ser demasiado, pero he llegado a reducir en cerca de 3 Gb el tamaño de una tabla tan solo descubriendo y eliminando un par de índices duplicados.

Una vez que hayas revisado esto lo deseable es afinar el rendimiento de la ejecución de MySql. Los parámetros más importantes son (para InnoDB):

  • innodb_data_home_dir ( =/var/lib/mysql): Es el lugar donde InnoDB almacenará la información (anteponiéndolo a innodb_data_file_path en caso de existir) así como los ficheros de registro. Asegúrate que apunta a tus discos en RAID 0.
  • innodb_data_file_path | innodb_file_per_table: Con estos parámetros configuras como se almacenan tus datos y donde. Si especificas innodb_file_per_table, indicas a MySql que guarde los datos de cada tabla en un fichero distinto. Esto es beneficioso si tienes en mente ampliaciones y/o migraciones.
  • innodb_buffer_pool_size: El tamaño que ocupa en memoria el almacenamiento intermedio de datos. Cuanto mayor es este valor, menor es la cantidad de operaciones de lectura/escritura en disco. El valor adecuado para un servidor dedicado solo a MySql debería permitir la ejecución del sistema operativo sin problemas. Ten en cuenta que a este tamaño se suma el del parámetro key_buffer_size en el motor MyISAM. Desde la documentación oficial de MySql especifican un 80% de la memoria del ordenador, pero con 64Gb de RAM tendríamos 12 Gb para el SO... es mucho ¿no?
  • innodb_log_file_size: Es el tamaño de los ficheros de registro de InnoDB. Pueden existir varios y la suma de sus tamaños no puede exceder los 4Gb. Un tamaño mayor reduce las operaciones de lectura/escritura en disco, así que este parámetro también es importante. Una regla para fijar este valor se basa en darle el 25% del tamaño especificado en innodb_buffer_pool_size. Ten en cuenta que cada vez que quieras cambiar el tamaño de los ficheros de registro debes fijarte en que probablemente ya existan así es que tendrás que:
    1. Parar el servidor,
    2. Hacer copia de seguridad de los ficheros de log. Normalmente ib_logifle0 e ib_logfile1 en /var/lib/mysql renombrados a ib_logfile0.BAK e ib_logfile1.BAK. En caso de pánico y horror puedes restaurarlos.
    3. Borrar los originales (ib_logfile0 e ib_logfile1),
    4. Especificar el nuevo tamaño, e
    5. Iniciar MySql
  • innodb_log_buffer_size: Es el tamaño del almacenamiento intermedio en los ficheros de registros, por lo tanto valores altos también reducen el número de operaciones de lectura/escritura. Aún así el tamaño de esta variable (evidentemente siempre menor que innodb_log_file_size) se establece como razonable entre 8 y 16 Mb ya que este buffer se vuelca forzosamente cada segundo, así que puede no ser necesario un tamaño mayor y si que sería un gasto de memoria.
  • innodb_flush_log_at_trx_commit: Este parámetro controla cuando se vuelcan los datos del buffer en los ficheros de registros. Este volcado se realiza cada segundo forzosamente pero puede hacerse más a menudo. El valor por defecto de 1, indica que este volcado se realiza tras un commit. Un valor de 2 sería cada 2 commit, o cada segúndo, lo que ocurra antes. De esta forma un valor de 2 reduce las operaciones de E/S en disco pero podríamos perder un segundo de transacciones en caso de error del sistema. Yo pongo 2... ;)
  • innodb_flush_method: Indica la forma de volcado de los ficheros de registros y datos. Si está disponible, con la opción O_DIRECT evitamos el uso de memoria swap y así MySql vuelca estos ficheros directamente en memoria física evitando consumir ancho de banda entre la memoria y la CPU por las copias de la cache del kernel y del espacio de memoria del usuario.

Pues con esto espero haber arrojado algo más de información sobre los parámetros más importantes, aunque evidentemente me dejo mucho en el tintero, pero para mí estas son las cuestiones más importantes. Suerte!!