lunes, 6 de febrero de 2017

Otro ejercicio del artículo "LR Parsing"

El siguiente ejercicio proviene del mismo lugar que uno publicado unos días atrás. Los datos del ejercicio que se mantienen igual, no se vuelven a exponer. En particular, la Parsing Action y Goto table son los mismos que en dicho artículo.
Lo que cambia es el input string, y obviamente el seguimiento del parser, manteniéndose iguales la pa (parsing action), la goto (goto table) y las reglas gramaticales.

Input string: a,ba
Acción
Raíces del árbol de derivación (y estado asociado)*
Input remanente
Inicialización: 0
(0)
a,ba $end
pa(0, ‘a’) => apilar
(0), ‘a’
,ba $end
goto(0, ‘a’) => 3
(0), ‘a’ (3)
,ba $end
pa(3, ‘,’) => reducir (3)
(0), ‘ELEMENT’
,ba $end
goto(0, ‘ELEMENT’) => 2
(0), ‘ELEMENT’ (2)
,ba $end
pa(2, ‘,’) => reducir (2)
(0), ‘LIST’
,ba $end
goto(0, ‘LIST’) => 1
(0), ‘LIST’ (1)
,ba $end
pa(1, ‘,’) => apilar
(0), ‘LIST’ (1), ‘,’
ba $end
goto(1, ‘,’) => 5
(0), ‘LIST’ (1), ‘,’ (5)
ba $end
pa(5, ‘b’) => apilar
(0), ‘LIST’ (1), ‘,’ (5), ‘b’
a $end
goto(5, ‘b’) => 4
(0), ‘LIST’ (1), ‘,’ (5), ‘b’ (4)
a $end
pa(4, ‘a’) => error
(0), ‘LIST’ (1), ‘,’ (5), ‘b’
a $end

 * Solamente el estado inicial (0) no está asociado a ninguna raíz.

viernes, 3 de febrero de 2017

Ejercicios del artículo "LR Parsing",

A continuación, un ejercicio propuesto por el artículo LR Parsing, de A.V. Aho y S. C. Johnson


pa (Parsing Action)

Siguiente símbolo de entrada
Estado
'a'
'b'
','
'$'
0
shift
shift
error
error
1
error
error
shift
accept
2
error
error
Red. 2
Red 2
3
error
error
Red. 3
Red. 3
4
error
error
Red. 4
Red. 4
5
shift
shift
error
error
6
error
error
Red. 1
Red 1
Ejemplo: pa(5, ‘b’)= shift;  pa(4, 'a')= error

Nota de traducción: shift=apilar; Red.=reducir

Reglas gramaticales
(1) LIST --> LIST ',' ELEMENT
(2) LIST --> ELEMENT
(3) ELEMENT --> 'a'
(4) ELEMENT --> 'b'


goto (Goto table)

Label of new root
Estado de más a la derecha
LIST
ELEMENT
‘a’
‘b’
‘,’
0
1
2
3
4

1




5
2





3





4





5

6
3
4

6





Ejemplo: goto(0, LIST)= 1;   goto(1, ',')= 5
Los espacios vacíos nunca deberían ser consultados por el parser.



Input string: a,b,a
Acción
Raíces del árbol de derivación (y estado asociado)*
Input remanente
Inicialización: 0
(0)
a,b,a $end
pa(0, ‘a’) => apilar
(0), ‘a’
,b,a $end
goto(0, ‘a’) => 3
(0), ‘a’ (3)
,b,a $end
pa(3, ‘,’) => reducir (3)
(0), ‘ELEMENT’
,b,a $end
goto(0, ‘ELEMENT’) => 2
(0), ‘ELEMENT’ (2)
,b,a $end
pa(2, ‘,’) => reducir (2)
(0), ‘LIST’
,b,a $end
goto(0, ‘LIST’) => 1
(0), ‘LIST’ (1)
,b,a $end
pa(1, ‘,’) => apilar
(0), ‘LIST’ (1), ‘,’
b,a $end
goto(1, ‘,’) => 5
(0), ‘LIST’ (1), ‘,’ (5)
b,a $end
pa(5, ‘b’) => apilar
(0), ‘LIST’ (1), ‘,’ (5), ‘b’
,a $end
goto(5, ‘b’) => 4
(0), ‘LIST’ (1), ‘,’ (5), ‘b’ (4)
,a $end
pa(4, ‘,’) => reducir (4)
(0), ‘LIST’ (1), ‘,’ (5), ‘ELEMENT’
,a $end
goto(5, ‘ELEMENT’) => 6
(0), ‘LIST’ (1), ‘,’ (5), ‘ELEMENT’ (6)
,a $end
pa(6, ‘,’) => reducir (1)
(0), ‘LIST’
,a $end
goto(0, ‘LIST’) => 1
(0), ‘LIST’ (1)
,a $end
pa(1, ‘,’) => apilar
(0), ‘LIST’ (1), ‘,’
a $end
goto(1, ‘,’) => 5
(0), ‘LIST’ (1), ‘,’ (5)
a $end
pa(5, ‘a’) => apilar
(0), ‘LIST’ (1), ‘,’ (5), ‘a’
$end
goto(5, ‘a’) => 3
(0), ‘LIST’ (1), ‘,’ (5), ‘a’ (3)
$end
pa(3, $end) => reducir (3)
(0), ‘LIST’ (1), ‘,’ (5), ‘ELEMENT’
$end
goto(5, ‘ELEMENT’) => 6
(0), ‘LIST’ (1), ‘,’ (5), ‘ELEMENT’ (6)
$end
pa(6, $end) => reducir (1)
(0), ‘LIST’
$end
goto(0, ‘LIST’) => 1
(0), ‘LIST’ (1)
$end
pa(1, $end) => accept
(0), ‘LIST’ (1)
$end


* Solamente el estado inicial, [0], no está asociado a ninguna raíz.

viernes, 6 de enero de 2017

Dos herramientas útiles para el cliente de correo Lotus

"Mostrar sólo mensajes no leídos" y "Revisar Agenda", 2 botones muy útiles que se pueden agregar al Lotus:


  • Recomendación: agregarlos a la barra de herramientas que esté más a mano, por ejemplo, "Vista de Navegación" está la mayoría del tiempo accesible.
  • Botón "Mostrar sólo mensajes no leídos": este botón funciona como un mutador que al cliquearlo cambia alternadamente entre filtrado de mensajes no leídos y todos los mensajes. Sirve para ver rápidamente los mails que tenemos pendientes.


  1. Ir a preferencias de barra de herramientas (clic derecho en la barra misma)
  2. Seleccionar del árbol de opciones de la izquierda, la opción "Barras de herramientas", desplegarla y seleccionar "Personalizar"
  3. Elegir la barra sobre la cual se va a agregar el botón, que sea "Vista de Navegación", de acuerdo a la recomendación dada.
  4. Como es un botón que no existe de forma predefinida, hay que crearlo manualmente. Ir al botón "Crear", luego cliquear en el submenú "Botón".
  5. Escribir un título y un texto emergente, sugerencia: "Mostrar sólo no leídos", si se desea también se puede cambiar el ícono que viene predeterminadamente (mi favorito es uno que se llama "19x19_todo.gif").
  6. En fórmula, introducir "@Command([ViewShowOnlyUnread])" (sin las comillas).
  7. Para cerrar todas las ventanas de configuración y volver a la vista principal de Lotus, ir haciendo clic sucesivamente en todas los botones de confirmación ("Aceptar", "Guardar", etc.), hasta que no haya otras ventanas más que la principal.


  • Botón "Revisar Agenda": Abre el Calendario de Lotus, con la fecha, hora y posiblemente más información de todas las reuniones que tenemos programadas.
    • El procedimiento es idéntico al anterior, diferenciándose en que la fórmula que hay que ingresar en este caso es "@Command([CheckCalendar])", y obviamente el texto y posiblemente el ícono van a ser diferentes, se sugiere "Ver Calendario" como texto y por ícono "19x19_calendar.gif".

miércoles, 4 de enero de 2017

jueves, 20 de octubre de 2016

Añadir un path de librerías dinámicas a la variable de entorno en TinyCore Linux

El añadido de librerías dinámicas (.so) al library path de Linux (LD_LIBRARY_PATH), debería ser automático con la instalación de cada paquete .tcl, pero tuve un caso particular de un programa que fallaba por referencias no resueltas.

Una solución, programable desde bootsync.sh (en TinyCore Linux), es leer las librerías desde el path que no está encontrando y agregarlas a la variable del sistema LD_LIBRARY_PATH:

# bootsync.sh
if [ "$LD_LIBRARY_PATH" == "" ]
then
export path_sep=""
fi

if [ "$LD_LIBRARY_PATH" != "" ]
then
export path_sep=":"
fi

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH$path_sep/usr/local/lib
echo LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH

martes, 18 de octubre de 2016

Swing vs SWT respecto a la libertad del software

Fui advertido, en el sitio https://gna.org/, de las contraindicaciones a la libertad de software de las aplicaciones que dependieran de Swing, por medio de un mensaje dispuesto en los formularios de alta de nuevos proyectos.


Lo investigué.


Si bien no hay conflicto con crear software libre que depende en otro no libre (http://stackoverflow.com/questions/3111455/releasing-code-containing-java-swing-what-license), la respuesta no me satisfacía. Yo quería que fuera libre íntegramente, incluidas las dependencias. GNU había acusado a Java de ser una trampa a la libertad, sin embargo, esta acusación fue retirada (no sin dejar una advertencia de peligro latente) tras aparecer varias implementaciones libres de la plataforma: https://www.gnu.org/philosophy/java-trap.html.


La historia reconstruida por mí: Sun Microsystems no había liberado el código de Swing desde el principio, GNU trabajó (probablemente ambos en conjunto) para en el proyecto CLASSPATH (http://www.gnu.org/software/classpath/) para tener una implementación libre de las clases Java core (incluido Swing), luego el proyecto GCJ (GNU Compiler for Java, https://gcc.gnu.org/java/) absorbió al proyecto CLASSPATH, pero si bien el compilador evolucionó muy rápido, el mantenimiento de la librería Java es muy bajo comparado al del proyecto OpenJDK (http://openjdk.java.net/).


SWT, el framework de GUI de aplicaciones de escritorio, históricamente no atravesó tantos vaivenes y fue libre desde siempre (https://www.eclipse.org/swt/).