lunes, 30 de abril de 2018

Del chocolate A La Competencia

Un impaz de quietud. Marley viaja por el mundo desde adentro de la caja boba de mi living-comedor. La noche me encuentra disfrutando una sobremesa que prosigue a una cena más que sabrosa. Mientras decido mi voto para elegir qué película veremos con mi esposa en Netflix, me regodeo por adelantado ante la expectativa de un Kit-Kat que será al mismo tiempo el postre y el acompañamiento de la película. Mi mente se relaja en el confort del saber que es la noche de un domingo previa a 2 días no laborables. En la atmósfera, el tema que resuena es el chocolate. De pronto, un recuerdo fugaz y una coincidencia ocurrida en la semana que dejamos atrás. El mismo día, 2 personas distintas me habían convidado con chocolate.

En épocas menos desarrolladas de la industrialización, la acción de extraer la materia prima de la naturaleza seguida de la elaboración del chocolate para su posterior consumo, no tenía tanta historia. Hoy día, nos llega a nosotros esta mercancía chocolatada en diversas formas y colores, muchas de ellas son envueltas por papeles impresos, con nombres y logos de industrias, casas chocolateras e incluso agentes comercializadores. Todos ellos compitiendo por un lugar en nuestro corazón y nuestra pancita. El juego va a empezar, abróchense los cinturones y disfruten de una competencia tan sana como las propiedades benéficas para la salud que posee chocolate.

La competencia resulta antipática en tanto se piensa en términos de vencedores aplastadores de cabezas vencidas. Perdedores avergonzados frente a un odiosamente imbatible oponente. Frustración de no poder mostrar lo mejor de uno mismo, cuando el contexto me marca que ser uno mismo es salirse de las reglas de la competencia y eso significa quedar fuera del sistema, olvidado, sumido en la miseria.

Es que a todo esto, hay una restricción muy clara. Quienes van a evaluar mi desempeño y mi calidad competitiva (clientes, jurado, opinión pública) pertenecen a una población fija y finita. Mientras tanto, el número de competidores puede ser cada vez mayor sin ninguna restricción. Cada vez más peleando por lo mismo. Esta desigualdad configura un camino cuesta arriba cada vez más difícil de recorrer. Una inexorable derrota llegará. O no, si es a cambio de una condena de por vida a un estado de preocupación por ser cada vez mejor.

La competencia está en todos los niveles de federación que el ser humano pueda integrar. Empresas compiten entre sí para ganar clientes una a expensas de que la otra los pierda, robándose ideas y siendo antiéticas. Países hacen ademán de su capacidad de dominación. Dos pretendientes buscando conquistar el corazón de un mismo pretendido, y aún sabiendo a muerte uno de ellos que su contendiente es motivado no por amor genuino como sí lo es él mismo, sino por motivos más viles, o hasta por mero deporte, no le queda otra salida que competir con lo mejor que tenga por el corazón de su pretendido. La competencia, quieras o no, va a llegar un día y va a golpear la puerta de tu inocente casa.

Tan verdad como que no importa cuán roto esté tu corazón, el mundo no se detendrá a esperar a que lo repares, así de verdad es que no importa cuánto te hayas esforzado para ganar el primer lugar, el mundo competitivo no se detendrá para darte tiempo a vos de que te sientes a disfrutar de tu premio, ni dejará de girar hasta reclamarlo de regreso.

¡Por favor basta! Sólo quiero desconectar mi cabeza de tanta opresión competitiva. Calmo mi angustia con un chocolate, y ahí está la imagen de Brad Pitt y Angelina Jolie comiendo con gracia y sensualidad un chocolate más caro y mejor que el mío, y contrastando con mi pobre imagen parecida a un topo rasgando una rama con los dientes. Perdí frente a dos grandes de Hollywood y ellos ni lo saben. Sólo quiero no pensar en nada, y si en esta descolorida realidad yo ya no soy nada, pensar en nada es pensar en mí. Me conformaré al menos con pensar en mí, en una suerte de autorreferencia simbólica. Pero ya no sé si estoy pensando en mí, o en cientos, miles de iguales a mí, haciendo constantemente lo mismo que yo, constantemente corriéndome de mi lugar en el mundo. Me siento menos que nada.

No tengo refugio. Por más diminuta que sea mi inocente casa, la competencia siempre aparece dentro de ella, se filtra y entra como un fantasma atravesador de paredes. No tengo escape. Por muy lejos que corra, siempre estoy en la misma posición relativa a una superficie esférica de un mundo uniformemente cubierto por competencia. Hay que seguir aguantando, hay que agachar la cabeza y vivir en modo inconsciente, con tal de no recibir más daño, porque la obsesión por la competencia, como estado mental, aparece tan pronto como se enciende la consciencia.

Nada cambia… hasta que algo cambia. Si la ley de la competencia, con su enunciado de que la competencia es un rasgo de igualdad, fuera tan omnipresente que todos y cada uno tuviera una existencia igual en términos absolutos al resto, y si yo no soy nada, luego de que yo no existo, nada en el mundo podría existir. Entonces, evidentemente no es tan omnipresente.

La competencia no es un mal, por el contrario, es una puerta de salida de lo que llamamos autorreferencia patológica, porque nos ofrece una manera de pensar en el otro y dejar de pensar todo el tiempo en el agobiante yo. Sucede que hay pensadores que creen que todo lo que uno habla está referido a uno mismo. Por ejemplo: “esa estrella es muy bella” (en realidad estoy diciendo “yo veo una estrella que está en alguna posición relativa a mí o a otro objeto del cual también soy yo el centro de referencia de sus coordenadas, y yo ya he visto otras estrellas y otras cosas, tengo un criterio de lo que es bello con el cual esta estrella concuerda”). La competencia nos brinda un puente para conectarnos con el otro, estudiando sus acciones, reaccionando en respuesta a ellas y que el otro también reaccione. Así como cuando hablo de una estrella me estoy refiriendo a mí mismo, lo mismo pasa entre mí y mi competencia. Pero al ser una verdad reconocida que para subsistir necesito contemplar a mi competidor y extraer así información útil para mi supervivencia, quiere decir que reconozco que por más iguales que seamos yo y él, hay algo suyo que no conozco y eso significa que nunca antes lo he visto y ahora estoy por aprender. Eso distinto, me es ajeno, y así he logrado escapar de la autorreferencia agobiante. Ya no importa si para el otro yo significo mucho o nada, lo que importa es que cada acción y reacción me conduzca a mí hoy al lugar que quiero llegar mañana, acompasadamente con el crecimiento del mundo, un crecimiento impulsado por estas reacciones constantes. De este crecimiento luego se derivarán las riquezas y mercancías que me gustan y me dan placer consumir. Como yo contribuí desde mi lugar a ese crecimiento, dándole al mundo lo mejor de mí, se entiende que la competencia también me conecta con el placer, y puesto que cuando estoy consumiendo, no estoy produciendo, he obtenido un tiempo de descanso, deteniendo así el movimiento de mi mundo interior aunque el global siga girando, encontrando una justificación irrefutable a vivir mi tiempo ocioso, a negarme a trabajar.

Cuando acepto que la competencia tiene derecho a existir, estoy aceptando mi propio derecho a ser derrotado y continuar o incluso sentarme a descansar sin condenarme por ello. No se pierde algo si no es para ganar algo. Si respetás el suelo que pisás, el suelo te va a respetar a vos, proverbio ajeno a mi autoría. Por el solo hecho de haberlo intentado, ya es suficiente para haber provocado un cambio positivo en el mundo. No está mal tener un competidor estrella en quien inspirarse, guiarse, siempre y cuando no nos condenemos si no logramos algo con el grado de excelencia pretendido. Muchas veces miramos más los errores que los aciertos. Por cada cosa mal hecha, somos autores sin saberlo, de mil bien hechas. Aunque no sepamos qué es, tenemos una cualidad que nos hace únicos e irremplazables. Competir consiste en dar lo mejor de uno mismo, y lo mejor de uno mismo es una cualidad implícita. Por eso, competir es simplemente ser nosotros mismos.

Y dejarse derrotar alguna vez, o muchas veces, hace bien. Como yo sé que el mundo competitivo nunca dejará de girar y de moverse, a veces puedo detenerme en mi zona de comfort que es mi podio y mi lugar número uno en el mundo, en donde quiero estar, sé que otros vendrán y me superarán, pero también sé que hay puentes que imposiblemente dejarán de mantenerme en conexión. Cuando quiera podré retomar mi carrera, en un mundo que mejoró a base de competencia y con el cual yo también mejoré porque desde mi reposo jamás perdí conexión con el mismo. El acto de contemplación me permite ver un mundo que nunca descansa y crece generando riquezas, mercancías y bienes consumibles. Ser receptivo significa que estoy preparado para recibir una dosis de su producto aún cuando estoy fuera de competencia. Significa que existe una vía por la cual es legítimo que me conecte con el placer, consuma bienes y servicios, y sin necesidad de trabajar para ello.

Que nuestros competidores nos estudien significa que nos están mirando. Haciendo lugar a la sabiduría indígena, una de sus tribus tenía como forma de saludo decir uno de los dos “te veo”, y el otro responder “porque existo”. Que nos miren reafirma nuestra existencia y nuestra calidad de competidor digno. Nada malo para nuestra autoestima. Por esa sola razón ya está pago el precio de cualquier secreto valioso que nos puedieran robar. Lo maravilloso que tiene esto es que una persona es quien es por sus obra y acción más que por sus palabras, y cuando nos miran de ese modo, estudiando nuestras acciones, nos están juzgando por quienes somos realmente y no por quienes decimos ser. De pronto, la competencia ha sido resignificada como realizadora de nuestro anhelo más profundo de ser reconocidos por quienes somos, en base a nuestra acción y obra. La competencia se resignifica varias veces. Mi competidor ya no es mi enemigo, alguien que si no neutralizo me conducirá a la miseria y a la perdición. Son mis compañeros trabajadores, mis mejores maestros, un espejo en donde mirar quién soy, alguien en quien confiar.

El amor es lo único que crece cuando se comparte. Frase legendaria de Antoine Saint-Exupéry que aquí, junto con la competencia, una y otra se resignifican para dar lugar a que en un entorno colaborativo de trabajo puedo encontrar un ambiente propicio para compartir mis talentos y conocimientos exclusivos. Los mismos se diseminarán entre la comunidad como una semilla germinada. Mientras más ocurra, más capacidad de trabajo se habrá ganado en términos globales, y eso significa que menos carga de trabajo quedará a cuestas mías. Más aún, si mi actitud es receptiva podré retroalimentarme de lo que ese conocimiento compartido haya crecido. Podés relajar tu mente en el confort de que todo está y va a estar bien. Podés regodearte por adelantado del próximo premio que el mundo tiene para vos. Compartir el conocimiento, como forma de dar amor, es ayudar a que el mundo siga su órbita sin necesidad de trabajar para ello.

Modificando nuestra mirada, modificamos la realidad. Las Empresas buscan aprender de sus pares, para brindar un mejor servicio, lo que a su vez devolverá a la comunidad una nueva enseñanza. Los Países quieren difundir lo mucho que vale su gente y todo lo que son capaces de hacer trabajando juntos. Las personas, no importa cual sea nuestro plan en la vida, definición de género, religión, nacionalidad y convicciones políticas, entre otras, transitamos un camino que no admite otro obrar que no sea dar lo mejor de nosotros, siempre.

Al final de cuentas, parece que no era un lugar en nuestras entrañas lo que movilizaba a los trabajadores del chocolate. Era más bien un deseo de autosuperación, de cada día ser más grosos y dar lo mejor de sí, y que, en tanto que generadores de riqueza envuelta en papel de chocolate, participar en el proceso de crecimiento del mundo, esperando a cambio, por fuera de lo que es la ganancia material, el aprendizaje que todos venimos a buscar a este mundo.

Estamos condenados… al éxito, en un mundo que no admite la miseria ni tampoco nos dejará caer. Si caemos lo haremos no contra el mundo sino hacia las profundidades de nuestra inmensidad interior. Por mucho que parezca, esa inmensidad es mayor a mil estrellas. Prueba de ello es la siguiente frase tomada del libro Crónicas del Ángel Gris de Alejandro Dolina: “Cada persona, por el solo hecho de estar viva, vale más que mil estrellas.”

Escribir reflexiones sobre la competencia, también tiene competencia. Varios años atrás leí un texto sobre el tema que me inspiró especialmente porque dio respuesta a mi inquietud. Lo voy a compartir a continuación, parte en reconocimiento a mi inspiración, y parte porque varios de lo conceptos que expone, yo no podría explicarlos tan bien como lo hace. Helo aquí: https://blog.codinghorror.com/whos-your-arch-enemy/

domingo, 30 de abril de 2017

Notas finales sobre el artículo de Aho y Johnson

Esto viene a ser un cierre a una serie de escritos en torno a un artículo titulado L.R. Parsing, autoría de A.V. Aho y S.C. Johnson. Varias de ellas son glosas y otras ejercicios resueltos. Al pie se detallan las referencias.

Notas finales:
Entre right parse y righmost derivation puede establecerse una relación, entendida como que cada una de las reescrituras de una right derivación se emparentan con cada uno de los estadíos de un right parse de modo que los símbolos de dicho estadío son prefijo de la cadena reescrita, y lo que no es prefijo, es una cadena de símbolos terminales igual al input que falta incorporar al right parse en ese estadío. Además, dicho prefijo no es cualquiera, sino que es siempre un viable prefix.

La closure operation tiene un operando y un resultado, ambos definidos bajo el nombre de "ítem". El hecho de que para esta operación se exija que los símbolos del lookahead set previo estén concatenados a la cadena de cuya derivación se extraerá el nuevo lookeahead set tiene un significado importante. Algunas derivaciones podrían realizarse que sean válidas en forma aislada pero que no pudieran formar una right sentential form en el lugar desde donde se están generando. Concatenando a estas derivaciones los símbolos del lookahead set previo queda en evidencia su falta de sentido, y por otro lado, la validez de las derivaciones que sí la tienen.

Artículos anteriores de esta serie:
Ejercicio de La Sección 6.4, "Computing Lookahead Sets"
Ejercicio LR Parsing Sección 6.2, "Constructing the Collection of Accessible Set of Items"
Ejercicio Propuesto En El Artículo LR Parsing En La Sección 6.1, "Sets Of Items"
Notas Sobre El Artículo L.R. Parsing
Parseo Simple
Otro Ejercicio del Artículo L.R. Parsing
Ejercicios del Artículo L.R. Parsing

lunes, 10 de abril de 2017

Ejercicio de la sección 6.4 computing lookahead sets

The reader should verify that the complete collection of sets of items for G₁ is:

I₀: [ACCEPT → ⋅ LIST], {'$'}
[LIST → ⋅ LIST ',' ELEMENT], {',', '$'}
[LIST→ ⋅ ELEMENT], {',', '$'}
[ELEMENT → ⋅ 'a'], {',', '$'}
[ELEMENT →  ⋅ 'b'], {',', '$'}
I₁: [ACCEPT → LIST ⋅ ], {'$'}
[LIST → LIST ⋅ ',' ELEMENT], {',', '$'}
I₂: [LIST → ELEMENT ⋅ ], {',', '$'}
I₃: [ELEMENT → 'a' ⋅ ], {',', '$'}
I₄: [ELEMENT → 'b' ⋅ ], {',', '$'}
I₅: [LIST → LIST ',' ⋅ ELEMENT], {',', '$'}
[ELEMENT → ⋅ 'a'], {',', '$'}
[ELEMENT → ⋅ 'b'], {',', '$'}
I₆: [LIST → LIST ',' ELEMENT ⋅ ], {',', '$'}



Teniendo en cuenta que hay 2 formas de generar los sets de items, se elegirá uno teniendo en cuenta lo siguiente.
Una de las formas tiene más que ver con las definiciones de viable prefix y valid item, y la otra con un símbolo especial (ACCEPT) que expande la gramática con una nueva regla, una operación llamada closure que completa los items de cada set. Ambas tienen en cuenta uno y sólo un símbolo de desplazamiento en el cálculo de cada nuevo estado, El 2do. método es más natural a lo realizado por un parser en ejecución: partir de un estado, desplazar un símbolo y cambiar a un nuevo estado. El 1er. método requiere una cadena auxiliar para usarla de viable prefix al aplicar la definición de valid item. Es auxiliar en el sentido de que sólo forma parte del proceso de construcción pero no del parser construido.
Finalmente, por simplicidad se elegirá el 2do. método para este ejercicio.
Los sets de items I₀, I₁, I₂, I₃ e I₄ ya fueron calculados en la sección 6.2, de la cual el cálculo de los lookehead sets no formaba parte. También fueron calculados, en la sección 6.4, los lookahead sets para I₀ e I₃, más allá de que este último sea referido en dicha sección como I₂, cosa que aquí no tiene importancia.
Dando por hecho los sets de items y lookahead sets mencionados, se procederá a completar la collección, aplicando las definiciones de las secciones 6.2 y 6.4.

El único ítem de I₁ surge de desplazarse a través de LIST sobre el ítem [ACCEPT → ⋅ LIST] {$} y conservando su lookahead set al no haber closure operation aplicable. Como resultado se tiene:
I₁: [ACCEPT → LIST ⋅ ], {'$'}

Para I₂ el razonamiento por ende es el mismo lookahead set que el del ítem del cual procede, que es [LIST→ ⋅ ELEMENT], {',', '$'}. Según esto:
I₂: [LIST → ELEMENT ⋅ ], {',', '$'}

Lo mismo pasa con el único ítem de I₄ (I₃, como se dijo, se da por hecho), cuyo antecesor es [ELEMENT →  ⋅ 'b'], {',', '$'}, y 'b' el símbolo "atravesado" (a través del cual nos desplazamos), siendo pues:
I₄: [ELEMENT → 'b' ⋅ ], {',', '$'}

Se resolverá un nuevo set de items por medio de GOTO(I₁, ','):
Desplazándose a través de un símbolo ',' sobre un ítem de I₁ único donde esto tiene sentido se genera el ítem [LIST → LIST ',' ⋅ ELEMENT], {',', '$'}. Siendo que no hay símbolos entre ELEMENT y el final de la regla, su lookahead set tiene el mismo potencial de formar right sentential form en presencia de esta instancia de ELEMENT como así de todas sus derivaciones por derecha, de modo que el lookahead set no cambia. Conociendo la closure operation sobre ELEMENT, el estado completo queda:
[LIST → LIST ',' ⋅ ELEMENT], {',', '$'}
[ELEMENT → ⋅ 'a'], {',', '$'}
[ELEMENT → ⋅ 'b'], {',', '$'}
Que viene a ser I₅.

GOTO(I₅, ELEMENT) da como resultado exactamente I₆, no habiendo ni closure operation que valga ni posibilidad de que el lookahead set sea modificado, por razonamientos similares a los seguidos hasta aquí.

Por más GOTO(I,X) que se intente, ya no queda forma de expandir la colección de sets de items. Queda pues verificado el enunciado.

lunes, 13 de marzo de 2017

Ejercicio LR Parsing sección 6.2, "Constructing the Collection of Accessible Sets of Items"

Ejercicio propuesto por el enunciado

The reader should verify that these two items 
[ACCEPT → LIST .]
[LIST → LIST . ',' ELEMENT]
are the only items valid for the viable prefix LIST.

La verificación será realizada a partir de los items generados por la gramática
ACCEPT → LIST
LIST → LIST ',' ELEMENT
LIST → ELEMENT
ELEMENT → 'a'
ELEMENT → 'b'
estableciendo γ y α a valores apropiados según cada ítem y comprobando que los 2 del enunciado son los únicos que validan los datos del enunciado contra la definición de valid item. La tabla siguiente comprende la resolución del ejercicio según lo explicado.

Ítem
γ
α
β
A
γ.A
¿γA válido? / ¿Hay alguna forma de hacer γα=LIST para γA?
ACCEPT → ⋅ LIST
LIST
''
LIST
ACCEPT
LIST ACCEPT
no / sí
ACCEPT → LIST ⋅
''
LIST
''
ACCEPT
ACCEPT
sí / sí
LIST → ⋅ LIST ',' ELEMENT
LIST
''
LIST ',' ELEMENT
LIST
LIST LIST
no / sí
LIST → LIST ⋅ ',' ELEMENT
''
LIST
',' ELEMENT
LIST
LIST
sí / sí
LIST → LIST ',' ⋅ ELEMENT
''
LIST ','
ELEMENT
LIST
LIST
sí / no
LIST → LIST ',' ELEMENT ⋅
''
LIST ',' ELEMENT
''
LIST
LIST
sí / no
LIST → ⋅ ELEMENT
LIST
''
ELEMENT
LIST
LIST LIST
no / sí
LIST → ELEMENT ⋅
''
ELEMENT
''
LIST
LIST
sí / no
ELEMENT → ⋅ 'a'
LIST
''
'a'
ELEMENT
LIST ELEMENT
no / sí
ELEMENT → 'a' ⋅
''
'a'
''
ELEMENT
ELEMENT
sí / no
ELEMENT → ⋅ 'b'
LIST
''
'b'
ELEMENT
LIST ELEMENT
no / sí
ELEMENT → 'b' ⋅
''
'b'
''
ELEMENT
ELEMENT
sí / no



miércoles, 1 de marzo de 2017

Ejercicio propuesto en el artículo "LR Parsing" en la sección 6.1, "Sets of Items"

Nada mejor que hacer los ejercicios propuestos por el texto que uno lee para afianzar conocimientos. En este caso, se trata del ejercicio del artículo LR Parsing, A.V. Aho & S. C. Johnson, propuesto en la sección 6.1, "Sets of Items", bajo el enunciado:

The reader can (and should) verify that the state corresponding to the viable prefix LIST ',' is associated with the set of items:
[LIST → LIST ',' . ELEMENT]
[ELEMENT → . 'a']
[ELEMENT→ . 'b']



Por definición, dado un viable prefix γα, compuesto por cualquier cadena derivable a partir de γ seguido de cualquier cadena derivable de α, cualquier ítem de la forma [A → α.β] es válido si γA es un viable prefix.



  1.  γ = '', α = LIST ',', β = 'ELEMENT', A = LIST
    Luego, γA = LIST, es un viable prefix válido.
  2. γ = LIST ',', α = '', β = 'a', A = ELEMENT
    Luego, γA = LIST ',' ELEMENT, es un viable prefix válido.
  3. γ = LIST, α = '', β = 'b', A = ELEMENT
    Luego, γA = LIST ',' ELEMENT, es un viable prefix válido.


Bueno, a lo mejor el ejercicio completo debe constar de las comprobaciones con todos los items de la gramática.

jueves, 16 de febrero de 2017

Notas sobre el artículo L.R. Parsing

El artíuclo al cual se hace referencia aquí, “LR Parsing” de A. V. Aho y J. S. Johnson, ya había sido mencionado en entradas anteriores.

En la notación que usa dicho artículo, se escriben en mayúsculas los símbolos no terminales, en minúsculas los terminales, y entre comillas simples los literales.
La derivación* siguiente sirve de un ejemplo:
SALUDO ‘!’ => hola ‘!’

En donde SALUDO es el símbolo no terminal, hola es el terminal, y ‘!’ el literal.

Las letras griegas (por ejemplo α, β, γ) por su parte, representan cadenas de símbolos de cualesquiera de las 3 categorías (terminales, no terminales y literales) generadas durante el proceso de derivación.
Por ejemplo, de la siguiente derivación:
SALUDO SEÑOR_PÉREZ ‘. ¡Bienvenido!’ => SALUDO NOMBRE pérez ‘. ¡Bienvenido!’
La parte que está a la derecha del => se podría expresar con la ayuda de letras griegas de las siguientes formas:
  • SALUDO α ‘.’ ‘¡Bienvenido!’ 
  • SALUDO β 
  • SALUDO β pérez ‘.’ ‘¡Bienvenido!’ 
  • α β pérez ‘.’ ‘¡Bienvenido!’ 
  • α ‘.’ ‘¡Bienvenido!’ 
  • α 
  • α SALUDO NOMBRE pérez ‘.’ ‘¡Bienvenido!’ 
(En el último ejemplo, a parte de α, la cadena de símbolos es exactamente como la original, lo que significa que α es la cadena vacía, mientras que en el anteúltimo caso, no habiendo más que una α, esta representa a la frase completa.)

Y una sola letra en minúscula, itálica y de forma redondeada (normalmente w) ocupa el lugar de cadenas de símbolos literales, en general la parte de más a la derecha de una frase. Ejemplo:
  • SALUDO NOMBRE pérez ‘. ¡Bienvenido!’ w
  • α NOMBRE pérez ‘. ¡Bienvenido’ w
  • α β ‘. ¡’ w
  • α β ‘. w
  • α β w
(En el primer ejemplo, w es la cadena vacía, de acuerdo a un razonamiento similar al explicado arriba).


Por medio de la simbología introducida, se mostrará una posible definición de algo llamado "viable prefix", sin ocuparnos realmente de definir qué es esto.
Si la parte a la derecha del '=>' tiene la forma α β w, y β representa lo que es diferente con respecto al lado izquierdo, se dice que γ es viable prefix si: γ δ = α β, donde δ puede ser la cadena vacía. 

En otras palabras, el víable prefix siempre empieza bien a la izquierda de la cadena derivada, y se extiende a lo sumo hasta la parte que fue cambiada por la derivación.


*El significado del término derivación queda fuera del alcance de estas notas. Informalmente hablando, se puede reconocer una derivación porque contiene el símbolo '=>'. Una mejor definición se encuentra en “LR Parsing” de A. V. Aho y J. S. Johnson.

miércoles, 15 de febrero de 2017

Desencriptando archivos con clave simétrica de GnuPG con BouncyCastle (OpenPGP)

Si se tiene un archivo ".gpg", es decir, encriptado con GnuPG con la opción --symetric (encriptado simétrico), y se lo quiere desencriptar utilizando BouncyCastle for Java, aquí se presentará un set de herramientas/programas, y el procedimiento para instalarlos y ejecutarlos.

Se requiere Java 8 Development Kit, Maven y conexión a Internet, o en su defecto, a una Intranet donde sea accesible un repositorio Maven local que contenga los artefactos de BouncyCastle y sus dependencias.

El package Bouncy Castle para Java implementa el estándar OpenPGP, al cual la herramienta GnuPG adhiere. Por lo tanto, ambos programas, GnuPG y BouncyCastle, pueden cualquiera de ellas encriptar y desencriptar un archivo que haya sido creado con la otra herramienta.

El package de BouncyCastle Viene con ejemplos de clases stand alone (con el método main()), y son muy simples de invocar desde la línea de comandos, pudiendo ver en el mismo código fuente los parámetros que hay que pasarle según la operación que se quiere realizar. En nuestro caso, la clase de ejemplo a invocar será com.example.PBEFileProcessor, y los parámetros serán (sin comillas) "-d" para desencriptar, el nombre del archivo encriptado con la opción --symetric de gpg, y la contraseña simétrica.

Además, hay otro package que separa estos ejemplos y los empaqueta en un artefacto de Maven. Mientras que el package original (BouncyCastle) está pensado para usarse como librería en un programa que la incluya, este nuevo artefacto Maven sirve para ejecutarse directamente desde línea de comando. Obviamente va a depender de la librería BouncyCastle, ya que mientras que este artefacto es un front end de línea de comando, es la librería quien resuelve la "parte pesada" del trabajo criptográfico.

Maven por su parte, puede pensarse de alguna manera como un asistente para instalar aplicaciones Java.

Los pasos a seguir serían:

Bajar el package openpgp-bc-examples, simplemente buscar la opción para descargarse un .zip. Descomprimirlo.
También descargarse un .zip de BouncyCastle para Java. Descomprimirlo.
En la página de openpgp-bc-examples explica cómo se hizo para extraer los ejemplos en un package separado, en el párrafo titulado "How this repository was created". Siguiendo de esa explicación el criterio de renombrar la declaración del "package" de Java, hay que pasar de BouncyCastle, todos los archivos que están en pg/src/main/java/org/bouncycastle/openpgp/examples a la carpeta com/examples de openpgp-bc-examples.

Ya se puede instalar y ejecutar la aplicación, siguiendo los pasos que se explican en la misma página openpgp-bc-examples, con la particularidad de que si se desconoce cómo direccionar, estando bajo Windows, el archivo "classpath.txt" ahí mostrado, se puede abrir con un notepad y copiar su contenido en la línea de comando de la ejecución.

Si el sistema tiene otras versiones de Java Development Kit además de la 8, y esta no es la predeterminada, bastará con setear, solamente en la sesión de línea de comando abierta, las variables JAVA_HOME y PATH con los valores apropiados. La forma bajo Windows sería: set JAVA_HOME=path a Java 8, y set PATH=path a Java8/bin;%PATH%

La invocación tendrá esta forma:
java -classpath <path openpgp-bc-examples>/target/<jar open-bc-examples> com.example.PBEFileProcessor -d archivo_encriptado.gpg Contraseña

Para no tener que pasar la contraseña por línea de comando, habría que modificar el programa Java para que use un método más seguro para la lectura de contraseñas. El apéndice D de la especificación de Java Cryptographic Architecture tiene un programa de ejemplo de lectura de contraseñas que se podría utilizar para tal fin. Habría que incorporarlo de alguna forma dentro de los programas del package com.example. Dentro de la misma especificación de Java Crtptographic Architecture, hay ejemplos de cómo usarlo, en la sección Example Codes, subsección Using Password-Based Encryption.

Espero que sirva.