¡He movido el blog! Redireccionando...

Debería redireccionarse automáticamente. Si no es así, la nueva dirección es http://www.spainfull.com/blog/.

sábado 23 de febrero de 2008

Notas del traditore por Spainfull

Traducir es una tarea complicada y apasionante a la vez. En textos técnicos una de las dificultades principales es la traducción de términos, especialmente si muchos no tienen traducción directa al castellano o si se suelen emplear en su versión original.

Éste es el caso del póquer. Es un juego originario de Estados Unidos cuyo argot está en su mayoría formado por palabras inglesas. No solo ciertos términos tienen una traducción no demasiado exacta al castellano, sino que muchas situaciones o frases hechas asociadas tampoco tienen una traslación directa.

Nos encontramos en un punto similar a los primeros tiempos de la informática. Los traductores nos debatimos entre dejar el término original que será entendido por la mayoría de lectores (casi todo el material disponible se encuentra en inglés) o intentar una adaptación que, debido a la escasa popularidad del juego en épocas precedentes, puede llevar a confusión (o tratarse de un localismo solo comprendido en ciertas áreas geográficas).

Afortunadamente, el póquer está creciendo en aceptación. Este hecho impulsa la necesidad de traducción de los términos ingleses a nuestra lengua o su españolización. El criterio que voy a seguir en mis traducciones se va a guiar por la comprensión del texto en primer lugar.

Intentaré traducir todas las palabras de las que dispongamos equivalente en castellano aunque se suelan emplear en inglés, pero si no queda claro el significado, optaré por usar el término original que no dé pie a posibles ambigüedades. Para facilitar la lectura, es recomendable tener a mano siempre un glosario con los términos más utilizados y su posible traducción.

A continuación, voy a listar las palabras que usaré en el idioma original en ciertas situaciones y su explicación en castellano. Tras ellas, otra lista con las palabras o frases traducidas más empleadas y su original correspondiente; esto es debido a que seguramente muchos lectores estén acostumbrados a verlas en inglés y así se acostumbren a su lectura en castellano. Reseñar que es una lista que irá en continuo crecimiento conforme se vayan añadiendo nuevos términos.


Términos y expresiones no siempre traducidos

Acrónimos

Debido a la costumbre de leer y usar siempre los acrónimos en inglés, éstos irán en su forma original:

NLH (no limit Holdem): Holdem sin límite.

TAG (Tight-Aggressive): selectivo y agresivo.

LAG (Loose-Aggressive): poco selectivo y agresivo.

FR (Full Ring): mesa completa (también conocido como mesa larga).

SH (Short Handed): mesa corta.

SS (Short Stack): cantidad pequeña de fichas en relación al tamaño de las ciegas.

UTG (Under the Gun): primera posición.

CO (Cut-Off): una posición antes de la última.

B (Button): la última posición (conocida como botón).

SB (Small Blind): ciega pequeña.

BB (Big Blind): ciega grande.

BB (Big Bet): el doble de la ciega grande.

OOP (Out of Position): sin posición.

EV (Expected Value): esperanza, valor esperado.

TPTK (Top Pair Top Kicker): tener una pareja hecha con la carta mayor de la mesa (una de tu mano) y la otra de tu mano sin emparejar ser la carta más alta posible (A en todos los casos excepto si la pareja conseguida es de Ases, que entonces será una K).


Palabras y expresiones

En algunos casos no se traducirá nunca el original, en otros, solo se usará cuando sea estrictamente necesario. Además de la explicación, anotaré una posible traducción:

Flop: las tres primeras cartas comunitarias (segunda ronda de apuestas). Conocido como tercera calle (o simplemente tercera).

Turn: la cuarta carta comunitaria (tercera ronda de apuestas). Conocido como cuarta calle (o simplemente cuarta).

River: la quinta y última carta comunitaria (cuarta ronda de apuestas). Conocido como quinta calle (o simplemente quinta).

Call: ver o igualar.

Cold
call: ver más de una subida.

Limp: igualar.

Fold: abandonar, tirarse.

Raise: subir.

All-in: envidar.

Stack: pila de fichas (o simplemente pila).

Buy-in: cantidad máxima con la que se puede entrar en la mesa (normalmente 100BB). También es la cantidad pagada como entrada al torneo.

Limper: jugador que iguala las ciegas en la primera ronda de apuestas.

Kicker: carta de nuestra mano sin emparejar que apoya a la que sí ha emparejado.

Equity: cantidad o porcentaje de victoria que pertenece al jugador dependiendo de la cantidad de dinero que hay en el bote y la probabilidad de ganar la mano frente a los rivales.

Outs: cartas que harán que nuestra mano pase a ser la mejor.

Calling station: jugador malo que ve con cualquier cosa.

Backdoor: puerta trasera. Proyectos que requieren de turn y river para completarse.

Playing zone: zona jugable. Rango de cartas que es probable que hayan beneficiado a un jugador concreto. Normalmente se refiere a cartas comunitarias superiores a T, pero es dependiente de cada jugador.




Términos y expresiones traducidos

Siempre que sea posible se traducirá al castellano. Pondré la traducción empleada o una breve descripción si es necesaria:

Tight-Aggressive: selectivo y agresivo (referido a un jugador o a su estilo de juego).

Loose-Pasive: poco selectivo y agresivo (referido a un jugador o a su estilo de juego).

Hero: héroe. El jugador protagonista de la mano sobre la que se habla.

Villain: villano, el rival en la mano.

Pre-flop: antes del flop.

Post-flop: después del flop.

Monotone: flop del mismo palo.

Rainbow: flop con las tres cartas de distinto palo.

Overpair: tener una pareja de mano superior a las cartas sobre la mesa.

Overcard: tener dos cartas de mano superiores a las cartas sobre la mesa.

Gutshot: un proyecto de escalera interna (4 outs).

Check behind: pasar tras venir la mano sin acción (porque han pasado el resto de jugadores), normalmente tras haber apostado en la calle anterior.

Semi-bluff: semi-farol. Apostar o subir con un proyecto o con una mano media.

Blocking bet: apuesta de bloqueo. Normalmente una apuesta hecha en el river sin posición cuando un proyecto se ha completado, con la intención de abandonar si eres subido. También una apuesta pequeña sin posición en el flop o turn cuando tienes un proyecto, para asegurar que vas a ver la siguiente carta de manera barata.

Pot control: control del tamaño del bote. Intentar mantener el bote pequeño con una mano no demasiado potente.

Minraise: subida mínima. Consiste en subir la cantidad mínima posible.

Reraise: resubir.

Winrate: ratio de ganancias.

Table image: imagen en la mesa.

Odds: probabilidades.

Pot odds: probabilidades en relación al bote.

Implied odds: probabilidades implícitas.

Drawing hands: manos que buscan proyectos.

Board: mesa (referido a las cartas comunitarias sobre la mesa).

Steal-raise: rerobo. Situación de contraataque ante un intento de robo de ciegas.

Free card: carta gratis.

Head-ups: mano a mano. Contra un solo rival.

Slowplay: juego lento (jugar despacio una mano potente).

Cash: dinero (referido normalmente a mesas de dinero, en contraposición a torneos).

Overbet: una apuesta mayor que el tamaño del bote.

Donkbet: apostar de cara al jugador que subió antes del flop (o en una calle anterior a la actual) o una apuesta pequeña en relación al bote.

Continuation Bet: apuesta de continuación.

Delayed Continuation Bet: apuesta de continuación aplazada.

Value Bet: apuesta por valor.

Regular: jugador habitual de la sala o el nivel actual.

Blank: carta intrascendente.

Two-barrel bluff: farol de doble cañón. Barrel hace alusión a los cañones de las armas de fuego. El nombre indica que, en ocasiones, es necesario disparar dos veces antes de que la pieza caiga (nuestro rival abandone) También conocido como "double-barrel bluf" o "firing the second barrel". Si es necesario otro tiro, tenemos el three-barrel bluff.

Leer más...

domingo 29 de julio de 2007

Resultado WSOP 2007

Ya acabó la aventura de nuestro forero Jordi "Alekhine" en Las Vegas. Lamentablemente no nos pudo retirar a todos y a él mismo, pero al menos nos trajo un montón de fotos de mujeres neumáticas (en el sentido más literal de la palabra, no en el que inventara Aldoux Huxley para su mundo feliz en el que todos follaban sin parar; mola ese mundo, ¿eh?).

Lo de menos era el resultado (esto, evidentemente, lo digo con la boca pequeña, jeje), lo más importante fue ver de lo que somos capaces un grupo de de gente, muchos de los cuales apenas se conoce entre sí. Y es que no nos hemos dado cuenta de que juntamos unos 10.000 euros y mucha ilusión. Lo más sorprendente es que a pesar del supuesto egoísmo de esta actividad y que parece que solo nos mueve el dinero, no hubo ningún problema, aportando todo el mundo lo que prometió dentro del plazo previsto. Fue muy gratificante recibir las informaciones de nuestro hombre durante el torneo.

Como se dijo, con él viajaba un trocito de cada uno de los socios. Seguro que fue para él una experiencia inolvidable y que cuando triunfe en el WPT y sea rico, cada vez que se encuentre con un aportador a su aventura le invite a una copa.

Toda la información de este tema, desde su inicio hasta el final, se puede seguir en este subforo creado especialmente para la ocasión en el foro de Álex.

Leer más...

lunes 21 de mayo de 2007

Cómo exponer tus dudas en un foro de póquer. Parte I.

Decálogo para exponer tus dudas en un foro de póquer

Antes de preguntar

I Buscar

Seguramente la duda que tú tienes le ha surgido previamente a otros. Invierte un poco de tiempo en intentar encontrar la consulta con la herramienta buscar del foro y, si no es satisfactorio el resultado, busca en Google con las palabras principales de la consulta. Y prueba con variaciones de esas palabras y otras similares que se te ocurran que puedan devolver pistas para resolver lo que te inquieta.

Si se trata de un programa, busca en la web oficial de mismo y en su ayuda. Casi seguro que allí tienes ya contestado tu problema.

II Sintetizar

Piensa que la dedicación empleada en la pregunta es, por norma general, directamente proporcional a la que los amables "contestatarios" (menuda paradoja) estarán dispuestos a invertir en la respuesta.

Intenta definir tu problema lo máximo posible. Concreta, cuanto más amplia y vaga sea la pregunta, peores serán las respuestas. Este aspecto es mucho más importante de lo que parece.

III Dónde

Si la búsqueda ha sido exhaustiva e infructuosa pero tienes bien acotados los límites de tu problema, es hora de hacer una consulta en alguno de los foros de póquer. Si la quieres hacer en castellano, yo frecuento habitualmente tres de ellos. En todos se tratan todo tipos de temas, pero debido a los usuarios que los merodean (sobre todo los más expertos), destacan en ciertos aspectos:

poquer.com.es: especializado en torneos, las mejores referencias en Omaha. El dueño del garito es un tipo peligroso, te conviene llevarte bien con la "familia".

poquer-red: especializado en Limit, muy adecuado para principiantes en el póquer. El master es un individuo que viene del Magic, sobran más comentarios.

riverazo: especializado en No Limit. Los cabecillas provienen en su mayoría del Starcraft, es decir, un nido de viciados por partida doble. Foro de reciente creación (principios 2007).

Esto no es una referencia exacta ni mucho menos, es solamente una descripción general. Además, muchos de los foreros escriben asiduamente en varios de ellos, así que las consultas muchas veces están repetidas.

Hay algunos más que seguro que son tan buenos o mejores que éstos (o no), pero no puedo dar referencias por desconocimiento (en realidad, si aplicara este precepto muy a menudo debería estar callado prácticamente siempre). En inglés la referencia es, sin duda, 2+2.

Lo primero que debes hacer es seleccionar dónde vas a realizar tu pregunta. Cada foro está dividido en una serie de secciones (General, Principiantes NL/PL, Limit -creo que ya no queda en ningún foro esta sección-, torneos, software, cosas raras, etc.). Las secciones pueden diferir de unos foros a otros, pero si tienes tu problema totalmente delimitado, es fácil ver en cuál de ellos va a ir tu consulta. Si aún así no sabes dónde colocarlo, ponlo en el foro principal y pide a los moderadores que lo muevan si lo estiman oportuno (lo van a hacer de todas maneras...).

Al formular la pregunta

IV Título

Para poner tu cuestión, como norma general lo mejor es iniciar un nuevo tema en el subforo correspondiente. Tendrás que elegir un título lo más corto y descriptivo posible. Cuanto más concretes, más posibilidades de que te ayude aquel que sepa la respuesta; si pones un título demasiado genérico, es probable que la gente ni siquiera se moleste en mirar tu mensaje.

V La forma

Una vez elegido un título adecuado, es imprescindible que cuides tu ortografía y, sobre todo, la gramática. Todos cometemos errores, pero es preciso hacer un esfuerzo para que tu mensaje sea al menos fácil de leer. Los que te vayan a ayudar lo agradecerán. Y evita las mayúsculas, son realmente desagradables. Recuerda también que no es un móvil, no te van a cobrar más por poner las palabras completas.

VI Cosas que ayudan

  • Dar las gracias por adelantado
  • Preguntar con buenas formas, es importante ser educado
  • Hacer referencia a otros mensajes similares pero que no acaban de responder a tu duda para que se vea que has hecho los deberes
  • Estructurar el mensaje en párrafos distintos para distintas partes de la pregunta. Se leerá mucho más claramente y facilitará la labor de citarlas

VII Cosas que no ayudan

  • Poner el mensaje en el foro equivocado
  • Escribir con faltas de ortografía, sin meditar, en mayúsculas, sin comas y demás técnicas que no faciliten la lectura.
  • Pedir que te contesten de manera apremiante y sin educación
  • Solicitar la contestación por privado. Es muy probable que la respuesta le sirva a otros que tengan la misma duda.

Después de preguntar

VIII La paciencia

Si has hecho todo como debes, es casi seguro que aquellos que te puedan responder se hayan leído la pregunta y estén en proceso de contestarte. Pero no tienen por qué hacerlo en un minuto ni siquiera en el mismo día. La gente no cobra, ayuda de forma desinteresada. Te están haciendo un favor, así que no exijas. Ten paciencia, es imprescindible además para esto del póquer.

También es probable que nadie sepa la respuesta. Si pasa un tiempo prudencial (varios días) y nadie ha escrito nada, puedes volver a recordar la pregunta haciendo alguna matización. Pero no te quejes, no conseguirás nada.

IX Seguimiento

Si ya te han respondido, entonces es posible que te pidan más datos. Sigue de nuevo los consejos V y VI para contestar y posibilitar que la ayuda sea más precisa. Si no entiendes algo, pide con educación que te lo aclaren.

X Agradecimiento

De bien nacido es ser agradecido. Aunque no te hayan resuelto la duda, da las gracias. Un mensaje final comentando si te solucionaron las dudas le servirá a todos los que lo lean posteriormente.

Leer más...

Cómo exponer tus dudas en un foro de póquer. Introducción.

Tenía pendiente un articulillo de “ayuda” a los novatos que se están iniciando en esto del póquer y no tienen la costumbre de postear en foros sus dudas. Debido a algunos sucesos recientes, me veo en la obligación de escribirlo urgentemente para evitar trabajo a los pobres moderadores (en realidad me caen mal casi todos estos tipos que utilizan este cargo porque en casa no les hace caso ni Dios y, como no les aceptaron en las pruebas para entrar en la policía, matan el gusanillo haciéndose presidentes de escalera o jodiendo a la peña en la web. Qué se le va a hacer, de todo tiene que haber).

Bueno, a lo que iba, como soy un puta vago y no tengo ideas propias, voy a adaptar un par de artículos que leí por ahí y me parecen muy interesantes (adaptar es la palabra técnica, la que más se aproximaría a lo que en realidad voy a hacer es fusilar, como si fuera un bolchevique suelto en Ucrania a principios del siglo XX). En realidad son para plantear preguntas informáticas en general ("10 pasos para plantear una duda informática") y en foros de hackers ("Cómo hacer preguntas inteligentes") Es curioso cómo estos últimos guardan una sorprendente similitud con los buenos, experimentados y, en apariencia, bordes jugadores de póquer. Tampoco hay que olvidar que son frecuentes las preguntas sobre programas informáticos relacionados con el póquer.

La primera parte va a ser la políticamente correcta (TPA-AG) y la segunda, una meada fuera de tiesto, como acostumbro (LAG-AG). Si se tiene una sensibilidad demasiado alta, por ejemplo, lloraste cuando se murió Chanquete, recomendaría que se detuviera la lectura en la primera parte. Si ni siquiera sabes quién es Chanquete, o eres un Amish que no debería jugar al póquer (ni a los bolos aunque conocieras a un tipo sin mano) o no te debes preocupar por nada, ya que seguramente eres demasiado joven y has sido educado por la tele mientras tus padres trabajaban fuera y fornicaban con desconocidos.

Y todo el mundo sabe que últimamente no ponen más que sexo y violencia en la caja tonta; los críos de hoy en día no se asustan por nada, antes te nombraban al hombre del saco y no dormías en toda la noche; ahora, se lo cuentas, preparan su diverso arsenal, quedan con los colegas y montan una cacería del hombre rollo americano. Además, como no lo encuentran, de vuelta para no irse de vacío, meten una paliza al primer vagabundo que se cruzan, roban chuches en un frutos secos, te insultan al llegar a casa por mentiroso, y te amenazan con denunciarte por abusos psicológicos a un menor si no le subes la paga. Y todo eso con 7 años, para imaginarlos con 12 luchando por el columpio del parque con los Latin Kings… pero tranquilos, que la culpa es de la puta sociedad.

En las siguientes entradas, la forma correcta de preguntar tus dudas.

PD0: Me gustaría disculparme sinceramente con todos aquellos que se pudiran sentir ofendidos con mi comentarios sobre la fornicación con extraños de sus padres. Tan solo advertirles que hoy en día uno no se puede fiar ni de que los conocidos no te peguen algo.

PD1: No acabo esto tranquilo sin ofrecer mis disculpas a todos los moderadores del planeta Tierra por mi desafortunado exabrupto. La culpa no es suya, sino de los padres que los visten como putas.

Leer más...

martes 3 de abril de 2007

WSOP 2007

Estamos enviando a alguien a las series mundiales de póquer desde el foro de Álex Caputo. Más información de esta gra iniciativa aquí. Colabora si quieres jugar tú también a distancia aunque sea un poquito.



El torneo principal empieza el 6 de Julio de 2007. El paquete completo es de $12000, ya casi se ha alcanzado la cifra, así que date prisa en aportar tu granito de arena.

Mucha suerte al elegido.

Actualización 15-04-2007: El ganador ha sido Jordi 'Alekhine' en una dura pugna con el gran Sobraoboy. A por ellos.

Leer más...

viernes 9 de marzo de 2007

Cómo usar PostgreSQL en Poker Tracker

En este artículo voy a explicar la solución para todos aquellos que juguéis una gran cantidad de manos y Poker Tracker + PokerAce Hud ralentice muchísimo vuestro ordenador. Lo mejor que podéis hacer es instalar la base de datos PostgreSQL para usarla con PT. Es realmente sencillo, no hay más que seguir unos pasos detallados a continuación.

Antes de empezar, dos advertencias:

  1. Esta guía es para sistemas operativos del maligno, es decir, Windows. Pero para que funcione PostgreSQL debe ser un sistema operativo NT, es decir, a partir de Windows 2000; no, Windows 98 no vale ni Windows ME tampoco; y sí, Windows XP vale.

  2. Nuestro sistema de archivos no deberá ser ni FAT ni FAT32. Para ver qué sistema está instalado en la unidad en la que se va a instalar PostgreSQL basta con hacer doble clic sobre “Mi PC” y pulsar con el ratón derecho y elegir “Propiedades” sobre la unidad elegida (normalmente lo instalaremos en la unidad “C:”), tal y como se muestra en la imagen:

  3. Se mostrará una ventana en la que si aparece “Sistema de archivos: NTFS” se podrá instalar, pero si es “FAT” o “FAT32”, no funcionará (aunque se puede convertir si sigues los pasos indicados aquí -en guiri y no me responsabilizo de lo que pueda pasar-).

Instalación de PostgreSQL

El primer paso para usar PostgreSQL en Poker Tracker es instalarlo en nuestro ordenador; para ello hay que ir a su página web y pulsar en el enlace de descarga “Download PostgreSQL 8.2.3” que aparece en la página principal (la última versión para la que se escribe este artículo a día 09-03-2007 es la 8.2.3, las siguientes supongo que serán muy similares). Una vez pulsado, nos llevará a la sección "FTP Browser", donde se ven una serie de carpetas; si vamos a instalarla en plataforma Windows, pulsamos en la carpeta que pone "Win32". Aparecerán una serie de archivos, pulsamos sobre el que tiene solo la extensión zip ("postgresql-8.2.3-1.zip" es la última versión disponible) que contendrá el instalador para Windows. Seguidamente nos muestran una pantalla con muchas banderitas; no es para elegir la que más nos guste ni nuestra selección favorita (ni siquiera el lenguaje de la aplicación), sino para seleccionar desde qué servidor queremos descargar el archivo, lógicamente pulsaremos sobre el que más cerca nos pille. Una vez pulsado el país, nos mostrará una ventana de descarga de archivos y elegimos guardar (se iniciará la descarga y se guardará en el directorio que tengamos especificado por defecto para las descargas con el navegador que estemos usando).

Una vez tenemos el archivo zip en nuestro disco duro cuando ha acabado la descarga, lo abrimos haciendo doble clic sobre él. Cuando se abra Winzip, pulsamos sobre “Extract”, mostrará una ventana para seleccionar donde guardar esos archivos. Seleccionamos “All files” y el directorio donde queremos descomprimir el instalador (da igual donde lo hagamos, luego borraremos estos archivos de instalación). Una vez descomprimidos, ejecutamos el archivo “postgresql-8.2.msi” que lanzará la instalación de PostgreSQL.

Aparecerá esta ventana:


Seleccionamos el idioma en el que queramos tener la aplicación y pulsamos “Start >”. Después “Next >” hasta que nos muestre la siguiente pantalla:


Dejamos todo como está por defecto y pulsamos “Next >


Nos muestra la pantalla de configuración de la cuenta que ejecutará el servidor de la base de datos de PostgreSQL. Lo único que debemos hacer es escribir una contraseña cualquiera (pero apúntatela para que no se te olvide o pon una facilita) en “Account password” y escribirla de nuevo para comprobar que la hemos escrito bien en “Verify password”. Una vez acabado esto, pulsamos “Next >”, nos pregunta si queremos crear la cuenta y respondemos que “”, después es probable que nos diga que nuestra contraseña es débil y nos pregunte si queremos que nos la cambie por una aleatoria generada por él, tenemos que decir que “No. Entonces aparecerá esta pantalla:


De nuevo escribimos una contraseña en “Password” y otra vez la misma en “Password (again)”. Puede ser la misma que hemos utilizado anteriormente, en este caso será para el usuario dentro de la base de datos y el que tendremos que poner en el PT, así que no la pierdas. Pulsamos “Next >”, y en la siguiente pantalla “Enable procedural languages” dejamos todo por defecto y otra vez “Next >”. Nos muestra la pantalla “Enable contrib modules” donde se pueden seleccionar módulos adicionales con funcionalidad añadida a la que viene por defecto. Dejamos todo como está (se podrán añadir después de la instalación si se necesitaran) y pulsamos “Next >”. Aparece la pantalla de “Ready to install”, eso quiere decir que ya estamos casi, pulsamos “Next >” y comenzará la instalación. Cuando acabe nos muestra una pantalla en la que nos dice que se ha instalado con éxito y para concluir debemos pulsar “Finish”. Ya tenemos instalado PostgreSQL en nuestro ordenador.

Uso de PostgreSQL en Poker Tracker

Ahora debemos configurar PT para usar esta base de datos; con este objetivo, seleccionamos del menú “Utilities->PostgreSQL Settings...”, apareciendo esta ventana, donde debemos escribir el usuario que viene por defecto en la instalación “postgres” (si no lo cambiamos en la instalación) y la contraseña que pusimos para el usuario, es decir, la segunda vez que nos pidieron en la instalación que escribiéramos una:


Ahora solo falta convertir nuestra base de datos Access a PostgreSQL mediante la función del menú de PT
Utilities->Convert Database...” y elegir la que queramos convertir (puede tardar muuuuuucho tiempo dependiendo del tamaño de la base de datos, paciencia y no cerréis antes de acabar aunque parezca que se ha colgado).

Una vez convertida a PostgreSQL, vamos a establecer ésta como la base de datos por defecto cada vez que arranque PT. Para ello, seleccionamos “File->Maintain Database names...” y marcamos la base de datos convertida en la columna “Dflt”.


Si se desea, también se puede borrar desde esta ventana la base de datos Access antigua, aunque siempre la podemos guardar como backup.

Configuración del PokerAce Hud

Ahora, es preciso cambiar la configuración del PokerAce Hud para seleccionar la base de datos de la que queremos que coja la información. Para ello, en "Options->Preferences->Database->Holdem" o en "Options->Preferences->Database->Omaha" simplemente se marca la base de datos escogida de entre las que aparezcan:


Esto es todo, espero que os sirva.

Leer más...

lunes 29 de enero de 2007

Cómo realizar consultas SQL en la BD de Poker Tracker. Parte III.

En este artículo voy a profundizar en el uso de consultas a la base de datos de Poker Tracker, explicando detalladamente la consulta usada en la primera parte y creando nuevas para obtener más información no disponible en el programa que pueda resultar interesante. El objetivo es que cualquiera pueda crearse su propia consulta a partir de unas sencillas instrucciones.

En el primero de la serie, explicaba simplemente cómo hacer una consulta SQL en Access; y en el segundo, la estructura de la base de datos de PT para saber la forma en la que almacena la información y cómo se divide ésta en las diferentes tablas y campos. En esta tercera y última parte, se comprenderán muchas cosas que en los anteriores podían resultar confusas. Lo intentaré hacer despacito, como le gusta a las mujeres.

Si no has estado despistado, sabrás que el lenguaje con el que se hacen las consultas se llama SQL. No es más que una serie de instrucciones que sabe interpretar el motor de la base de datos y que se emplea para manipular la información contenida en ella. En este breve tutorial voy a centrarme exclusivamente en las órdenes de consulta, es decir, en la recuperación de datos.

Hay una serie de palabras que conforman el lenguaje SQL y que equivalen a instrucciones sobre la base de datos. Para hacer una consulta, se utiliza la palabra SELECT (del inglés, seleccionar). La estructura de una consulta SQL es la siguiente:

SELECT (lo que se quiera seleccionar de la BD)
FROM (la tabla o tablas donde se encuentran los datos que se quieren seleccionar)
WHERE (las condiciones que tienen que cumplir los datos que se quieren seleccionar)


La parte del SELECT es la de selección. A continuación se debe indicar lo que se desea recuperar de la base de datos. Básicamente se ponen los campos de la tabla (cuyo nombre pondremos a continuación en la parte FROM) que se quieren recuperar separados por comas (supongo que te acordarás que las tablas se dividen en campos que contienen la información del tipo con el que se haya creado ese campo); otra opción es poner "*" que significa que queremos recuperar todos los campos.

La parte del FROM es la de origen. Se escribe el nombre de la tabla donde se encuentran esos campos que queremos recuperar. La parte del WHERE es la de condición. Es opcional (no es necesario que aparezca) y funciona mediante expresiones aritméticas o booleanas que condicionan la selección.

Con un ejemplo sencillo se verá todo más claro. Poco a poco iré explicando detalles más complicados.

Voy a obtener todos los campos de la tabla game_level:

SELECT *
FROM game_level



Así de fácil. Esta consulta mostrará todos los campos de la tabla (la explicación del significado de las tablas y los campos que las componen están en el segundo artículo de la serie). Si solo se quiere que muestre los campos de identificador de nivel y su descripción, bastaría con poner:

SELECT game_level_id, game_level_desc
FROM game_level



Como se ve, solo aparecen los campos seleccionados en la parte de selección. Cabe destacar, que si no se usa la parte de condición, la selección se hace sobre todas las filas de la tabla. El número de columnas de la tabla resultado es el número de elementos que tenemos en la selección separados por comas; en este caso, dos. El título de la columna de la tabla resultado es el del nombre del campo.

En la parte de selección se pueden utilizar una serie de funciones que hacen operaciones sobre los campos, se escribe la palabra que representa a la función y entre paréntesis el campo al que se le aplica. Las funciones son:

  • Max(campo): obtiene el valor máximo del campo.
  • Min(campo): obtiene el valor mínimo del campo.
  • Sum(campo): suma los registros del campo elegido.
  • Avg(campo): obtiene la media de las filas del campo elegido.
  • Count(*): muestra el total de filas seleccionadas.

Si por ejemplo se quiere obtener el máximo bote ganado en las manos almacenadas de cash habría que usar la consulta (el bote máximo sin importar quién lo ha ganado). Te recuerdo que el resumen de las manos se guardan en la tabla game:

SELECT MAX(pot)
FROM game



Si te fijas, el nombre de la columna no es descriptivo. Esto se debe a que como no es un campo, sino una operación sobre un campo, no tiene un nombre fijo asignado. Para que aparezca un título en la columna de la tabla resultado, y lo que es más importante, para que se pueda utilizar este cálculo temporal posteriormente dentro de la selección en consultas más elaboradas, es preciso usar un alias que identificará el resultado temporal. Para ello basta con escribir la palabra AS y el nombre que se le quiere asignar (también se puede utilizar con los campos para que aparezca con otro nombre la columna resultado y para volver a usar esos campos):

SELECT MAX(pot) AS bote_máximo
FROM game


Si ahora se quiere obtener el bote máximo ganado por cada jugador, se puede utilizar una nueva instrucción que agrupa las filas que tienen el mismo valor en un campo. Esa instrucción se representa en SQL mediante las palabras GROUP BY. Para hacer esta consulta, habrá que agrupar las filas que tengan el mismo valor en el campo player_id (que es el que identifica al jugador). Para que aparezca también el identificador del jugador, se añade ese campo en la selección:

SELECT player_id, MAX(pot) AS bote_máximo_por_jugador
FROM game
GROUP BY player_id



Como se puede apreciar, aparece un identificador del jugador que es un número. Esto es debido a que es así cómo se guarda en el resto de tablas que no es la de jugadores (players) para diferenciarlos. Si se quieren obtener más datos del jugador, hay que mirar también en la tabla players, pero eso lo dejo para más adelante.

Ahora voy a tratar la parte condicional de las consultas. Hasta aquí, las consultas estaban realizadas sobre todas las filas de la tabla. Si se quiere seleccionar sobre solo una fracción de ellas, es preciso usar la parte del WHERE. A continuación es preciso establecer las condiciones que debe cumplir la búsqueda. Para ello se usan los campos o los alias (entre corchetes) de la parte de la selección y las relaciones entre ellos. Estas relaciones pueden ser de comparación: mayor que, menor que, mayor o igual que, menor o igual que, distinto, igual (>, <, >=, <=, <>, =); lógicas: y, o, no (And, Or, Not) y otros operadores como intervalo (Between And), filas diferentes (Distinct), similares (Like), conjunto (In, Not In), si el campo es vacío (Is Null), etc.

Para entenderlo mejor, voy a hacer la consulta del máximo bote de cash menor de 50:

SELECT MAX(pot) AS bote_máximo
FROM game
WHERE pot '<' 50
Si se quieren ver los datos de un jugador como todos los identificadores de jugador, los alias y las salas que se corresponden con un nombre de usuario (en mi caso suelo usar "spainfull"), bastaría hacer la siguiente selección (estos datos se encuentran en la tabla players, que almacena en cada fila los datos de un jugador en una sala; el identificador de sala es un valor que se corresponde con una sala que se puede ver en la tabla poker_sites):

SELECT player_id AS jugador_id, main_site_id AS sala, alias_id AS alias
FROM players
WHERE screen_name = "spainfull"

Si se quieren ver todos los identificadores de un jugador, la sala a la que corresponde ese identificador, el nombre de usuario en esa sala, conociendo el número empleado como alias_id (en mi caso 1) se pueden obtener con la siguiente consulta:

SELECT player_id AS jugador_id, main_site_id AS sala, screen_name AS nombre
FROM players
WHERE alias_id = 1

Como en la fila del identificador original que se emplea como alias_id, el campo alias_id está vacío, no aparece en los resultados. Para que así suceda, es preciso añadir una condición además de la que se ha puesto en el ejemplo anterior, que el alias sea 1 o que el identificador del jugador sea 1:

SELECT player_id AS jugador_id, main_site_id AS sala, screen_name AS nombre
FROM players
WHERE alias_id = 1 OR player_id = 1

La siguiente consulta será el bote medio conseguido por mí en cualquier nivel de juego almacenado en la tabla:

SELECT SUM(pot)/COUNT(game_id) AS bote_medio
FROM game
WHERE player_id = 1



Se suman todos los botes y se divide por el número de filas en las que he ganado (en el campo player_id de la tabla game se almacena el ganador de la mano). Si además se desea saber el bote medio obtenido en un nivel concreto (los niveles se guardan en la tabla game_level), por ejemplo en $1/$2 que corresponde con identificador 5 (game_level_id establece el nivel de la mano en la tabla game):

SELECT SUM(pot)/COUNT(game_id) AS bote_medio
FROM game
WHERE player_id = 1 AND game_level_id = 5



Si además se quiere ver el total y el número de botes ganados para que quede más informativa y clara la consulta:

SELECT SUM(pot) AS bote_total, COUNT(game_id) AS botes_ganados, [bote_total]/[botes_ganados] AS bote_medio
FROM game
WHERE player_id = 1 AND game_level_id = 5



Como se puede comprobar, sabiendo qué campos elegir y cómo hacer condiciones, con todo lo visto hasta ahora se pueden hacer consultas sencillas.

Para obtener datos que se encuentran en más de una tabla que están unidos por un identificador (como por ejemplo player_id en varias tablas) hay que utilizar lo que se conoce como unión. Por ejemplo, si en la consulta realizada anteriormente del bote máximo de cada jugador se quieren obtener más datos por jugador, hay que mirar en la tabla players. Si por ejemplo se quiere mostrar además el nombre del jugador al que pertenece ese identificador, habrá que obtenerlo de esa tabla. Para conseguirlo, en la parte de selección se señala de qué tabla proviene cada campo anteponiendo al nombre del campo el nombre de la tabla a la que pertenece y un punto. En la parte de origen, se ponen los nombres de las tablas separados por la instrucción INNER JOIN y se especifica qué campos son los que unen las tablas (los que significan lo mismo, son del mismo tipo aunque puedan tener distinto nombre) tras la palabra ON:

SELECT game.player_id, players.screen_name, Max(game.pot) AS bote_máximo_por_jugador
FROM game INNER JOIN players ON game.player_id = players.player_id
GROUP BY game.player_id, players.screen_name

Esta consulta se podría poner de otra manera en la que se ve claro lo que hace el INNER JOIN:

SELECT game.player_id, players.screen_name, Max(game.pot) AS bote_máximo_por_jugador
FROM game, players
WHERE game.player_id = players.player_id
GROUP BY game.player_id, players.screen_name

Por último, voy a diseccionar la consulta que mostré como ejemplo en el primer artículo, que calculaba las veces que mejoraba nuestra pareja a trío en el flop:

SELECT gp.hole_cards AS Par, count(*) AS Veces, SUM(
IIF(left(g.flop_1,1)=left(gp.hole_card_1,1),1,
IIF(left(g.flop_2,1)=left(gp.hole_card_1,1),1,
IIF(left(g.flop_3,1)=left(gp.hole_card_1,1),1,
0)))) AS [Trío en flop]
FROM game_players AS gp INNER JOIN game AS g ON gp.game_id = g.game_id
WHERE gp.player_id = (select pref_value from prefs where pref_key = 'RP')
AND gp.pair_hand = 1
AND gp.saw_flop_n = 1
GROUP BY gp.hole_cards, gp.card_order1
ORDER BY gp.card_order1 DESC


Antes de empezar a hacer una consulta se debe tener claro qué es lo que se quiere conseguir y dónde están esos datos. Lo que se pretende es ver cuándo nuestra pareja de mano ha mejorado a trío. Las cartas comunes de cada mano se guardan en la tabla game, pero las cartas de cada jugador en cada mano se almacenan en la tabla game_players. Por lo tanto, está claro que habrá que usar estas dos tablas. El campo que une estas dos tablas es el game_id, que identifica unívocamente cada mano. Así, tenemos la parte de origen que queda de la siguiente manera:

FROM game_players AS gp INNER JOIN game AS g ON gp.game_id = g.game_id


Se emplea un alias para cada tabla para no tener que volver a escribir el nombre de las tablas antes de cada campo y que quede demasiado largo.

En la parte de selección se detallan las columnas que se quieren visualizar como resultado. En este caso, la pareja de mano que se tiene (en la tabla game_players el campo hole_cards indica la mano que tiene el jugador), el número de veces que se ha dado cada pareja cuando se ha visto el flop, y el número de veces que ha mejorado a trío. Si se hiciera la consulta sin la parte condicional, la selección se haría sobre todas las manos de la tabla game, pero lo que se quiere es que se trate de una mano nuestra, que sea una pareja de mano y que se haya visto el flop. Pero volviendo a la parte de selección, tenemos:

SELECT gp.hole_cards AS Par, count(*) AS Veces, SUM(
IIF(left(g.flop_1,1)=left(gp.hole_card_1,1),1,
IIF(left(g.flop_2,1)=left(gp.hole_card_1,1),1,
IIF(left(g.flop_3,1)=left(gp.hole_card_1,1),1,
0)))) AS [Trío en flop]


Los dos primeros elementos están claros, la mano inicial (que serán parejas por las condiciones que se pondrán después) y el número de veces que nos han repartido esas parejas cuando hemos visto el flop (también significará esto por las condiciones de la parte WHERE que se añadirán). La tercera columna es más sencilla de lo que parece; para que nuestra pareja se convierta en trío, precisa que una de las cartas del flop sea igual a cualquiera de las que tenemos en mano; eso es lo que indica la expresión que está dentro del SUM.

Las cartas que nos han repartido están en la tabla game_players en los campos hole_card_1 y hole_card_2 y las del flop en la tabla game en los campos flop_1, flop_2 y flop_3. Estos campos son alfanuméricos (letras y números) y cada carta se representa por su valor (un número del 2 al 9 o una letra mayúscula si es un A, T, J, Q o K seguido de una letra minúscula que indica el palo); por tanto se debe obtener el valor de la carta sin importar el palo, es decir, el primer carácter de los campos a seleccionar. Para ello se cuenta con la instrucción de SQL left(campo, x) que obtiene x caracteres empezando por la izquierda en un campo alfanumérico. En este caso nos interesa mirar si el valor de una de nuestras cartas de mano (como es una pareja no importa con cuál comparemos) es igual a cualquiera de las tres del flop. Con este objetivo se utiliza left(gp.hole_card_1, 1) para nuestra mano y se compara con left(g.flop_x,1). IIF evalúa una condición y si se cumple se da el primer valor, y si no el segundo: IIF(condición, valor_1, valor_2); en este caso, si coincide la comparación que se hace entre nuestra carta de mano y la primera del flop, el valor es uno y se suma y se sale de la expresión (como vez que conseguimos trío, se suma porque se emplea SUM encerrando a la expresión completa), si no coincide se mira la segunda del flop, si coincide se suma y se sale de la expresión, si no se mira la tercera y si coincide se suma y se sale de la expresión, y por fin, si no es que no se consiguió trío y el valor que se obtiene y se suma es 0. Puede parecer complicado, pero con un poco de paciencia se entiende sin problemas.

Ahora la parte de la condición:

WHERE gp.player_id = (select pref_value from prefs where pref_key = 'RP')
AND gp.pair_hand = 1
AND gp.saw_flop_n = 1
GROUP BY gp.hole_cards, gp.card_order1
ORDER BY gp.card_order1 DESC


La primera condición es que sea nuestro jugador. Se podría poner el número que se ha obtenido en una de las consultas anteriores, pero en este caso se ha anidado otra consulta (se debe escribir entre paréntesis) que coge de la tabla de preferencias prefs nuestro identificador de jugador, almacenado en el campo pref_value y que se asocia al valor "RP" del campo pref_key. La siguiente condición es que sea una pareja de mano, aspecto almacenado en la tabla game_players en el campo pair (1 si es pareja de mano, 0 si no). La siguiente, que yo haya visto el flop, guardado en el campo saw_flop de la misma tabla (1 si se ve el flop, 0 si no). Por último, se agrupan las cartas de mano que sean iguales y también por el valor de la mano. Para mostrarlas ordenadas por el valor de la mano se emplea la instrucción ORDER BY (y para seleccionar que en orden inverso de valor la instrucción DESC -el valor de las cartas en el campo card_orderx va del 2 para el 2 al 14 para el As-).

Con esto se acaba el tutorial de cómo realizar consultas SQL en la BD de PT. Espero que te haya servido de algo. Hay mucha información disponible sobre SQL en la red que cubre aspectos y funcionalidades que no he tratado y que pueden resultar interesantes. De todas maneras, si tienes alguna duda, ¡pregunta coño!

Leer más...

Cómo realizar consultas SQL en la BD de Poker Tracker. Parte II.

Para comprender mejor cómo funciona Poker Tracker y las instrucciones a escribir en la consultas SQL, en el siguiente apartado detallaré la organización de la base de datos de PT.

Estructura de la base de datos de Poker Tracker

Para los menos iniciados en la informática, es preciso recordar que una base de datos no es más que una manera de almacenar información. Cada tipo de base de datos tiene una forma propia de guardar esos datos y acceder a ellos. Se hace así con el objetivo de recuperar lo almacenado con mayor rapidez, mantener una gran cantidad de datos eficientemente y para facilitar la inserción de nuevos elementos; todo esto es posible porque hay implementados una serie de interfaces (protocolos, medios de comunicación entre programas) que permiten realizar estas operaciones de manera mucho más eficaz que si se guardaran los datos, por ejemplo, en un simple archivo de texto.

Hay muchos tipos de bases de datos. Seguro que te suenan palabras como Access, Oracle, SQLServer, MySQL, PostgreSQL... Todas identifican bases de datos muy diferentes entre sí, cuya construcción interna no se parece en absoluto, aunque tienen cosas en común. Básicamente, todas ellas almacenan la información en tablas, cada una de las cuales tiene una serie de campos que definen atributos de lo representado por la tabla. La forma de acceder a estos datos es distinta en cada caso ya que suelen poseer su propio lenguaje, pero las consultas SQL que voy a crear se pueden utilizar en todas ellas con pocas modificaciones (SQL es el lenguaje base usado por la mayoría de bases de datos de la actualidad).

Access no es diferente y también guarda los datos en tablas. Una tabla se identifica por un nombre que debería ser descriptivo de la información que contiene. En cada tabla los datos se agrupan en campos que contienen los detalles de lo que se quiere almacenar. Por ejemplo, si se es un poco maníaco-obsesivo-exitoso y se desea tener una base de datos de ligues, habría una tabla de nombre "Pibitas" (si es muy obsesivo probablemente el nombre sería "Chochos") que contendría seguramente los campos "Nombre", "Teléfono", "Altura", "Edad", "Peso", "Cara" (nota asignada de 1 a 10), "Tetas"
(nota asignada de 1 a 10), "Culo" (nota asignada de 1 a 10), "Sexo" (vamos, que si folla) , "Casada" y "FechaPrimeraCita". Los campos son las columnas de la tabla y, cada nueva conquista, sería una nueva fila en la tabla que tendría unos valores en los campos que la definirían. Advertir que la elección de los campos ha sido totalmente arbitraria; se podrían haber definido otros atributos o características (y no, no tengo una tabla como ésta hecha).

Los campos pueden ser de distinto tipo dependiendo de la información que vayan a guardar. Los tipos básicos disponibles son: numéricos (con decimales o sin decimales), alfanuméricos (letras y números, es decir, texto), moneda, fechas y booleano (datos que son verdadero o falso, por ejemplo "Sexo" y "Casada"). Como se puede comprobar, hasta aquí no es nada complicado. Ahora que conoces las bases, voy a desmenuzar las tablas de PT y el porqué de cada una.

En una base de datos suele haber más de una tabla para lograr definir los objetos que participan en el problema a solucionar; además, los datos que contienen están interrelacionados entre ellas. Las consultas se pueden hacer sobre varias tablas a la vez ya que si no, se limitaría mucho la búsqueda. La creación de bases de datos en sistemas complejos es una tarea ardua y complicada puesto que hay que tener en cuenta muchas variables y factores. Pero tranquilo, eso es otra historia y, como me dijo un profesor de la universidad la primera vez que hablaba con él: "eso a ti te la suda".

Ahora "solo" vas a aprender la estructura de la base de datos de PT, así que presta atención. Si se abre la base de datos de PT tal y como comenté ayer, y se selecciona "Tablas" en los "Objetos", aparece una imagen
como la siguiente con todas las tablas de PT:



La mayor parte de las tablas son bastante auto explicativas, y sus campos logran definir cada aspecto que el programador de PT ha querido reflejar. Hay algunas tablas que son de definición: de niveles, salas, ciegas, etc.; otras que detallan cada mano del juego con todos los datos posibles; otras que son resumen de valores para que la recuperación y visualización en PT sea más rápida (como por ejemplo la tabla de las sesiones jugadas); y, por último, otras que sirven para la configuración del programa.

Para ver los campos de cada tabla, basta con seleccionar la tabla de la que se quiere ver su estructura y pulsar el icono de "Diseño" o hacer clic con el botón derecho del ratón sobre la tabla elegida y pulsar sobre "Vista Diseño":



Si se hace lo dicho, aparece una ventana que lista los campos que contiene la tabla y el tipo de cada uno de los campos. También puede contener observaciones acerca del contenido de cada uno de los campos que se utilizan para hacer aclaraciones sobre el mismo (solo tiene valor informativo). Un apunte, en la creación de la mayor parte de las tablas se define un campo identificador que distingue unívocamente a una fila de la tabla del resto de filas; la mayoría de las tablas de PT tienen un campo de este tipo, que suele ser un entero positivo (se declara en la base de datos para que cada vez que se añade una fila se incremente automáticamente, aunque éste es un detalle que no nos importa demasiado). Estos identificadores son muy útiles para enlazar valores entre tablas (esto se verá más claro en el siguiente capítulo en el que haré las consultas):



Voy a agrupar las tablas de PT según la función para la que han sido creadas. Ésta es una clasificación que he establecido para que se vea más claramente la utilidad de cada una de ellas, pero no significa que sean de distinto tipo sino simplemente que las he ordenado para no mostrar todas seguidas; solo hay un tipo único de tablas aunque se usen para almacenar diferentes tipos de datos. Los datos de cash y torneos se guardan en tablas separadas.

La mejor manera para seguir la explicación de las tablas es abrir en Access la base de datos e ir abriéndolas conforme se detallan (basta con hacer doble click sobre la tabla que se quiera visualizar).

Tablas de definición de datos:
Son todas aquellas que definen entidades que se utilizarán en otras tablas.

Tabla blind_structure.
Define los distintos niveles en un torneo. Contiene los campos siguientes:

  • blind_structure_id: identificador del nivel de ciegas.
  • blind_structure_desc: estructura de ciega pequeña y ciega grande.
  • big_bet: tamaño de la ciega grande en relación a la unidad (una ficha es la unidad más pequeña).

Puede que te preguntes por qué los valores están desordenados. Esto es debido a que en cuanto PT lee un nivel nuevo de ciegas, añade una línea a esta tabla y le asigna un identificador que comienza en 1 y se va incrementando automáticamente como expliqué anteriormente. Seguramente inicié el PT con un torneo comenzado o la importación automática de torneos la hizo de manera desordenada; esto no tiene ninguna importancia ya que se sabe qué nivel es por el identificador; por ejemplo, el identificador 6 corresponde al nivel de ciegas 150/300, y no importa el orden en el que esté insertada la fila en la tabla.

Tabla game_level.
Define las ciegas en las mesas de cash. Contiene los campos siguientes:
  • game_level_id: identificador de la cantidad de las ciegas.
  • game_level_desc: descripción de la ciega pequeña y la ciega grande.
  • game_level_big_bet: tamaño de la ciega grande en relación a la unidad (la unidad más pequeña es una unidad de moneda ($, € o GBP).
  • pl_nl: 0 si es limit, 1 si se trata de NL o PL.



Tabla hand_rank.
Define las posibles manos en el showdown en Holdem. Contiene los campos siguientes:
  • hand_rank_id: identificador de la jugada.
  • hand_rank_desc: descripción en texto de la calidad de la jugada.

Como se puede apreciar, esta tabla sí está ordenada de peor a mejor jugada, esto es debido a que es una tabla con los datos completos antes de capturar ningún dato el programa, o rellenada automáticamente al crear una nueva base de datos (en Holdem el ranking de jugadas es fijo e inmutable).

Tabla players.
Define a los jugadores en cada sala de póquer. Cada fila identifica a un jugador en una sala. Se utilizará en todas las tablas que contengan datos de juego. Contiene los campos siguientes:
  • player_id: identificador del jugador en la base de datos de PT.
  • screen_name: nombre en la sala que se ve en pantalla del jugador.
  • location: lugar de origen que el jugador se ha puesto en la sala.
  • general_description: notas sobre el jugador.
  • treeview_icon: identificador del icono del jugador que aparece en el árbol de jugadores del PT (se refiere a los dibujicos que representan cada tipo de jugador).
  • site_id: utilizado en los jugadores con alias para indicar el identificador de la sala al que correponde el alias asignado.
  • alias_id: identificador del jugador al que corresponde éste alias.
  • main_site_id: sala para la que está definido el jugador.
  • hide_ind: si no se muestra al jugador de cash en las ventanas del PT.
  • ring_player: si es jugador de cash en la sala (significa si se tiene alguna mano de él jugando cash).
  • tourney_player: si es jugador de torneos.
  • tourney_hide_ind: si no se muestra al jugador de torneos en las ventanas del PT.
  • last_icon: último icono del jugador.
  • last_auto_rated: fecha en la que se hizo la última clasificación de jugadores automática.
  • last_batch_rated: fecha en la que se hizo la última clasificación de jugadores.
  • icon_before_batch_rate: icono anterior a la última clasificación de jugadores.
  • no_auto_rate: si a éste jugador no hay que clasificarlo.
  • icon_file: fichero donde se almacena el icono del jugador (para personalizaciones).

Destacar que, como seguramente conoces, para agrupar las estadísticas de un jugador que tiene datos de diferentes salas hay que utilizar los alias de PT. Ahora puedes ver cómo funcionan. Cada jugador tiene una fila por sala en la que juega. Si se usan los alias, a través de los campos "site_id" y "alias_id" el programa sabe que son el mismo jugador y combinará sus estadísticas.

Tabla poker_sites.
Define las salas de póquer para las que funciona PT. Contiene los campos siguientes:
  • site_id: identificador de la sala.
  • site_abbrev: nombre abreviado de la sala de póquer.
  • site_name: nombre completo de la sala de póquer.


Tablas de datos:
Almacenan los datos del juego en sí.

Tabla game.
Define los detalles generales de cada mano de cash. Cada fila identifica una mano jugada e importada en el PT. Contiene los campos siguientes:
  • game_id: identificador de la mano.
  • game_number: otro identificador de la mano (usado para salas como Prima).
  • site_id: sala donde se juega la mano.
  • date_played: fecha en la que se juega la mano.
  • game_level_id: nivel en la que se juega la mano.
  • flop_1: carta primera del flop.
  • flop_2: carta segunda del flop.
  • flop_3: carta tercera del flop.
  • turn: carta del turn.
  • river: carta del river.
  • pot: bote que se lleva el ganador de la mano (antes de descontar la comisión).
  • rake: comisión que se lleva la casa en la mano.
  • player_id: identificador del jugador que gana la mano.
  • import_date: fecha en la que se hizo la importación de la mano.
  • game_notes: notas de la mano.
  • table_name: nombre de la mesa en la que se jugó la mano.
  • winning_hand: calidad de la jugada de la mano ganadora.
  • real_player_id: identificador real del jugador (si se utilizan alias, éste será el identificador del jugador en la sala, no su alias).
  • players_saw_flop: jugadores que han visto el flop.
  • number_of_players: número total de jugadores de la mano.
  • ub_game_number: identificador de mano en UB.
  • ub_kill_game: si es una mesa kill de UB.

Es un resumen de cada mano jugada. Los detalles por jugador están contenidos en la tabla "game_players".

Tabla tourney_game.
Define los detalles generales de cada mano de torneo. Cada fila es una mano de torneo jugada e importada por PT. Contiene los campos siguientes:
  • tourney_id: identificador de la mano.
  • game_number: otro identificador de la mano (usado para salas como Prima).
  • date_played: fecha en la que se juega la mano.
  • blind_structure_id: nivel de ciegas en la que se juega la mano.
  • game_level: nombre del nivel en el de ciegas en el que se juega la mano.
  • pp_game_number: identificador de la mano (creo que para PP).
  • flop_1: carta primera del flop.
  • flop_2: carta segunda del flop.
  • flop_3: carta tercera del flop.
  • turn: carta del turn.
  • river: carta del river.
  • pot: número de fichas que se lleva el ganador de la mano.
  • player_id: identificador del jugador que gana la mano.
  • import_date: fecha en la que se hizo la importación de la mano.
  • game_notes: notas de la mano.
  • table_name: nombre de la mesa en la que se jugó la mano.
  • winning_hand: calidad de la jugada de la mano ganadora.
  • real_player_id: identificador real del jugador (si se utilizan alias, éste será el identificador del jugador en la sala, no su alias).
  • players_saw_flop: jugadores que han visto el flop.
  • number_of_players: número total de jugadores de la mano.
  • heads_up: si se trata de un torneo Heads Up.
  • ub_game_number: identificador de mano en UB.

Como se puede comprobar, esta tabla es similar a la anterior pero usada para torneos.

Tabla game_players.
Define los detalles de cada mano desde el punto de vista de cada jugador que participa en la misma. Contiene los campos siguientes:
  • game_id: identificador de la mano.
  • player_id: identificador del jugador.
  • seat_number: posición en la que está sentado el jugador.
  • button: posición que ocupa la posición de button.
  • hole_card_1: primera carta de las dos del jugador.
  • hole_card_2: segunda carta de las dos del jugador.
  • suited: s si es suited, o si no.
  • pre_flop_bet: cantidad apostada antes del flop.
  • flop_bet: cantidad apostada en el flop.
  • turn_bet: cantidad apostada en el turn.
  • river_bet: cantidad apostada en el river.
  • total_bet: cantidad apostada en el conjunto de la mano.
  • total_won: cantidad total ganada en la mano.
  • when_folded: cuando tiró las cartas en la mano.
  • player_notes: notas del jugador en la mano.
  • final_hand: calidad final de la mano del jugador.
  • hand_rank_id: identificador de la calidad de la jugada de la mano ganadora.
  • all_in: si el jugador ha ido all in en la mano.
  • hole_cards: cartas del jugador en formato texto.
  • card_order1: ranking de la primera carta de mano en relación a su fuerza individual (2->2,..., As->14).
  • card_order2: ranking de la segunda carta de mano en relación a su fuerza individual (2->2,..., As->14).
  • card_order3: 1 si son suited, 0 si no.
  • connector_hand: 1 si están conectadas, 0 si no.
  • pair_hand: 1 si es una pareja de mano, 0 si no.
  • won_hand: 1 si el jugador ganó la mano, 0 si no.
  • session_id: identificador de la sesión en la que se circunscribe la mano.
  • off_the_button: número de posiciones de diferencia con el button.
  • number_of_players: número de jugadores en la mano.
  • big_blind_n: 1 si es big blind, 0 si no.
  • small_blind_n: 1 si es small blind, 0 si no.
  • went_to_showdown_n: 1 si llegó con la mano hasta el final, 0 si no.
  • saw_flop_n: 1 si vió el flop, 0 si no.
  • attempted_steal: 1 si intentó un robo, 0 si no.
  • raised_first_pf: 1 si subió el primero antes del flop, 0 si no.
  • real_player_id: identificador real del jugador (no su alias).
  • chip_count: dinero con el que el jugador comenzó la mano.
  • ub_kill_blind: 1 si es la ciega kill en una mesa kill de UB, 0 si no.

Hay muchos otros campos booleanos (valores cierto o falso, 0 ó 1) que definen cada una de las posibles acciones que el jugador ha podido realizar en cada una de las calles (call, check-raise, bet-raise, etc.) y que servirán para mostrar las estadísticas en las ventanas del PT.

Tabla tourney_game_players.
Define los detalles de cada mano de torneo desde el punto de vista de cada jugador que participa en la misma. Contiene los campos siguientes:
  • tourney_id: identificador del torneo.
  • game_id: identificador de la mano dentro del torneo.
  • player_id: identificador del jugador.
  • seat_number: posición en la que está sentado el jugador.
  • button: posición que ocupa la posición de button.
  • hole_card_1: primera carta de las dos del jugador.
  • hole_card_2: segunda carta de las dos del jugador.
  • suited: s si es suited, o si no.
  • pre_flop_bet: cantidad apostada antes del flop.
  • flop_bet: cantidad apostada en el flop.
  • turn_bet: cantidad apostada en el turn.
  • river_bet: cantidad apostada en el river.
  • total_bet: cantidad apostada en el conjunto de la mano.
  • total_won: cantidad total ganada en la mano.
  • when_folded: cuando tiró las cartas en la mano.
  • player_notes: notas del jugador en la mano.
  • final_hand: calidad final de la mano del jugador.
  • hand_rank_id: identificador de la calidad de la jugada de la mano ganadora.
  • all_in: si el jugador ha ido all in en la mano.
  • hole_cards: cartas del jugador en formato texto.
  • card_order1: ranking de la primera carta de mano en relación a su fuerza individual (2->2, ..., As->14).
  • card_order2: ranking de la segunda carta de mano en relación a su fuerza individual (2->2, ..., As->14).
  • card_order3: 1 si son suited, 0 si no.
  • connector_hand: 1 si están conectadas, 0 si no.
  • pair_hand: 1 si es una pareja de mano, 0 si no.
  • won_hand: 1 si el jugador ganó la mano, 0 si no.
  • session_id: identificador de la sesión en la que se circunscribe la mano.
  • off_the_button: número de posiciones de diferencia con el button.
  • number_of_players: número de jugadores en la mano.
  • big_blind_n: 1 si es big blind, 0 si no.
  • small_blind_n: 1 si es small blind, 0 si no.
  • went_to_showdown_n: 1 si llegó con la mano hasta el final, 0 si no.
  • saw_flop_n: 1 si vió el flop, 0 si no.
  • attempted_steal: 1 si intentó un robo, 0 si no.
  • raised_first_pf: 1 si subió el primero antes del flop, 0 si no.
  • real_player_id: identificador real del jugador (no su alias).
  • chip_count: stack con el que el jugador comenzó la mano.
  • blind_amt: cantidad de fichas pagadas en la mano en concepto de ciegas (0 si el jugador está fuera de las posiciones que pagan ciegas).
  • ante_amt: cantidad de fichas pagadas en concepto de ante.

Hay muchos otros campos booleanos (valores cierto o falso, 0 ó 1) que definen cada una de las posibles acciones que el jugador ha podido realizar en cada una de las calles (call, check-raise, bet-raise, etc.) y que servirán para mostrar las estadísticas en las ventanas del PT. Esta tabla es similar a la anterior pero orientada a torneos (por eso algunas columnas diferentes como la de los antes).

Tabla tourney.
Define los datos generales de los torneos. Cada fila identifica un solo torneo importado en PT. Contiene los campos siguientes:
  • tourney_id: identificador del torneo en la base de datos de PT.
  • site_id: identificador de la sala en la que se juega el torneo.
  • tourney_number: número de identificación del torneo en la sala.
  • tourney_start: fecha y hora de inicio del torneo.
  • tourney_end: fecha y hora de fin del torneo.
  • buy_in: dinero que costó la entrada al torneo.
  • fee: dinero pagado como comisión a la sala de póquer.
  • tourney_type: tipo de torneo (si no concreto más es porque no tengo apenas torneos guardados en la base de datos y no tengo ni puta idea de cuáles son los valores).
  • table_type: tipo de mesa (ídem. a la anterior).
  • summary_text: resumen en formato texto del identificador del torneo.
  • target_tourney_number: si es un satélite, indica el identificador del torneo en la sala al que se opta si se consigue una plaza.
  • number_of_players: número de jugadores del torneo.
  • tourney_notes: notas del torneo.
  • summary_loaded: si se ha importado en el PT el resumen del torneo.


Tablas de resumen de datos:
Guardan los resultados de ganancias y otras estadísticas agrupados.

Tabla session.
Define los datos de una sesión de juego (desde que te sientas a una mesa hasta que te levantas). Contiene los campos siguientes:
  • session_id: identificador de la sesión en la base de datos de PT.
  • player_id: identificador del jugador.
  • session_start: fecha y hora de inicio de la sesión.
  • session_end: fecha y hora de fin de la sesión.
  • table_name: nombre de la mesa.
  • seat_number: posición dentro de la mesa.
  • session_notes: notas escritas de la sesión.
  • game_level_id: identificador del nivel en el que se juega.
  • amount_won: cantidad ganada total (o perdida, excepto para Caminante que solo tiene valores positivos en este campo).
  • total_hands: número total de manos jugadas.
  • site_id: identificador de la sala.
  • vol_saw_flop: este valor en el conjunto de la sesión.
  • pre_flop_raise: este valor en el conjunto de la sesión.
  • att_steal: este valor en el conjunto de la sesión.
  • chance_to_steal: oportunidades de robo en el conjunto de la sesión (ya sabes, triste es pedir...).
  • won_hand: número de manos ganadas en la sesión.
  • went_to_sd: este valor en el conjunto de la sesión.
  • won_at_sd: este valor en el conjunto de la sesión.
  • real_player_id: identificador del jugador (distinto del anterior si usa alias y no es la sala primera en la que PT definió al jugador).
  • tot_players: número total de jugadores en el conjunto de la sesión (suma los totales en cada mano, sin importar que sea el mismo jugador; es decir, si juegas una sesión maratoniana de 2 manos contra los mismos 9 tíos, este campo valdrá 20).
  • tot_saw_flop: número total de jugadores que han visto el flop en la sesión (mismo comentario que en el campo anterior).
  • tot_pot: cantidad total de dinero en todos los botes de la sesión (la suma de todos los botes generados sin importar quién los ganara).

Tabla tourney_summary.
Define datos de los torneos desde el punto de vista de un jugador. Un torneo tendrá en esta tabla tantas filas como jugadores hayan participado (siempre que se hayan importado los datos a PT). Contiene los campos siguientes:
  • tourney_id: identificador del torneo en la base de datos de PT.
  • place_of_finish: lugar en el que acabó el torneo el jugador.
  • player_id: identificador del jugador.
  • amt_won: cantidad ganada por el jugador.
  • real_player_id: identificador del jugador (por si se utilizan alias).
  • sat_seat_won: el equivalente a dinero que cuesta la entrada al satélite que ha ganado este jugador.
  • actual_buy_in: dinero pagado total como entrada por este jugador.
  • actual_fee: dinero pagado total como comisión a la sala de póquer.
  • total_rebuys: número total de recompras realizadas en el torneo.
  • rebuy_amt: cantidad que costaba cada recompra.
  • total_addons: número total de addons realizados en el torneo.
  • addon_amt: cantidad que costaba cada addon.
Tabla player_winnings.
Define los datos de ganancias entre los jugadores de cash. Cada fila identifica el dinero que le ha ganado un jugador a otro durante una sesión. Contiene los campos siguientes:
  • date_played: día en el que se contabilizan los datos de la fila.
  • game_level_id: identificador de la cantidad de las ciegas.
  • site_id: identificador de la sala.
  • player_id: identificador del jugador que ha ganado dinero en la sesión a opponent_id.
  • session_id: identificador de la sesión.
  • opponent_id: identificador del jugador que ha palmado pasta en la sesión a manos del jugador player_id.
  • won_from: cantidad ganada por el jugador player_id a opponent_id.
  • times_beat: veces que player_id ha ganado a opponent_id en la sesión.
  • real_player_id: identificador del jugador ganador (por si usa alias).
  • real_opp_id: identificador del jugador perdedor (por si usa alias).

Esta tabla sirve como base para mostrar la información de ganancias y pérdidas entre jugadores que tantas veces hemos tenido que volver a mirar varias veces por parecer increíble que ese jugador, con lo malo que es, nos haya ganado tanto dinero.


Tablas de configuración:
Almacenan los datos de configuración del PT. En este apartado se encuentran las siguientes tablas (no merece la pena extenderse en ellas):
  • dst: rangos de fechas que utilizará para cálculos internos del programa.
  • datawindow_prefs: preferencias del programa.
  • exrates: tipo de cambio entre dólares, euros y libras que va a utilizar en los cálculos.
  • error_msgs: mensajes de error del programa.
  • version_info: número de versión del programa.
Con esto concluyo la revisión pormenorizada de las tablas de PT. Espero que aclare algunas dudas y facilite la creación de consultas que abordaré en la siguiente entrada.

Leer más...