Me lo contaron y lo olvidé, lo leí y lo entendí, lo hice y lo aprendí.





domingo, 8 de diciembre de 2013

9 acertijos de lógica [+ 1 de matemáticas]

Los acertijos lógicos son pasatiempos o juegos que consisten en hallar la solución a un "problema hipotético" planteado.
Todos estos juegos (acertijos) tienen una base lógica, matemática o una mezcla de ambas (Y no requiere la posesión de conocimientos determinados).

Traigo 9 acertijos lógicos (y uno más de matemática) que he encontrado en Internet, una ligera recolección de diversos libros clásicos (la isla de los caballeros y escuderos, el mercado de Venecia, inferencias lógicas...) , para permitirles pasar un rato ejercitando el cerebro y la lógica.
(Al final se encuentra el enlace a las respuestas de los acertijos con su explicación):


1er acertijo de lógica:

3 personas, cualquiera puede ser un mentiroso o un sincero. La primera persona dice algo que no entiendes. La segunda persona dice que la primera dijo ser un mentiroso. La tercera persona dice que la segunda miente.

Ignorando a la primera persona ¿Qué persona es qué (mentiroso o sincero)?



2° acertijo de lógica:

En el mercado de Venecia de Shaquespare, Porcia tenía 3 cofres, uno de oro, uno de plata y otro de plomo, y en uno de ellos estaba su retrato.

El pretendiente de Porcia tenía que escoger un cofre, y si hubiera sido tan afortunado o sabio de escoger aquel con el retrato, habría podido pedir la mano de Porcia.

Porcia hizo esculpir sobre los cofres las siguientes inscripciones:

Oro: El retrato esta en este cofre.
Plata: El retrato no esta en este cofre.
Plomo: El retrato no esta en el cofre de oro.

Porcia explicó al pretendiente, que cuando mucho una de las 3 afirmaciones era verdadera.

¿Cuál de los cofres contenía el retrato?.



3er acertijo de lógica:

El pretendiente escogió de forma correcta y se casaron y vivieron felices y contentos por lo menos por un cierto tiempo, un día Porcia hizo el siguiente razonamiento: "podemos decir que mi esposo mostró poseer una cierta inteligencia al escoger el cofre correcto, pero el problema no era muy difícil. Hubiera tenido que hacerlo más arduo para poder tener un esposo verdaderamente inteligente." Así se divorcio inmediatamente para poder escoger un esposo más inteligente, esta vez hizo esculpir las siguientes inscripciones:

Oro : El retrato no está en el cofre de plata
Plata: El retrato no está en este cofre
Plomo: El retrato está en este cofre.

Porcia explico al pretendiente que por lo menos una de las tres afirmaciones era verdadera y que por lo menos una era falsa.
¿En cual de los cofres está el retrato?



4° acertijo de lógica:

En la isla de los "caballeros y escuderos" los caballeros siempre dicen la verdad y los escuderos siempre mienten...

Una vez, cuando visité la isla de los caballeros y escuderos, encontré a dos habitantes descansando bajo un árbol. Le pregunté a uno de ellos, "¿Es alguno de vosotros un caballero?". Él me respondió, y con su respuesta pude saber la solución a mi pregunta.

¿Qué es la persona a la que dirigí mi pregunta, caballero o escudero?; y, ¿Qué es el otro? Puedo asegurar que he suministrado información suficiente para resolver este problema.



5° acertijo de lógica:

Siguiendo la regla de que los caballeros dicen la verdad y los escuderos mienten...

Tenes enfrente a 2 personas ('A' y 'B').
'A' dice, "O yo soy un escudero o B es un caballero".
¿Qué son A y B?



6° acertijo de lógica:

En una isla cercana habitan caballeros (siempre dicen la verdad), escuderos (siempre mienten) y normales (a veces mienten y a veces dicen la verdad). Estamos antes tres personas, A, B, C, una de las cuales es caballero, otra escudero, y otra normal (aunque no necesariamente en este orden). Dicen lo siguiente:
A: Yo soy normal.
B: Eso es verdad.
C: Yo no soy normal.

¿Qué son A, B y C?



7° acertijo de lógica:

Te encuentras habitación que tan solo tiene dos puertas: una conduce a la salvación y la otra a la perdición. Cada puerta está custodiada por un guardián. Sabes que un guardián siempre dice la verdad mientras que el otro siempre miente, pero no sabes cuál es cuál. Sólo tienes una oportunidad.

¿Qué pregunta le formularías a uno solo de los dos guardianes para saber cuál de las dos puertas te permitirá salvarte?

(Aclaración: Que un guardia diga la verdad no quiere decir que la puerta que custodia sea la de la salvación).



8° acertijo de lógica:

Alicia y el día de la semana

Alicia, tras atravesar el espejo, se encuentra vagabundeando por el Bosque del Olvido, donde es incapaz de recordar qué día de la semana es. En el bosque viven el León y el Unicornio. El León miente los lunes, martes y miércoles. El Unicornio miente los jueves, viernes y sábados. En todas las demás ocasiones, ambos personajes dicen siempre la verdad. Alicia les pregunta y el León dice: "ayer me tocó mentir", mientras que el Unicornio asegura: "a mí también me tocó mentir ayer".
¿Qué día de la semana es hoy?



9° acertijo de lógica:

En la Isla de los Zombis, los humanos siempre dicen la verdad y conviven con los zombis, que siempre mienten y no se pueden distinguir externamente de los humanos. Para complicar la cosa, en el idioma de la isla, las preguntas que normalmente se contestarían con un "sí" o un "no" se responden con las palabras "bal" o "da", pero el visitante no sabe cuál significa "sí" ni cuál significa "no".

Supongamos que el visitante pregunta a un lugareño si "bal" significa "sí" y que éste responde: "bal"; no se puede saber lo que significa "bal", pero sí puede saber si le ha preguntado a un Zombie o a un Humano ¿a qué le ha preguntado?



Acertijo matemático:

Si una rana se cayó en un pozo de 30 metros y al intentar salir brinca 3 metros en el día y de noche resbala 2 ¿ cuántos días se tardará en salir?

domingo, 13 de octubre de 2013

Configurar una conexión en MySQL WorkBench

MySQL WorkBech es una herramienta visual que sirve para el diseño, manutención y administración de bases de datos en MySQL (aunque se puede usar con otros manejadores) y, algo muy importante, es de código abierto.

Crear una conexión es el primer paso para cualquier trabajo que se pretenda realizar con esta herramienta: diseñar y crear una base de datos, hacer consultas, hacer respaldos, usar las herramientas administrativas y un largo etcétera.

Antes de iniciar la configuración de la conexión se debe tener corriendo el servicio de MySQL (a mí me gusta usar el XAMPP para los trabajos en mi computadora personal):


Ya estando en la interfaz del WorkBench, inicialmente tenemos 3 paneles (de izquierda a derecha):

  • Desarrollo SQL (realizar las consultas, transacciones y cambios en una base de datos existente)
  • Diseño de la base de datos
  • Administración de servidores


Para crear una conexión es en el panel de la izquierda (Desarrollo SQL / SQL Development), en la opción "new connection".


Se abrirá la siguiente ventana:


Los campos a rellenar son:

  • Connetion name: un nombre para identificar la conexión.
  • Connection method: el método (o protocolo) de conexión a la base de datos; por defecto es una el TCP/IP al menos que el servidor esté configurado para aceptar otro tipo de conexiones.
  • Hostname: el nombre del host o dirección IP, puede ser el nombre del dominio (www.servidorsql.net) o la dirección IP (135.23.2.1)
  • Port: puerto de conexión, por defecto se usa el 3306.
  • username: el usuario de la base de datos.
  • Password (Opcional): la contraseña a la base de datos, se puede omitir este dato sólo que cada vez que se quiera usar esa conexión se pedirá que se introduzca la contraseña.
  • Default Schema (Opcional): Base de datos por defecto, cada que se utilice esa conexión se empezará a usar una base de datos por defecto, si no se llena este campo entonces se usará la última base de datos usada (No hay problema, abierta la conexión se puede elegir la base de datos que se usará en ese momento).
Un ejemplo de cómo llenarla:


Se puede hacer clic en el botón "Test Connection" para comprobar si los parámetros introducidos son correctos (funcionará aunque no se haya introducido contraseña debido a que sólo comprueba la existencia de la Base de Datos y si permite conexiones con el método y el puerto indicado).


Se guarda la configuración (OK) y se visualizará la nueva conexión en el panel de "Desarrollo SQL" (Izquierda) de la ventana inicial.


Siendo ésto todo lo necesario para configurar la nueva conexión; inmediatamente podemos empezar a usarla haciendo doble clic sobre el nombre de la conexión, se abrirá una pestaña con la consola para hacer consulta a nuestra(s) base(s) de datos:


martes, 24 de septiembre de 2013

[Vídeo] Presentación de "Les Twins"

Les Twins es un Dúo del baile moderno "Raindance" compuesto por los gemelos idénticos Laurent y Larry Bourgeois. Sus espectáculos rebasan las simples coreografías dando pequeñas interpretaciones y actuaciones desde cómicas hasta actuar una pelea.

Les Twins tiene poco tiempo de darse a conocer fuera de su país (Francia), aún así se les ha visto ya en varios espectáculos y concursos internacionales; lo que le ha dado cabida en vídeos como el de "Play Hard" de David Guetta.
Les presento una de sus primeras actuaciones en el Tour "World Of Dance" en San Diego 2012:




Para ver su aparición en "Play Hard": http://youtu.be/5dbEhBKGOtY?t=2m53s

domingo, 18 de agosto de 2013

Unidad de CD - Portavasos

Debido al cada vez menor uso de las unidades lectoras de CD, se ha bromeado en que su uso ya sólo radica que ser usadas como porta-vasos. Sin embargo hay quienes se han tomado muy enserio esta cuestión, de allí el siguiente vídeo:

La vida de los programadores informáticos [Vídeo]

Aunque exagerado, un vídeo que tampoco se aleja de la realidad para la vida de un programador informático; casi parece que genéticamente estamos destinados para hacer cosas absurdas con tal de reducir el estrés, ser ignorados por la mayoría de los departamentos y hasta hacer un festejo por que (por fin) nuestro programa compiló.
Disfruten del cómico e ilustrativo vídeo:

Monólogo informático [Humor]

Les muestro un vídeo corto pero muy gracioso que tiene de tema principal: La informática. Sinceramente me causó mucha risa y a mi parecer no es necesario ser informático para entender los chistes que el comediante, Nacho García, nos cuenta en estos breves 2:26 minutos:

martes, 2 de abril de 2013

DEMO II: AQuilesVania

Considerando que ya está terminada la mecánica del juego y sólo hace falta aumentarle "historia", libero una segunda DEMO funcional del AQuilesVania.

Sinopsis:
AquilesVania es un juego del género de plataformas ambientado en el clásico de konami Castlevania, pero le quita seriedad a la historia y el drama para darle énfasis a un aspecto cómico haciendo uso de frases “típicas” y elementos de la electrónica.
Aquiles es un electrónico psicópata con creencia en los vampiros; para él, cualquier cosa viviente (y no viviente) es un vampiro: personas, fantasmas, perros, esqueletos... ¿candelabros?.Ésta es una de las alucinaciones nocturnas en la cual él se introduce al castillo de Drácula tratando de erradicar la maldad del planeta; cosa no tan sencilla considerando su obsesión con la comida que le da por ingerir cualquier cosa que se encuentre...

Capturas:







En la DEMO anterior, el personaje iniciaba con varias armas secundarias, ahora sólo inicia con dos: las cruces y la ohm (Búmeran) que son suficientes para pasar la DEMO, posteriormente daré la posibilidad de obtener los frascos de agua bendita (se usaban como bombas) y fuego para el lanzallamas.

Se puede poner el juego en "FullScreen" apretando 'F4' aunque la resolución disminuye.

Enlace de Descarga:
DEMO II
(Es necesario descomprimir el juego para jugarlo correctamente.)

viernes, 22 de marzo de 2013

Crear PDF con PHP [Dompdf]

Dompdf es una librería de PHP que permite tomar una página HTML y renderizarla (convertirla) a un PDF; aunque realmente no se crea un archivo PDF pero para el usuario de la página web se verá un auténtico archivo de éste tipo y podrá imprimirlo, guardarlo y tratarlo en su totalidad como uno.

Su uso es muy sencillo, pondré un sencillo ejemplo de su uso básico:

Tenemos una página HTML con éste código:


<html>
<head>
<title>Archivo pdf</title>
</head>
<body>
<center>
<h1>P&aacute;gina renderizada a PDF</h1>
</center>
</body>
</html>


La página se llama "pagina1.html". (Se ve así: http://unrinconenlaweb.webcindario.com/programas/pdf/pagina1.html)
Ahora, para renderizarla a un PDF es necesario crear una página php con el siguiente código:


<?php
require_once("dompdf/dompdf_config.inc.php"); //Aquí se incluye la librería php del Dompdf
$file = file_get_contents("pagina1.html"); //Se "extrae" la página que se convertirá a PDF

$dompdf = new DOMPDF(); //Se crea un objeto del tipo DOMPDF
    $dompdf->load_html($file); //Se le "carga" la página que convertiremos
    $dompdf->render(); //Se manda a llamar el método para renderizar
        
    header('Content-type: application/pdf'); //Ésta es simplemente la cabecera para que el navegador interprete todo como un PDF
    echo $dompdf->output(); //Y con ésto se manda a imprimir el contenido del pdf
?>


El resultado será éste: http://unrinconenlaweb.webcindario.com/programas/pdf/ejemplo1.php
Como se nota, hay que abrir la página .php en lugar de la .html

Ahora, en más de la mitad de las ocasiones se requerirá que la información a mostrar en el PDF varíe, como puede ser una fecha, el nombre del usuario o cualquier otro dato.
Para eso, hay que poner en la página .html palabras "claves" que después serán reemplazadas por los valores dinámicos a la hora de renderizar.
Es éste ejemplo voy a poner 3 valores numéricos aleatorios en el PDF.
Para empezar, aquí está la página html (Se llama "pagina2.html")

<html>
<head>
<title>Archivo pdf</title>
</head>
<body>
<center>
<h1>P&aacute;gina renderizada a PDF</h1>
</center>
<br />
<br />
<li><b>Dato 1:</b> {#dato1}</li>
<li><b>Dato 2:</b> {#dato2}</li>
<li><b>Dato 3:</b> {#dato3}</li>
</body>
</html>


Se ve así: http://unrinconenlaweb.webcindario.com/programas/pdf/pagina2.html
Como se puede notar, están escritas "{#dato1}" "{#dato2}" y "{#dato3}" que en éste caso servirán de "palabras clave" que reemplazaré por número generados aleatoriamente.
La página php contiene lo siguiente:


<?php
require_once("dompdf/dompdf_config.inc.php"); //Se incluye la librería Dompdf
$file = file_get_contents("pagina2.html"); //Se "extrae" la página a renderizar

$dato1=rand(1,100); //guardo en una variable un número random entre 1 y 100
$dato2=rand(101,200); //guardo en otra variable un número aleatorio entre 101 y 200
$dato3=rand(300,10000); // y guardo en una tercera variable un número aleatorio entre 300 y 10000
$dompdf = new DOMPDF(); //creo un objeto de la clase DOMPDF
                                                              
         /*En la siguiente función reemplazo las "palabras clave" por los valores aleatorios de las variables que creé arriba*/
$html = str_replace( //a la variable $html guardo lo que me arroja la función str_replace
        array(
"{#dato1}","{#dato2}","{#dato3}" //éstas son las palabras claves a reemplazar
        ), 
        array(
$dato1,$dato2,$dato3 //éstos son los datos que sustituirán las palabras claves
        ), 
        $file //y se reemplazará de la página cargada en ésta variable, lo que hice más arriba
    );
    $dompdf->load_html($html); //Se carga la página que convertiremos ya con los reemplazos
    $dompdf->render(); //mandamos a llamar el método para renderizar
        
    header('Content-type: application/pdf'); //ponemos la cabecera para PDF
    echo $dompdf->output(); //se imprime el documento PDF
?>


El resultado será así: http://unrinconenlaweb.webcindario.com/programas/pdf/ejemplo2.php
Cada vez que se recarga la página, se muestran 3 valores diferentes en los campos.

Para descargar los ejemplos y la librería, aquí está el enlace:
https://dl.dropbox.com/u/46960544/pdf.rar

jueves, 24 de enero de 2013

Buscador dinámico [AJAX, JQuery]

Un "diseño" interesante para un buscador podría ser uno que, al momento de teclear en el campo de búsqueda, se fueran mostrando en "tiempo real" los resultados en el espacio correspondiente.

Una buena forma de hacerlo es mediante JQuery que tiene un mejor manejo de los eventos y brinda un sencillo método para manejar AJAX.

Para nuestro ejemplo, vamos a considerar que tenemos una Base de datos "busqueda" con la tabla "post" que contiene los siguientes campos:

| id | titulo | contenido |
| 1  |         |                 |


Crearemos primero nuestro archivo .php que será el que realizará la búsqueda en la base de datos y mostrará los resultados en una tabla:

Conectamos primero a la base de datos:
<?php

$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$mysqli = new mysqli($dbhost,$dbuser,$dbpass,"busqueda");

?>

Luego comprobaremos si recibimos el parámetro de búsqueda por POST además de evitar que éste sea un espacio en blanco:

<?php


if(isset($_POST['parametro'])) //Verificamos que venga el parámetro vía POST
{
$parametro=trim($_POST['parametro']); //Limpiamos los espacios en blanco
if($parametro!="") //Comprobamos que no quede una cadena vacía
{
....

Ahora lo sencillo, realizar la búsqueda en la base de datos buscando tanto en el campo "título" como en el campo "contenido" coincidencias con respecto al parámetro buscado y lo metemos todo a una tabla:

<?php


$result = $mysqli->query("SELECT * FROM post WHERE titulo LIKE '%$parametro%' or contenido LIKE '%$parametro%';");
$resultados = array();
while ($row_errs = $result->fetch_array()) 

$resultados[]= $row_errs; 
}
?>
<table>
<?php
foreach($resultados as $post):
?>
<tr>
<td>
<?php echo $post['titulo'].": "; ?>
</td>
<td>
<?php echo $post['contenido']; ?>
</td>
</tr>
<?php
endforeach;
?>
</table>
<?php


?>

El archivo de búsqueda quedaría así:
Visualizar archivo de busqueda.php

Ahora la página que ofrecerá la interfaz para la búsqueda (que puede ser un simple html).
Primero que nada se debe tener el archivo de JQuery e insertarlo en la página:

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>

Ahora bien, lo único que necesitamos es un input tipo text en el cual introducir el texto a buscar y un div el cual mostrará los resultados arrojados por el archivo de busqueda.php :


<input type="text" id="parametro" />
<br />
<br />
<div id="resultado" style="border: solid black 1px;"></div>

Y, por último, la "magia" de JQuery, con JavaScript se hará una función que, tanto al presionar una tecla como al soltarla mientras se esté escribiendo en el campo de texto, se extraiga el contenido del input, se envíe por POST a búsqueda.php y se recarge el div con el resultado obtenido:


<script type="text/javascript">
$(document).ready(function() {
$("#parametro").keydown( //Evento de presionar una tecla en el campo cuyo id sea "parametro"
function(event)
{
var param = $("#parametro").attr("value"); //Se obtiene el valor del campo de texto
$("#resultado").load('busqueda.php',{parametro:param}); //Y se envía por vía post al archivo busqueda.php para luego recargar el div con el resultado obtenido
}
);
});
$(document).ready(function() {
$("#parametro").keyup( //Evento de soltar una tecla en el campo cuyo id sea "parametro"
function(event)
{
var param = $("#parametro").attr("value"); //Se obtiene el valor del campo de texto
$("#resultado").load('busqueda.php',{parametro:param}); //Y se envía por vía post al archivo busqueda.php para luego recargar el div con el resultado obtenido
}
);
});
</script>

Pues nada difícil realmente, gracias a la ayuda de JQuery.

Para ver cómo resultaría implementado éste "buscador" aquí un ejemplo con una base de datos que se le han introducido 5 registro:

Para descargar el ejemplo, aquí el enlace de google drive:



[Demostración] Extraer datos de una Web (SQL Injection)

Posiblemente sean pocos a los que no les haya llamado la atención éste tema.
La inyección SQL (SQL injection o SQLi) es la forma más sencilla de lograr extraer los datos de un sistema, entre otras cosas, y la más común (debido al mismo caso).

Éste método consiste en alterar una consulta original que se realiza a la base de datos introduciendo un texto extra, que debe ser correcto, con el cual le indicamos qué queremos obtener.

Por ejemplo, suponiendo que se busca un usuario cuyo nombre se encuentre en una variable que es rellenada por el usuario:

"Select * FROM usuario WHERE nombre='$nombre';"

Si el valor de la variable $nombre fuera normal, como por ejemplo darknet, la consulta sería:

"Select * FROM usuario WHERE nombre='darknet';"

Por ahora todo funcionaría correctamente, pero ¿Qué pasaría si no se filtran bien los valores introducidos en la variable $nombre?
La respuesta es que se puede deformar la consulta para obtener un resultado indeseado para el sistema pero correcto para el atacante.
En el mismo ejemplo, vamos a darle a la variable $nombre el valor de darknet' or nombre LIKE '%%; la consulta alterada sería:

"SELECT * FROM usuario WHERE nombre='darknet' or nombre LIKE '%%';"

De ésta forma la consulta traería los datos de TODOS los usuarios en lugar de sólo 1.
Ahora bien, ya que se entiende el funcionamiento de una inyección, el método que se utiliza (en este caso) para obtener los datos de una página Web es manejando los parámetros GET de la página.
Los parámetros GET son aquellos que se observan en la URL del sitio y que, por lo general, van después del signo de '?'.
Por ejemplo, se tiene la siguiente URL:
http://www.paginaweb.com/index.php?search=123&status=2

Los parámetros GET de la URL son: search=123&status=2; como cada parámetro está separado por el signo &, así pues tenemos 2 parámetros: search y status, cuyos valores son '123' y '2' respectivamente. Éstos parámetros llegan a ser usados por los programadores para hacer consultas a la base de datos, como por ejemplo en las páginas de noticias o blogs en donde utilizan un parámetro para buscar el Id de la nota que se va a mostrar.
Claro que, aunque se usen los parámetros GET ésto no quiere decir que la página sea vulnerable ya que se pueden filtrar los valores obtenidos en los parámetros y ver si son legítimos o no.

Pero bien, al tener entendido cómo funciona ésta mecánica les presento un vídeo en donde se hace una demostración a la hora de indagar y extraer datos de una Base de datos en una página vulnerable:



Por si la resolución del vídeo a la hora de subirlo a YouTuBe no es muy apreciable, aquí les dejo el enlace de descarga directa: https://dl.dropbox.com/u/46960544/inyeccion%20SQL.mp4

Siendo ésto todo, me despido...

viernes, 4 de enero de 2013

[Demostración] Figuras sencillas en Blender


El modelado en 3D, sea el programa que sea, fácilmente se complica para la mayoría de los usuarios debido a que es un entorno precisamente en 3 dimensiones. Pero la mayoría de las complicaciones no se dan por el programa que se esté utilizando sino en la forma de pensar del usuario que casi siempre espera encontrar formas pre-determinadas o tutoriales para realizar las figuras que requiere, o simplemente el entorno de desarrollo le agobia sin permitirle usar la creatividad para realizar las figuras más sencillas a partir de las formas y herramientas más básicas.

El vídeo que presento es precisamente una demostración (y no un tutorial de ¿Cómo crear un(a)...?) de lo sencillo que es crear figuras simples a partir de las formas básicas.

Las figuras que demuestro en el vídeo son 1 pino, arbol y una cabeza humana (de una mujer).
Uso la versión de BLender 2.64 y no utilizo ninguna herramienta adicional del programa únicamente las transformaciones (escalado, duplicado y rotación).



Espero que el video sea una buena demostración que para hacer trabajos no profesionales no se requiere de una gran cantidad de herramientas ni de tiempo, es sólo cuestión de creatividad y de usar las figuras como un rompecabezas. Espero en breve hacer una demostración de figuras un poco más complejas utilizando herramientas más interesantes (distorción de nodos y operaciones booleanas).

Me despido.