sábado, 5 de marzo de 2022

Arch linux actualización a Jenkins 2.337 - java 11

 Hace poco estaba instalando jenkins de manera local en mi ArchLinux, para esto utilice los pasos en la documentación oficial.

Jenkins funcionó bien pero me alerto que estaba usando java 8 y que recomendaban utilizar java 11. Además que recomendaban utilizar una versión más reciente de Jenkins. 

Utilizando java 11

Para instalar java 11 se puede utilizar la documentación oficial de la wiki de Arch. 

Una vez instalado hay que revisar el directorio /usr/lib/jvm/java-11-openjdk/bin/
 donde debería estar instalado java, si se instalo en otra parte, hay que utilizar el directorio de la instalación. 

Ahora que establecimos el directorio de instalación de java podemos actualizar el archivo de configuración para especifijar el java a utilizar, este se encuentra en /etc/conf.d/jenkins y podemos modificarlo con el editor de tu preferencia. 

El archivo debe quedar de la siguiente manera: 





Solo debemos cambiar la primera línea en la que especifica la versión de java que utiliza la instalación. 

Actualizando Jenkins


Dentro del archivo de configuración /etc/conf.d/jenkins encontramos la siguiente línea: 



Ahora podemos descargar la actualización de jenkins desde el sitio oficial, debemos de copiar el .war  en la ruta especificada en el archivo de configuración, que en este caso es /usr/share/java/jenkins/ , importante reemplazar el archivo anterior. 

Una vez realizado esto podemos reiniciar el servicio que en mi caso va con el siguiente comando. 

sudo systemctl restart jenkins  

Y tenemos jenkins actualizado. 


viernes, 25 de febrero de 2022

Totito - Usuario vrs Computadora (java consola - sin clases - static)

A continuación voy a hacer una breve descripción de una solución para un juego de totito el cual permita jugar contra la computadora, la computadora debe realizar el tiro más inteligente posible.

Enlace al repositorio de github

Enlace a la playlist de youtube donde esta el desarrollo de la solución.

Consideraciones

Es para el curso de programación de computadoras 1 del CUNOC/USAC, el objetivo de este ejemplo es mostrar las ventajas de utilizar programación modular, por esta razón no se usaran clases. Por lo tanto la solución estará en consola.

Ejecución

Dado que es solo un archivo desde java 11 lo podemos ejecutar de la siguiente manera:

java Totito.java

Acerca del juego

El juego consiste en que se tiene una matriz de tres por tres en la que dos jugadores en cada turno pueden poner una ficha, usualmente se usa "X" y "O". El objetivo es conseguir tres figuras iguales contiguas, puede ser horizontal, vertical u oblicuo. ##titulo Juego inicial

Juego inicial

En la siguiente gráfica se muestra en verde partidas en las cuales el jugador gana, en rojo se muestran la posición de fichas que no funcionan para ganar.

Formas de ganar

Aproximación a la solución

Para solucionar este problema utilizaremos el pensamiento computacional. Para esta solución tratare de no pintar una matriz sencilla, sino trataremos de que la visualización sea un poco más elaborada a pesar que lo estamos haciendo en consola.

No describire cada parte del pensamiento computacional, me enfocaré más en la parte de la descomposición. La solución completa la dividimos de la siguiente manera:

  1. Manejar la información de la partida
    1. Pintar el tablero
    2. Pintar una casilla
    3. Pintar casillas contiguas
    4. Pintar el tablero completo
  2. Tiro del usuario
    1. Solicitar coordenadas
    2. Verficiar que el tiro sea posible
    3. Agregarlo al juego
  3. Tiro de la computadora
    1. Verificar los espacios disponibles para tirar
    2. Valorar para encontrar el mejor tiro
    3. Realizar el tiro
  4. Lógica del juego
    1. Random para los jugadores
    2. Inicializar variables
    3. Permitir que los jugadores tiren
    4. Verificar que si hay tiros posibles aún
    5. Verificar si hay un ganador

0. Manejar la información de la partida

Para pintar el tablero primero revisamos como guardar nuestra matriz para manejar la información de la partida. Utilizaremos una matriz de enteros. La información del tablero la vamos abstraer de la siguiente manera:

Esta es la representación sencilla

Juego inicial

La abstraemos de la siguiente manera

Juego abstraido

Por lo tanto la información es representada de la siguiente manera:

  • 0: representa una casilla vacía
  • 1: representa una ocupada por "X"
  • 2: representa una ocupada por "O"

1. Pintar el tablero

Ya que definimos la forma de manejar la información de la partida, ahora vamos a ver la forma de pintar el tablero de una manera más agradable que solo utilizar un carácter para representar cada parte del tablero.

Dado que tenemos casillas en blanco, x y O, vamos a tratar de pintarlo de la siguiente manera

pintando casillas

En la imagen se muestra que utilizaremos tres lineas para pintar cada una casilla, además utilizaremos cuatro caracteres por línea para presentar cada espacio. Al momento de juntar cada casilla lo veremos de la siguiente manera:

pintando matriz completa

Vamos a separar cada parte del tablero con "|" y con "-".

Para esto utilizamos los métodos en el código:

  • pintarFila: el cual recibe el tipo de casilla que se debe de pintar y retorna 4 carácteres para pintar una línea en específico de la casilla.
  • pintarTablero: recorre toda la matriz y utiliza pintarFila para poner una parte de la línea a la par de la otra hasta tener el tablero completo.

2. Tiro del usuario

Para manejar el tiro del usuario solo tenemos un método que se encarga de solicitar el lugar donde quiere hacer su siguiente jugada, revisa que realmente el espacio este vacio, de lo contrario solicita que se vuelva a pedir una posición valida.

3. Tiro de la computadora

Esta parte se vuelve un poco más compleja, y necesitamos definir un procedimiento para que la computadora pueda elegir el tiro que le convenga más. Para esto vamos a responder las siguientes preguntas y asignarle una prioridad:

  1. ¿Puedo ganar en este turno?
  2. ¿El jugador puede ganar en el siguiente turno?
  3. ¿Tengo posibilidad de ganar dos turnos adelante
  4. ¿El jugador tiene posibilidad de ganar dos turnos adelante?
  5. Un tiro que no significa nada.

Res pondiendo esto vamos a plantear el tablero como una matriz de posibilidades con la siguiente estructura:

Valor CasillaDescripción
0El tiro no es posible, la casilla esta ocupada.
1Es el peor tiro que puede hacerse, no tiene ningún beneficio.
4Significa que hay dos lugares consecutivos seguidos y una ficha del jugador rival, y si el jugador los ocupa, puede ganar en dos turnos.
5Significa que hay dos lugares vacíos consecutivos, en línea con una ficha de la computadora, quiere decir que la computadora puede ganar en dos turnos.
10Significa que la casilla esta vacía y tiene dos fichas en línea del jugador rival, el jugador rival gana en el siguiente turno.
15Significa que la casilla esta vacía, y en línea hay dos fichas que pertenecen a la computadora. En el siguiente turno gana la computadora.

Para poder llegar a tener algo de la siguiente manera:Matriz de posibilidades

Realizando esto se nos facilita la desición de ejecutar el siguiente tiro. Simplemente buscamos el valor más alto. En el caso de que tengamos varios podemos seleccionar aleatoriamente o agregarle más lógica para definir si podemos aumentar la presición de las prioridades.

En el caso de las comparaciones para definir esta matriz la lógica que se siguio fue la siguiente:

Matriz comparaciones

La imagen anterior tiene las siguientes consideraciones, 1) la única parte de del tablero es la que esta marcada en gris. 2) los cuadros extras que estan en blanco sirvieron para considerar que debiamos revisar los límites del tablero para evitar un error en tiempo de ejecución.

Si tomamos en cuenta que estamos ubicados en la posición [y][x] debemos de revisar lo siguiente:

  • Vertical: debemos revisar las posibilidades hacía arriba y abajo.
  • Horizontal: debemos revisar las posibilidades de derecha a izquierda
  • Diagonal: debemos tomar en cuenta las posibilidades en diagonal.

Lógica del juego

La lógica del juego es bastante sencilla, al inicial la partida hay un random para decidir el jugador que inicia con la partida, tambien hay una parte de estadisticas. Se encarga de revisar si hay un jugador que haya ganado a cada tiro de los jugadores.

A continuación se muestra el funcionamiento del juego

juego 1 juego 2 juego 3 juego 4 juego 5 juego 6

lunes, 14 de septiembre de 2020

Programando un Automata Finito Determinista en Angular

 Hace poco discutiendo con estudiantes del curso de Lenguajes Formales y de Programación sobre la  implementación de un Autómata Finito Determinista (AFD), que tenían que hacer para el proyecto de curso,  algunos no estaban realizando una "máquina de estados" y se estaban complicando en la programación. Así que implemente en Angular un ejemplo sencillo para poder ilustrar una propuesta de solución para programar el autómata. 

En el siguiente enlace hay una descripción general de los autómatas finitos deterministas

Buscamos poder reconocer palabras que sean aceptadas por el lenguaje regular, para esto leeremos carácter por carácter moviéndonos dentro del autómata. 

AFD 

Tomando una expresión regular ( 0 | ( 0* 1)* ) 1 la cual está representada por el siguiente autómata:

  1. Q = { A, B, C, D, E } 

  2. A

  3. Σ = { 0, 1}

  4. F = { C }

  5. Función de transición

 

∂(A, 0 ) = B

 

∂(A, 1 ) = C

∂(B, 0 ) = D

 

∂(B, 1 ) = C

∂(C, 0 ) = D

 

∂(C, 1 ) = C

∂(D, 0 ) = D

 

∂(D, 1 ) = E

∂(E, 0 ) = D

 

∂(E, 1 ) = C

Procedimiento

En términos generales lo que buscamos es programar una máquina de estados para esto:
  • Carácter por carácter se realizará el reconocimiento de la cadena, y de esta manera se harán las transiciones en el autómata. 
  • El autómata es determinista, no hay ambigüedad en la función de transición. 
  • Solo debemos de programar la función de transición. Para esto nos ayudará
    • Llevar el control del estado actual. 
    • Realizar una concatenación de los caracteres que se van leyendo. 
    • Programar una función que pueda cambiar el estado actual de acuerdo a la función de transición. 
    • Manejar errores:
      • Si el carácter no pertenece al alfabeto. 
      • Si no hay una transición válida con un símbolo. 
    • Revisar si el estado donde nos encontramos es un estado de aceptación para determinar si la cadena es válida. 
Si logramos programar el autómata generalizando toda la definición formal no importará lo complejo de este, la programación no variará. 

Ejemplo sencillo en angular 

El código fuente se encuentra en el siguiente enlace:  https://github.com/sierra-oe/FDA-Angular-token

Para ejecutarlo recuerden:
  • npm install
    • Instalará todas las dependencias del proyecto. 
  • ng serve 
    • Ejecutará un servidor local que pueden acceder en http://localhost:4200/ 

Para cambiar el autómata a evaluar solo debe cambiar la definición del mismo y la tabla de transiciones. 




Automátas Finitos Deterministas y no Deterministas

Los autómatas finitos son máquinas de estados que nos pueden ayudar a reconocer palabras que sean válidas en un lenguaje regular. Su funcionamiento básico es realizar transiciones de acuerdo a una función de transición que indica hacia dónde se mueve el autómata. 

A partir del estado inicial mediante símbolos de entrada el autómata realiza transiciones para poder aceptar o no un conjunto de caracteres. El autómata está definido de la siguiente manera   A = (Q, Σ, ∂, S1, F) donde: 

  • Q: conjunto de todos los estados del automáta. 
  • Σ: alfabeto del lenguaje regular, conjunto de todos los símbolos que pertenecen a este. 
  • : función de transición, nos indica las transiciones que realiza el autómata dado el símbolo que se esté analizando. 
  • S1: estado inicial. No necesariamente debe utilizarse "S1", puede utilizarse el nombre que se desee. 
  • F: conjunto de estados de aceptación o estados finales. Si al finalizar las transiciones el autómata termina en uno de estos estados entonces se acepta la cadena. 
El objetivo del autómata finito en general es reconocer si una palabra es válida o no para un lenguaje regular. 

Autómatas finitos deterministas (AFD)

Los autómatas finitos deterministas tienen la característica de que para una entrada solo hay un posible movimiento a otro estado, es decir no hay dos posibilidades de transición con el mismo símbolo para un estado. Por ejemplo:



Automatas finitos no deterministas (AFND)

A los autómatas que tienen ambigüedad o que pueden realizar un transicion a dos estados distintos con el mismo símbolo le llama autómata finito no determinista

Ejemplo: 


Tomando una expresión regular  ( 0 | ( 0* 1)* ) 1 la cual está representada por el siguiente autómata:

  1. Q = { A, B, C, D, E } 

  2. A

  3. Σ = { 0, 1}

  4. F = { C }

  5. Función de transición

 

∂(A, 0 ) = B

 

∂(A, 1 ) = C

∂(B, 0 ) = D

 

∂(B, 1 ) = C

∂(C, 0 ) = D

 

∂(C, 1 ) = C

∂(D, 0 ) = D

 

∂(D, 1 ) = E

∂(E, 0 ) = D

 

∂(E, 1 ) = C


 

Diagrama del autómata finito determinista

Para generar los autómatas a partir de expresiones regulares se puede utilizar el método del árbol y el de Thomson.









jueves, 14 de agosto de 2014

Ubuntu Studio - EFI

Intenté instalar Ubuntu Studio en una portátil que tenia Windows 8 de 64 bits. Por el EFI me daba el siguiente problema al momento de instarlo:

grub-efi-amd64-signed failed to install into /target/

Encontré una solución un blog de Linux Mint y funciono muy bien, lo que hice fue en una terminal del live CD ejecute la siguiente instrucción antes de instalar el sistema operativo:

sudo apt-get update;sudo apt-get install grub-efi grub-efi-amd64 grub-efi-amd64-bin

Después de esto no tuve ningún problema con la instalación.
 

martes, 31 de enero de 2012

Poema XX - Pablo Neruda

PUEDO escribir los versos más tristes esta noche.
Escribir, por ejemplo: " La noche está estrellada,
y tiritan, azules, los astros, a lo lejos".

El viento de la noche gira en el cielo y canta.

Puedo escribir los versos más tristes esta noche.
Yo la quise, y a veces ella también me quiso.

En las noches como ésta la tuve entre mis brazos.
La besé tantas veces bajo el cielo infinito.

Ella me quiso, a veces yo también la quería.
Cómo no haber amado sus grandes ojos fijos.

Puedo escribir los versos más tristes esta noche.
Pensar que no la tengo. Sentir que la he perdido.

Oír la noche inmensa, más inmensa sin ella.
Y el verso cae al alma como pasto el rocío.

Qué importa que mi amor no pudiera guardarla.
La noche está estrellada y ella no está conmigo.

Eso es todo. A lo lejos alguien canta. A lo lejos.
Mi alma no se contenta con haberla perdido.

Como para acercarla mi mirada la busca.
Mi corazón la busca, y ella no está conmigo.

La misma noche que hace blanquear los mismos árboles.
Nosotros, los de entonces, ya no somos los mismos.

Ya no la quiero, es cierto, pero cuánto la quise.
Mi voz buscaba el viento para tocar su oído.

De otro. Será de otro. Como antes de mis besos.
Su voz, su cuerpo claro. Sus ojos infinitos.

Ya no la quiero, es cierto, pero tal vez la quiero.
Es tan corto el amor, y es tan largo el olvido.

Porque en noches como ésta la tuve entre mis brazos,
mi alma no se contenta con haberla perdido.

Aunque éste sea el último dolor que ella me causa,
y éstos sean los últimos versos que yo le escribo.

miércoles, 9 de diciembre de 2009

lunes, 7 de diciembre de 2009

Lectura de Poesia en el 3er festival Gran teatrito

En el festival hubo lectura de poesía acompañada de música, A continuación muestro un vídeo de uno de los poemas que leyeron.

El poema es "Táctica y Estrategia" de Mario Benedetti.


viernes, 4 de diciembre de 2009

Performance del 3er festival teatrito en Quetzaltenango

Hoy fue el segundo dia del tercer festival teatrito que se llevo acabo en Quetzaltenango y algunas actividades se realizaron en Totonicapan.

Mi hermano es colaborador en la organización de este evento, y hoy lo acompañe por un rato, y varios artistas salieron a las calles de Quetzaltenango, cada uno con un disfraz distinto por el festival.

Para mas informacion pueden consultar la siguiente dirección:

http://armadilloteatro.blogspot.com/2009/11/tercer-festival-gran-teatrito.html

Creo que en este caso las fotos valen mas que mil palabras, asi que a continuación muestro algunas fotos que tome durante el dia.










lunes, 16 de noviembre de 2009

Base de datos con Postgres - Linux

Hace unos días tuve que entregar un proyecto de base de datos, con postgres, nunca había usado este dbms y al final me pareció bastante bueno. Aquí les dejo algo de información que me ayudo a hacer mi base de datos, ya que postgres se maneja un poco distinto.

CREANDO LA BASE DE DATOS

Después de haber instalado postgres y haberlo configurado bien, yo lo hice en SlackWare y use slapt-get para instalarlo y no tuve ningún problema con variables de enterono ni tampoco tuve problemas de dependencias. Para crear nuestra base de datos debemos de crear un directorio donde vamos a tener nuestra base de datos:

mkdir basedatos


Después de esto debemos de preparar el directorio para tener la base de datos:

initdb basedatos



Esto nos va a generar unos archivos, y vamos a poder crear nuestra base de datos allí, después ejecutamos:

postgres -D ./basedatos



Esto hace que podamos crear una base de datos dentro de ese directorio, esta consola no debemos de cerrarla, por que si lo hacemos ya  no nos vamos a poder conectar a la base de datos. Ahora lo que hacemos es abrir otra consola y nos dirigimos al directorio donde tenemos basedatos, ya en ese directorio podemos crear la base de datos, y para esto ejecutamos el siguiente comando:

createdb prueba
CONECTANDO A LA BD CON PSQL

Ahora para conectarnos a la base de datos y ejecutar todas las instrucciones sql, lo hacemos de la siguiente manera:

psql prueba



Ahora aquí ya podemos crear nuestras tablas, insertar, podemos crear usuarios, roles, etc, con comandos sql.

COMANDOS DE PSQL

Algunos comandos importantes para psql:

\dt
->Show Tables

\dT
-> list datatypes

\df
-> list functions

\di
-> list indexes

\dv
-> list views

\d table
-> describe table
 \q
 -> sale de psql
CARGAR UN ARCHIVO CON INSTRUCCIONES SQL

Ahora para cargar un archivo sql, lo podemos hacer de la siguiente manera, primero debemos de ubicarnos en el directorio donde tenemos nuestra base de datos, y copiar a ese lugar el archivo sql que queremos cargar y ejecutar lo siguiente:

psql -U usuario -d basededatos -f archivo.sql

o en este caso solo podemos ejecutar


psql -d "basedatos" -f archivo.sql

BACK-UP

Para crear el backup de la base de datos se ejecutan los siguientes comandos:

pg_dump -sv prueba -O > ./backup/prueba.schema.sql

pg_dump -Fc -f ./backup/prueba.data.dump -a --disable-triggers prueba

viernes, 6 de noviembre de 2009

Poeta en Orbita - Werner Ovalle

Salgo a la calle con mi sueño al hombro más hombre que poeta.
Me besa el aire, propiedad de todos, me falta en los zapatos la alta hierba que trae en subsuelo una infinita reptilidad de estrella.

Llega el periódico hasta mis oídos como paloma callejera y mi mano lo compra torpemente para leer el crimen y la niebla.

Si creyera en los ángeles diría que un ángel fiel me lleva.
Que fundé una sonrisa colectiva para bajar el sol a mi cabeza y que cambié una ropa de neurosis por una ropa nueva.

Sin embargo la calle me recibe como una tumba abierta.

Un perfil ciudadano me ha sellado la frente compañera.
Salgo a la calle y entro en la verdad total de la tragedia.

La sonrisa insepulta de un mendigo me pide lumas, ¡ay! como monedas y un personal otoño en el bolsillo me habla de nuevo día de hojas muertas.

Tengo quince años de perenne noche, de equilibrada cédula y he salido a la calle con corbata sobre mi corazón, como cometa, con camisa de tedio, con anillos de boda absurda y de orgullosa escuela, con pantalones llenos de si mismos, con anteojos cordiales que me llevan, con pacifica sien de combatido y cabellos insomnes, y las venas con pulso intenso de animal viviendo sobre su propia muerte casi muerta.

Salgo a la calle con olor a mar y necesaria devoción de tierra; mi garganta pluvial tragando fuego como una leche bélica y mis huesos sonando como antiguas flautas de sombra y siembra; me asfixio de olvidar lo que ayer era:
locura confundida de los días, carne vieja, o acaso luz de Dios en mis cabellos libres como banderas.

Tal vez el sueño sometió mis ojos y el odio hizo posible que viviera mi puño izquierdo con su piel de sombra, con su silvestre fuerza de vengador nocturno, de mínimo planeta, en órbita de sangre concedido hasta la misma sangre que más cerca de la sangre me cerca.

Salgo a la calle, canto, luego existo, luego pienso y la idea de ser parte del mundo me descubre en los hombros navegan encendidas todas las cabezas de los que llevan pies como ciclones y uñas como estrellas!

Me llamo obrero como Juan extranjero sin dejar de ser barro y de ser pueblo.
Soy portador de un corazón sin hélice de bohemia ternura que palpitan en el vértice del hombre.
Llevo una cara que me pertenece, cicatriz de la herencia, bandera de la sangre, azadón de los sueños populares.

Me han dicho que no es bueno que entre al humo tierno de las cantinas trasnochadas donde naufragan las estrellas diarias de los que dinamizan la ciudad.
Mas, nada importa, estoy junto a lo absurdo, junto a los rostros de alas enemigas que no entienden mi canto pero lo aman.
Soy el poeta, hermano de la luz, y eso me basta!

Soy,
hasta la muerte.

Viviré mucho más de los que mueran después de mí.
Traje a la tierra un signo de maíz cotidiano he sido entero para mi país y no he dado dinero, pero he dado la mano.
Y dí también la sien como ramo de sol.
Se alimentaron muchas en mi tienda de canto.
No disparé el revolver pero si la guitarra.
Defendí la marimba como a las hembras mías, le di todo a la pluma, estrangulé la garra y fuí el viento más dulce de las melancolías . . .


Werner Ovalle López (1928-1970).Poeta. Nació en Salcajá, Quetzaltenango. 
El resto de su biografia se encuentra en la siguiente direccion:


http://diariodelgallo.wordpress.com/2008/10/22/werner-ovalle-lopez/




Arch linux actualización a Jenkins 2.337 - java 11

 Hace poco estaba instalando jenkins de manera local en mi ArchLinux, para esto utilice  los pasos en la documentación oficial. Jenkins func...