====== Malete - Primeros pasos ======
ATENCION: estas son unas notas informales tomadas en 2005, mientras aprendía a usar Malete. Aún falta transcribir una parte de ellas. Esto no está organizado como un HOWTO paso a paso para el recién llegado; es más bien una especie de bitácora donde registré los pasos que fui dando. Para generar un documento más útil habrá que reorganizarlo. ---Fernando
Vamos a intentar describir paso a paso un primer encuentro con Malete.
===== Setup =====
Malete puede descargarse desde [[http://malete.org/Doc/DownLoad|http://malete.org/Doc/DownLoad]], y la versión más reciente (en marzo de 2008) es la 1.0.3. Obtenemos el archivo ''malete.1.0.3.tgz'', y lo descomprimimos:
tar xzf malete.1.0.3.tgz
**SUGERENCIA**: al descomprimir debería crearse un directorio 'malete-version'.
Vemos que se crean cuatro directorios:
* ''doc'': aquí se encuentra la documentación; se trata de archivos de texto con una sintaxis al estilo wiki, a partir de los cuales se genera la versión HTML que está en el [[http://malete.org/|sitio web de Malete]].
* ''mlt'': contiene el código fuente de Malete (archivos ''*.c'' y ''*.h''), y el archivo ''Makefile''.
* ''php'': aquí encontramos un par de demos y una biblioteca PHP que implementa funciones de lectura, escritura, consulta (query) e indización.
* ''test'': contiene dos bases de datos: ''cds'' (la tradicional base distribuida por Unesco), y ''unicode'' (una pequeña base para probar el uso de Unicode en Malete).
Cada base de datos dentro del directorio ''test'' está compuesta por tres archivos:
* ''.m0d'': malete options (record 0) file (collation y qué más?)
* ''.mqt'': **m**alete **q**uery **t**erms
* ''.mrd'': **m**alete **r**ecord **d**ata
Es importante notar que se trata de **archivos de texto**.
En el directorio principal está el archivo ''README'', que contiene unas indicaciones para que podamos comenzar a interactuar con Malete:
make -C mlt server
then check out php/demo.php
or telnet localhost 2042
and type (be careful to use a tab after the Q with queries!):
test.Q
test.Q
test.Q water
test.Q plant water?
test.Q plant + dev$
test.Q
Se trata solamente de una sugerencia inicial, como para comenzar a familiarizarnos con el protocolo de comunicación usado por Malete. Seguiremos esas indicaciones, y veremos qué sucede.
===== Compilación =====
Comenzamos entonces con el comando
make -C mlt server
Esto invoca al programa ''make'', y le pasa dos argumentos: la opción ''-C mlt'' le indica que debe leer el Makefile del directorio ''mlt'', y el target ''server'' ...? **TODO**: ver los otros targets en el Makefile.
Para que esto funcione, el sistema debe contar con las herramientas necesarias para llevar a cabo la compilación. Por ejemplo, en una instalación fresca de Ubuntu Dapper tuve que instalar dos paquetes:
sudo apt-get install gcc
sudo apt-get install build-essential
Una vez concluida la compilación, el mensaje final es
listening on '*:2042'
El servidor Malete utiliza por defecto el puerto 2042.
Como resultado de la ejecución de ''make'', se han creado varios archivos. Hay un nuevo directorio ''bin'', del cual nos interesa especialmente el archivo ejecutable ''malete'' (273 KB).
Dentro del directorio ''test'' fueron creados estos 5 archivos:
* ''test.m0d''
* ''test.mrd''
* ''test.mrx''
* ''test.mqd''
* ''test.mqx''
Esta nueva base de datos, llamada ''test'', es una copia de la base ''cds'' que vino con Malete. Más precisamente, los archivos ''test.m0d'' y ''test.mrd'' son copia respectivamente de ''cds.m0d'' y ''cds.mrd'', mientras que
* ''test.mrx'' se genera a partir de ''test.mrd''
* ''test.mqd'' se genera a partir de ''cds.mqt''
* ''test.mqx'' se genera a partir de ''test.mqd'' y ''test.m0d''
===== La base de pruebas =====
Comparar con la base CDS de MicroIsis o WinIsis.
Podemos examinar la base ''cds'' con una herramienta conocida, el utilitario ''mx''. Para ello, podemos crear una base Isis a partir de la base Malete. Previamente necesitamos recompilar ''malete'' para que trabaje con bases Isis en "formato Unix", en lugar del "formato DOS" que usa por defecto:
$ export CDSUNIX=1
$ make -B -C mlt server # -B fuerza una recompilación
Ahora exportamos la base ''cds'', de Malete a Isis:
$ bin/malete cdsexp cds -ftest/
$ mx test/cds +control
*test/cds
nxtmfn nxtmfb nxtmfp t reccnt mfcxx1 mfcxx2 mfcxx3 RC
152 122 320 0 150 0 0 0 0
..
''mx'' nos indica que hay 151 registros en la base, aunque el 151 no puede ser leído:
$ mx test/cds "pft=mfn,x2,v24(8,8)"/ from=148 now
000148 Personal statement
000149 For a training project based on programmed learning in the developing
countries: objectives, means and resources, organization and
management, development
000150 Micropolitan development: theory and practice of greater-rural
economic development
fatal: recread/read
También hay problemas para leer el diccionario usando ''mx'':
$ mx test/cds water
fatal: noderead/ock
$ mx dict=test/cds
fatal: noderead/ock
Examinemos la versión DOS de la misma base (desde wine).
$ export CDSUNIX= # volvemos al default
$ make -B -C mlt server
$ bin/malete cdsexp cds -ftest/
$ wine /media/win1/cisis/5.2/1030/mx test/cds +control
*test/cds
nxtmfn nxtmfb nxtmfp t reccnt mfcxx1 mfcxx2 mfcxx3 RC
152 122 12 0 150 0 0 0 0
..
$ wine /media/win1/cisis/5.2/1030/mx test/cds "pft=mfn,x2,v24(8,8)/" now from=148
000148 Personal statement
000149 For a training project based on programmed learning in the developing
countries: objectives, means and resources, organization and
management, development
000150 Micropolitan development: theory and practice of greater-rural
economic development
000151 Manuel pratique des assurances sociales
Notamos que en este caso ''mx'' nos muestra un registro 151, pero se trata de una copia (fantasma) del registro 101:
$ wine /media/win1/cisis/5.2/1030/mx test/cds from=101
mfn= 101
24 «Manuel pratique des assurances sociales»
26 «^aParis^bDOCIS^c1968»
30 «^a1 v. (loose-leaf)»
50 «Kept up-to-date»
69 «»
71 «Documentation des institutions»
..x
$ wine /media/win1/cisis/5.2/1030/mx test/cds from=151
mfn= 151
24 «Manuel pratique des assurances sociales»
26 «^aParis^bDOCIS^c1968»
30 «^a1 v. (loose-leaf)»
50 «Kept up-to-date»
69 «»
71 «Documentation des institutions»
..x
El error en el diccionario es el mismo.
===== La primera sesión =====
Tenemos pues nuestro servidor Malete escuchando en el puerto 2042. Vamos a ver qué sucede al establecer una conexión vía telnet. Para esto abrimos otra consola, y en ella:
$ telnet localhost 2042
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
El servidor Malete está listo para escuchar nuestros mensajes.
==== Consulta vacía ====
Empecemos con **test.Q**, seguido por un doble Enter:
test.Q
La **Q** indica que estamos haciendo una **consulta** (//query//), y la ausencia de parámetros hace que se trate de un caso especial de consulta, la //consulta vacía//. Con esta consulta recuperamos todos los registros de la base (véase [[http://malete.org/Doc/Protocol|Protocol]]).
Malete nos responde de esta manera:
# 151 0 0
-9 1@0
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Techniques for the measurement of transpiration of individual plants
26 aParis bUnesco c-1965
30 ap. 211-224 billus.
70 Magalhaes, A.C.
70 Franco, C.M.
-8 2@336
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Controlled climate in the plant chamber and its influence upon assimilation and transpiration
26 c1965
30 ap. 225-232 billus.
70 Bosian, G.
[Esos son los primeros 2 registros; siguen 18 más.]
La línea inicial de la respuesta,
# 151 0 0
es un **comentario** (lo sabemos pues comienza con '#'), que nos proporciona información acerca de la consulta realizada:
* '151' es la **cantidad estimada de registros** restantes para la presente consulta, incluyendo los recién leídos.
* '0' es el **número de la consulta**, que puede ser usado para referirse a ella desde futuras consultas; veremos que en sucesivas consultas este número va aumentando.
* **record id de truncamiento**: si no es '0', es el record id donde la búsqueda fue truncada debido al límite de tamaño para el conjunto de resultados.
A continuación aparece el primer registro de la base ''test'':
-9 1@0
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Techniques for the measurement of transpiration of individual plants
26 aParis bUnesco c-1965
30 ap. 211-224 billus.
70 Magalhaes, A.C.
70 Franco, C.M.
Luego el segundo registro:
-8 2@336
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Controlled climate in the plant chamber and its influence upon assimilation and transpiration
26 c1965
30 ap. 225-232 billus.
70 Bosian, G.
y así sucesivamente, hasta llegar al número 20.
Vemos que cada registro se inicia con una línea que comienza con un número negativo de la forma **-n**, donde **n** es la cantidad de campos del registro. Debe notarse que esa línea inicial es también un campo.
Cuando repetimos el mensaje ''test.Q'' (seguido, como en todos los casos, por doble Enter), obtenemos los siguientes 20 registros de la base ''test'', comenzando por el 21:
test.Q
# 131 0 0
-8 21@6320
24 Determination of the evaporation from the plant cover and the surface of the soil by relating lysimeter and soil moisture measurements to potential evaporation
26 c1965
30 ap. 461-465 billus.
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
70 Klausing, O.
-9 22@6741
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Water yields of forest, Maquis and grass covers in semi-arid regions: a literature review
26 c1965
30 ap. 467-477 billus.
70 Shachori, A.Y.
70 Michaeli, A.
[Siguen los registros hasta el 40.]
Vemos que la línea inicial de la respuesta, el comentario:
# 131 0 0
ahora nos indica que restan 131 registros (los primeros 20 ya los habíamos recibido), y el identificador de la consulta sigue siendo '0', pues seguimos solicitando resultados de la consulta anterior.
==== Consultas no vacías ====
Hagamos ahora una consulta no vacía, con el término **water**:
test.Q water
# 14 1 0
0 4
0 5
0 10
0 11
0 12
0 13
0 14
0 16
0 22
0 24
0 25
0 43
0 52
0 57
Lo que hemos hecho es una búsqueda por el término "water", y lo que vemos es una
lista de los 14 record-id encontrados (record-id es equivalente al MFN de cds/isis). A diferencia del ejemplo previo, donde directamente recibíamos los registros completos, aquí solamente tenemos acceso a la lista de MFNs. Pero también podemos recuperar los registros:
test.Q water?
# 14 2 0
-9 4@1043
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Electric hygrometer apparatus for measuring water-vapour loss from plants in the field
26 c1965
30 ap. 247-257 billus.
70 Grieve, B.J.
70 Went, F.W.
[... siguen 13 registros más.]
El signo de interrogación **?** divide la consulta en dos partes: a la izquierda la **expresión de búsqueda**, a la derecha un **filtro**. En este caso el filtro es vacío, pero la sola presencia del signo ? hace que el servidor Malete nos envíe los registros.
If no filter is specified (i.e. no '?'), only record ids are returned.
La siguiente consulta, de acuerdo con la sugerencia del archivo ''README'', es:
test.Q plant + dev$
# 26 3 0
0 2
0 3
0 5
0 6
0 8
0 21
0 25
0 27
0 86
0 87
0 100
0 111
0 114
0 118
0 124
0 127
0 128
0 130
0 131
0 132
De acuerdo con el comentario que encabeza la respuesta, hay 26 registros en el conjunto de resultados de nuestra consulta; como sólo recibimos los identificadores de los primeros 20 registros, enviamos un nuevo mensaje **test.Q**, sin indicar parámetros:
test.Q
# 6 3 0
0 133
0 134
0 141
0 147
0 149
0 150
Tal como habíamos visto más arriba al usar una consulta vacía, el mensaje test.Q no crea una nueva consulta (de ahí que el número de identificación siga siendo '3'), sino que continúa solicitando más resultados para la consulta actual, si los hay.
Si reiteramos el mensaje **test.Q**, ahora que ya hemos agotado los resultados para la última consulta, obtenemos:
test.Q
# 0 3 0
Repetimos la consulta **plant water**, esta vez sin el signo de interrogación final:
test.Q plant water
# 2 4 0
0 5
0 25
(en lugar de obtener los 2 registros, como antes, ahora sólo vemos la lista de
identificadores).
Hemos estado usando un único tipo de mensaje: Q (query message, mensaje de consulta). La forma de este mensaje (para nuestra base ''test'') es:
test.Q[*TAB*query]
donde //query// es una expresión en el lenguaje de consulta de Malete (véase [[http://malete.org/Doc/Query|Query]]).
==== Lectura de registros ====
Además de recuperar registros a través de una consulta, podemos también solicitar al servidor Malete registros específicos en base a su id o MFN. Usamos para esto el mensaje **R** (//read//).
En este ejemplo, solicitamos el registro 4:
test.R*TAB*4
W
-9 4@1043
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Electric hygrometer apparatus for measuring water-vapour loss from plants in the field
26 c1965
30 ap. 247-257 billus.
70 Grieve, B.J.
70 Went, F.W.
Y en este otro ejemplo, solicitamos 2 registros comenzando por el 10:
test.R*TAB*10*TAB*2
W
-12 10@2950
24 Modifications to the relative turgidity technique with notes on its significance as an index of the internal water status of leaves
25 20
25 30
25 40
26 c1965
30 ap. 331-342 billus.
70 Slatyer, R.O.
70 Barrs, H.D.
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69
-9 11@3306
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Measurement of water stress in plants
26 c1965
30 ap. 343-351 billus.
70 Kramer, P.J.
70 Brix, H.
También podemos leer una secuencia arbitraria de registros, donde los MFN no necesitan ser consecutivos. Por ejemplo, aquí leemos los registros 3, 7 y 9:
test.R
0*TAB*3
0*TAB*7
0*TAB*9
W
-8 3@624
24 Control of conditions in the plant chamber: fully automatic regulation of wind velocity, temperature and relative humidity to conform to microclimatic field conditions
26 c1965
30 ap. 233-238 billus.
70 Bosian, G.
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
-9 7@2075
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 Colorimetric determination of CO2 exchange in field and laboratory
26 c1965
30 ap. 291-298 billus.
70 SlavÝk, B.
70 Catsky, J.
-7 9@2687
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on:
24 New type of porometer for measuring stomatal opening and its use in irrigation studies
26 c1965
30 ap. 325-329 billus.
===== Más recursos =====
http://solsoft.co.cr/foros/list.php?2
http://sourceforge.net/project/showfiles.php?group_id=11257
{{tag>malete}}