Hace tiempo que no hablo de OCaml, pero no he parado de usarlo en mi tiempo libre. Primero he aprendido a llamar a métodos en C lo que me ha permito crear un programa para leer archivos netcdf que he llamado onetcdf, pero aun esta muy verde y tendría que trabajar más en él. También he realizado mi primera aplicación CLI en OCaml. Os hablo un poco de ella.
omars
En mi trabajo para ECMWF usamos un repositorio de datos llamado mars, que proporciona un lenguaje sencillo donde especificar los parametros de los datos de una simulación de tiempo atmosférico que quieres bajar, bien como archivos grib o como netcdf en tu maquina local. Este lenguaje te permite especificar fechas, variables, regiones y muchos más aspectos.
Por tanto parte de mi trabajo es comparar y analizar estos datos, pero no conozco ninguna herramienta que te permita tener un acceso rápido y organizado a todos los archivos que estas usando localmente del repositorio mars. Aquí es donde entra omars.
Inicialmente solo quería tener un listado de que archivos habia bajado y donde estaban, pero pronto fui descubriendo que podía ampliar mucho más el uso y posibilidades de omars.
Como funciona
En principio trabajar con mars es crear archivios de texto describiendo tu request (digamos que es myrequest.mars) y usar el comando: mars myrequest.mars
, así que la idea inicial es usar algo tipo omars myrequest.mars
y que se registre en una base de datos local los detalles (he elegido almacenar esto en un archivo json). En realidad quiero tener otras opciones asi que he usado la librería cmdliner de OCaml para crea una especie de swissknife para mars.
omars init
inicializa una base de datosomars get --mars=myresquest.mars
hace una solicitud de archivos al repositorio y los almacena en los directorios definidos en init. Esta opción también permite asignar metadatos a cada registro en la base de datos (projecto, collaboradores, etc...)omars view
visualiza la base de datos: simulaciónes, archivos, fechas, variables, resolución etc...
Sin embargo como deia, poco a poco he buscado ampliar la herramienta para muchas más cosas que necesito
omars show
presenta la información separa por espacios y texto plano, util para integrar con otros comandos unix y realizar operaciones.omars info
presenta informacion general de una base de datosomars map
crea un mapa de una varible de una simulación concretaomars rm
permite borrar elementos de la base de datos (y sus archivos asociados)omars edit
permite editar los registros que tenemos.
Además voy extendiendo la funcionalidad de cada comando, por ejemplo, map
admite muchas opciones para diferentes casos que me interesa analizar. Lo mismo sucede con los comandos info
, view
etc...
Antes y después de omars
Antes de aprender OCaml hice algo similar en Python, sin embargo al final siempre lo integraba en otros scripts o librerias y nunca consideré los beneficos de una aplicación completa, independiente y compilada. OCaml me ha ayudado a intentarlo y ha mejorado mi forma de trabajar. Si necesito información concreta de un experimento aprendo como obtenerla de archivos de texto y la integro como una funcionalidad de omars. Por ejemplo, al solicitar información de un archivo he visto util que además omars busque información de que branch del codigo se uso para crear esa simulación, cuando se hizo o incluso poder buscar información sobre los parámetros usados en la simulación. Por tanto, ahora puedo hacer muchas cosas en pocas lineas: bajar un archivo, hacer varios mapas de variables y acceder a las opciones cuando cree la simulación para entender los resultados.
Dificultades
No tantas como esperaba, al principio el desarrollo era lento como aprender a usar yojson o decidir como programaba algunos aspectos sin tener conocimientos profundos de OCaml. También al principio depurar errores y aprender a usar las diferentes librerias: Unix, Sys, Filename, List, String etc... pero he desarrollado cierta fluidez.
Quiza un reto es resolver mejor el uso de acciones en paralelo, por ejemplo, si llamo en dos terminales diferentes a omars get
que cambia la base de datos creo que va a producir errores, tal vez cuando se haga una operación get debe crease un archivo omarslock que anula otros omars get
que puedan producir una base de datos corrupta. Aunque sería ideal poder hacer estas operaciones en paralelo...