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





miércoles, 19 de diciembre de 2012

Botón para mostrar ayuda [HTML, CSS, JavaScript]

La idea es muy simple, se quiere dar al usuario la opción de ver, en una página web, la ayuda o información que tal vez quiera saber.
Aunque es seguido que se quiere "llenar" espacio en una página, hay ocasiones en las que no se cuenta con mucho espacio o no se quiere amontonar elementos en la interfaz.
Para ello está este sencillo método: un "botón" que al pasar el cursor por encima de éste se muestra un div con la información que se desea mostrar; al quitarse el cursor la información también se oculta.

Primero, tenemos el DIV en el cual se muestra la ayuda:


<div id="ayuda">
    <b>
        Instrucciones de uso:
        <br />
        .....
    </b>
</div>

Lo importante es el "id" del div.
Ahora, lo esencial es que inicialmente esté oculto y que, cuando se muestre, esté encima de todos los demás elementos de la página. En sí, sólo hace falta los siguientes 2 atributos CSS:


visibility: hidden;
z-index: 5000;

Más, para mi gusto, se vería bien que estuviera sombrado y con esquinas redondeadas. Ésto es opcional claramente, pero el CSS del div sería:


#ayuda{
        border: solid gray 1px;
        width: 250px;
        background-color: white;
        box-shadow: 6px 6px 5px #999;
        -webkit-box-shadow: 6px 6px 5px #999;
        -moz-box-shadow: 6px 6px 5px #999;
        visibility: hidden;
        z-index: 5000;
    }

Después el botón, que realmente no será un botón sino un enlace; pero antes, mencionaré las funciones en JavaScript para ocultar y mostrar el DIV de ayuda:


function mostrarAyuda()
{
document.getElementById('ayuda').style.visibility = "visible";
}
function ocultarAyuda()
{
document.getElementById('ayuda').style.visibility = "hidden";
}

La función "mostrarAyuda" le asigna el valor "visible" al atributo "visibility" al div de ayuda. Lo cual hace que se muestre.
La función "ocultarAyuda" le asigna el valor "hidden" (oculto) al atributo "visibility" al div de ayuda. Lo cual hace que se oculte.
Y bueno, el enlace (que servirá de botón) para mostrar y ocultar la ayuda al pasar el cursor por encima:

<a id="boton" href="#" onmouseover="javascript:mostrarAyuda()" onmouseout ="javascript:ocultarAyuda()">Ayuda</a>

Ahí, el evento onmouseover (cuando se le pasa el cursor por encima) manda a llamar la función "mostrarAyuda". Caso contrario con el evento "onmouseout" llama la función "ocultarAyuda".

Y finalmente, el estilo del enlace que hará de botón. Como es muy complejo el estilo CSS para darle un buen toque elegante, además de que cambie según el cursor se encuentre encima o no, sólo les pongo el código CSS:


#boton {
        -moz-box-shadow:inset 0px 1px 0px 0px #ffffff;
        -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff;
        box-shadow:inset 0px 1px 0px 0px #ffffff;
        background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ffffff), color-stop(1, #d1d1d1) );
        background:-moz-linear-gradient( center top, #ffffff 5%, #d1d1d1 100% );
        filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#d1d1d1');
        background-color:#ffffff;
        -moz-border-radius:6px;
        -webkit-border-radius:6px;
        border-radius:6px;
        border:1px solid #dcdcdc;
        display:inline-block;
        color:#777777;
        font-family:arial;
        font-size:15px;
        font-weight:bold;
        padding:6px 24px;
        text-decoration:none;
        text-shadow:1px 1px 0px #ffffff;
    }
#boton:hover {
        background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d1d1d1), color-stop(1, #ffffff) );
        background:-moz-linear-gradient( center top, #d1d1d1 5%, #ffffff 100% );
        filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#ffffff');
        background-color:#d1d1d1;
    }
#boton:active {
        position:relative;
        top:1px;
    }


El resultado se vería así:
http://unrinconenlaweb.webcindario.com/programas/boton_ayuda/pagina.html

Y pueden descargar los archivos, separado el CSS, JS y HTML para un manejo más sencillo :D

https://docs.google.com/open?id=0B6J7PWBjtBf7TUxzZEFkYVlvWjA



martes, 23 de octubre de 2012

Temporada de recitales ISMEV




TEMPORADA DE MÚSICA DE CÁMARA 2012
ANIVERSARIO X ISMEV (Instituto Superior de Música del Estado de Veracruz)


OCTUBRE

24.- Recital de cello y piano 18:00 hrs.
        Invitados especiales: Makcim Fernández y Mónica Florescu.

31.- Recital de piano 18:00 hrs.
        Invitados especiales: Teresita Jiménez y Aldo Tercero.


NOVIEMBRE

7.- Alumnos del maestro Abel Péres Pitón 18:00 hrs.

14.- Ensamble de maestros ISMEV 18:00 hrs.
        Dir. Alfredo Hernández.

21.- Ensamble de percusiones ISMEV 18:00 hrs.
       Maestros Jesús Reyes Y Eduardo Tellez.

28.- Dúo Karla y Rafael Jiménez 18:00 hrs.

DICIEMBRE
5.- Grupo de cámara, Maestros ISMEV, orquesta de cámara OSJEV  18:00 hrs.
      Dir. Antonio Tornero.

10.- Recital de Trompeta  18:00 hrs.
       Alumnos del maestro Tim Mckeown 18:00 hrs.

12.- Propedéutico en canto y artes escénicas 18:00 hrs.
       Maestra Ana Luisa.

Imagen de cartelera


Arco Sur #1, Reserva Territorial, Xalapa de Enriquez, Veracruz, C.P. 91070. 
TEL/FAX 2288193648 y 49

martes, 18 de septiembre de 2012

Insertar juego "Torres de Hanoi" en una WEB

Hola desde hace un rato.

Vagando en la web buscando accesorios para una página, encontré el clásico juego de Hanoi en JavaScript y liberado precisamente para ser implementado en cualquier página y/o blog.
La cosa es muy sencilla, aquí van los pasos:

1.-

Descargamos unas imágenes que nos servirán para los discos y las torres del juego:

Descargar recursos

2.-
Descomprimimos la carpeta y subimos las imágenes a un servidor de alojamiento web; debe ser necesariamente de alojamiento web ya que TODAS las imágenes deben estar dentro del mismo directorio. Por ejemplo, yo usé Webcindario.com y los subí al directorio "http://midominio.webcindario.com/img/hanoi/"

3.-

Lo siguiente es, en el cuerpo (body) de la página/blog se copia el siguiente código en donde editarán el valor de la variable imgdir por el de la dirección en la cual subiste las imágenes (Dejo los créditos y Copyright):



<SCRIPT LANGUAGE="JavaScript">
<!-- Original:  Adam Stock (adam@digital-biz.com) -->

<!-- (c) Copyright 1998-99 Adam L. Stock. All Rights Reserved -->
<!-- You have permission to republish this code provided -->
<!-- that you do not remove this copyright notice -->

// Cambia la dirección por la cual tú subiste las imágenes
imgdir = " http://midominio.webcindario.com/img/hanoi/ ";


function preload() {
this.length = preload.arguments.length;
for (var i = 0; i < this.length; i++) {
this[i] = new Image();
this[i].src = imgdir + preload.arguments[i];
   }
}

var pics = new preload("disk1.gif","disk2.gif",
"disk3.gif","disk4.gif","disk5.gif","disk6.gif",
"disk7.gif","pole.gif", "disk1h.gif","disk2h.gif",
"disk3h.gif","disk4h.gif","disk5h.gif","disk6h.gif",
"disk7h.gif");

var selectedr = null;
var selectedc = null;
var maxposts = 3;
var maxdisks = 7;
var all_posts = 3;
var startpost = 1;
var endpost = (startpost-1 < 0 ? maxposts-1 : startpost-1);
var disks = 7;
var imgwidth = 160;
var imgheight = 14;
var game_is_over = false;
var show_messages = false;
var board = new Array(maxposts);
board[0] = new Array(maxdisks + 1);
board[1] = new Array(maxdisks + 1);
board[2] = new Array(maxdisks + 1);

function initboard(startpost, disks) {
var len = board[0].length;
selectedc = null;
selectedr = null;
game_is_over = false;
endpost = (startpost-1 < 0 ? maxposts-1 : startpost-1);

for (i = 0; i < len; i++) {
board[0][i] = 0;
board[1][i] = 0;
board[2][i] = 0;
}
for (i = len-disks, j = 0; i < len; i++, j++) {
board[startpost][i] = len - j - 1;
   }
}

function drawall() {
for (j=0; j<board.length; j++) {
for (i=0; i<board[j].length; i++) {
draw(j,i, getName( board[j][i]));
   }
}
message("You may begin! Select a piece to move.");
}

function restart(start) {
startpost = start;
disks = document.forms[0].disc.options[document.forms[0].disc.selectedIndex].text;
initboard(startpost,disks);
drawall();
theAnim = new Animation();
}
initboard(startpost, disks);

function getName( num ) {
if (num == 0) return "post.gif";
return "disk" + num + ".gif";
}

function message(str, force) {
if (force || !game_is_over && !show_messages)
document.disp.message.value = str;
}

function messageadd(str) {
if (!game_is_over)
document.disp.message.value = document.disp.message.value + "\n" + str;
}

function isempty(num) {
for (i = 0; i < board[num].length; i++) {
if ( board[num][i] != 0) return false;
}
return true;
}

function topmost(num) {
for (i = 0; i < board[num].length; i++) {
if (board[num][i] != 0) return  i;
}
return -1;
}

function ispost(i,j) {
return (board[j][i] == 0);
}

function istopdisk(i,j) {
return (board[j][i-1] == 0);
}

function drawboard() {
document.writeln("<h2>The Towers of Hanoi</h2><p>");
document.writeln("<table cellspacing=0 cellpadding=0 border=0>");
document.write("<tr>");
for (j = 0; j < board.length; j++) {
document.write("<td>");
document.write("<a href='javascript:clicked("+0+","+j+")'><img src='" + imgdir + "posttop.gif' border=0></a><br>");
for (i=0; i< board[0].length; i++) {
document.write("<a href='javascript:clicked("+i+","+j+")'>");
document.write("<img src='" + imgdir + getName(board[j][i]) + "' name='pos"+ j + i + "' border=0><br>");
document.write("</a>");
}
document.writeln("</td>");
}
document.write("</tr></table>");
document.write("<form name='disp'><textarea name='message' wrap=virtual rows=2 cols=40></textarea><br>" +
"Disks: <select name=\"disc\" size=1><option>3<option>4<option>5<option>6<option selected>7</select><input "
+"type=button value=\"Start the Game Over\" onClick=\"restart(startpost);\"><input "
+"type=button value=\"Solve It!\" onClick=\"restart(startpost);setTimeout('hanoi(disks,startpost,endpost)',300)\"></form>");
}

function draw(x,y,name) {
document.images["pos"+x+""+y].src = imgdir + name;
}

function animate(x,y,name) {
theAnim.addFrame( "pos"+x+""+y, imgdir + name);
}

function clicked(i,j) {
document.forms[0].message.focus(); // get rid of annoying outline in MSIE
document.forms[0].message.blur();

if (game_is_over)  restart(startpost = endpost);
if (!isselection() && ispost(i,j)) { message("Select a piece to move."); return; }
if (!ispost(i,j)) { toggle(j); return; };
if (ispost(i,j) && selectedc == j) { message("Move the piece to a different post."); return; }
if (!legalmove(j)) { message("That is not a legal move. Try again."); return; }
move(j); return;
}

function legalmove(j) {
if (isempty(j)) return true;
return (board[j][topmost(j)] < board[selectedc][selectedr]);
}

function isselection() {
return selectedc != null;
}

function toggle( num ) {
var toppos = topmost(num);

if (selectedc == num && selectedr == toppos) {
selectedc = null; selectedr = null;
animate(num,toppos,"disk" + board[num][toppos] + ".gif");
message("Select a piece to move.");
return;
}
if (isselection()) {
animate(selectedc,selectedr,"disk" + board[selectedc][selectedr] + ".gif");
}
selectedc = num; selectedr = toppos;
animate(num,toppos,"disk" + board[num][toppos] + "h.gif");
message("Click on the post to which you want to move the disk.");
}

function move( num ) {
var toppos = (!isempty(num) ? topmost(num) : board[num].length);
board[num][toppos-1] = board[selectedc][selectedr];
board[selectedc][selectedr] = 0;
animate(selectedc,selectedr,"post.gif");
animate(num,toppos-1,"disk" + board[num][toppos-1] + ".gif");
selectedc = null; selectedr = null;
message("Select a piece to move.");
game_over();
}

function hanoi(no_of_disks, start_post, goal_post) {
if (no_of_disks > 0) {
var free_post = all_posts - start_post - goal_post;
hanoi (no_of_disks - 1, start_post, free_post);
show_messages = true;
toggle(start_post);
move(goal_post);
show_messages = false;
hanoi (no_of_disks - 1 , free_post, goal_post);
game_over(true);
   }
}

function game_over(forceMsg) {
var filledpost = null;
var val = 0;
for (k = 0; k < board.length; k++)  {
val += ( isempty(k) ? 1 : 0 );
if (!isempty(k)) filledpost = k;
}

if (val == 2 && isempty(startpost)) {
message("You won!", forceMsg);
game_is_over = true;
endpost = filledpost;
}
return game_is_over;
}


function Animation() {
this.imageNum = new Array();
this.imageSrc = new Array();
this.frameIndex = 0;      
this.alreadyPlaying = false;

this.getFrameCount = getframecount;
this.moreFrames = moreframes;      
this.addFrame = addframe;      
this.drawNextFrame = drawnextframe;
this.startAnimation = startanimation;
}

function getframecount() {  return this.imageNum.length; }
function moreframes() {  return this.frameIndex < this.getFrameCount(); }
function startanimation() {
if (!this.alreadyPlaying) {
theAnim.alreadyPlaying = true;
setTimeout('theAnim.drawNextFrame()',5);
   }
}

function addframe(num, src) {
var theIndex = theAnim.imageNum.length;
theAnim.imageSrc[theIndex] = src;
theAnim.imageNum[theIndex] = num;
theAnim.startAnimation();
}

function drawnextframe() {
if (theAnim.moreFrames()) {
document.images[ theAnim.imageNum[theAnim.frameIndex] ].src = theAnim.imageSrc[theAnim.frameIndex];
theAnim.frameIndex++;
setTimeout('theAnim.drawNextFrame()', 30);
} else {
theAnim.alreadyPlaying = false;
   }
}

drawboard();
var theAnim = new Animation();
message("You may begin! Select a piece to move.");
document.disp.message.value = "";
</script>

4.- (opcional)

Y una última línea para agradecer a quienes aportan éstos códigos y los difunden libremente:

<p><center>
<font face="arial, helvetica" size="-2">Free JavaScripts provided<br/>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>

El resultado (con unas simples adaptaciones personales) se encuentra aquí: http://unrinconenlaweb.blogspot.mx/p/torres-de-hanoi.html

Espero y les guste el juego.
Seguiremos picando código.

domingo, 19 de agosto de 2012

Tercer BOSS: Hielo-Fox

A casi cuatro meses de la última vez que toque con el proyecto, le dediqué un sábado en la tarde para crear lo que será el tercer jefe del juego: Hielo-Fox.



Haciendo una parodia en el nombre, éste tercer jefe será muy peculiar ya que será muy agresivo en sus ataques además de que no tendrá un solo ataque; y, para acabar con las ansias de comer de nuestro personaje, los ataques llegan a ser más rápidos al bajar la vida de nuestro enemigo hasta cierto punto.
El escenario será muy diferente al de los otros 2 jefes; éste será grande, Aquiles tendrá que superar su fobia por los escalones y moverse continuamente para estar esquivando los ataques del enemigo... claro, si su físico no se lo impide.
He aquí la imagen del escenario:


Y, por supuesto, lo más importante para el final, pues resulta que la debilidad de Hielo-Fox serán sus ataques y sólo sus ataques. Ya que, como este jefe no se presentará con un "cuerpo", solo se le podrá golpear a los ataques que lance; a ver si con tanto salto y esquiva, nuestro personaje baje un poco de peso. Éstos ataques son:
->Una espiral helada que aparecerá cada cierto tiempo que Aquiles se encuentre quieto, lo que obliga a estar moviéndose en cada momento (en ocasiones aparecerá incluso en el aire O_o).
->Unas aves de hielo que atacarán como torpedos desde lo alto para destruirse con el primer impacto que tengan (No serán muy rápidas, para no descalabrar a nuestro personaje).
->Y un zorro que emergerá en la parte inferior cada cierto tiempo para intentar devorar a nuestro héroe; se entiende que este zorro tiene siglos sin comer como para tener de apetito al personaje.


Será difícil, pero a éstas alturas del juego se tendrá el doble salto y, al menos, la primera magia (Kame-kame-ohm); además de que quiero que éste jefe otorgue otra magia, y que sea muy buena.


Ya estamos a poco de que Aquiles termine su aventura, ya que les recuerdo que éste será solo un mini-juego.
Nos leemos.

Apaga la TV
y enciende tu cerebro

lunes, 6 de agosto de 2012

Crack de contraseñas SHA1 en Python [Fuerza bruta]

Hace poco mostré un Script que creaba un diccionario básico para encontrar contraseñas por medio de fuerza bruta (Generador de Contraseñas [diccionario] en Pyhon) ; ahora traigo otro script que complementa al anterior, un programa que lee las contraseñas generadas, las procesa mediante la digestión SHA1 y las compara con una contraseña ya codificada para encontrar la palabra correcta.
El Script funciona con cualquier diccionario siempre y cuando las contraseñas candidatas estén separadas por un salto de línea, o sea:

contraseña1
contraseña2
contraseña3
...

Como siempre, primero el código:

# -*- coding: cp1252 -*-
import hashlib
archivo = raw_input("Archivo en donde se encuentran las contraseñas: ")
password= raw_input("Escribe la contraseña digerida: ")
try:
    diccionario = open(archivo,"r")
except:
    print "Error al abrir el archivo"
    raw_input("Presione cualquier tecla para salir...")
    exit()

print "comenzamos"


while True:

    linea = diccionario.readline()
    if not linea:
        raw_input("No se encontró la contraseña en el archivo")
        break
    linea=linea.replace("\n","")
    encriptacion=hashlib.sha1(linea).hexdigest()
    if encriptacion == password:
        print "Se encontró la contraseña: "
        print linea
        raw_input()
        break

print "Fin del programa"

raw_input("Presione cualquier tecla para salir")


  • Primero se importa el módulo "hashlib" el cual contiene varios métodos de digestión (hash).
  • Se pide al usuario el diccionario del cual se obtendrán las contraseñas candidatas y la contraseña ya digerida que se va a buscar.
  • En el bloque try-except se intenta abrir el diccionario y de no existir se lanzará una excepción.
  • En el bloque WHILE es donde se realiza la comprobación de las contraseñas:
  1. Se lee una línea del archivo, si se llegó al final de éste se lanza un mensaje diciendo que la contraseña no fue encontrada en el archivo.
  2. De ser una línea válida, a ésta se le quita el salto de línea que contiene al final (en caso de tener éste símbolo).
  3. Se le aplica la digestión a la contraseña extraía del archivo y se compara con la contraseña a buscar; de coincidir ambas, se muestra el valor de la contraseña extraída antes de ser digerida; de lo contrario se prosigue con el bucle en la siguiente línea para leer otra nueva contraseña candidata.
Como ven, los mecanismos de fuerza bruta son muy sencillos, el problema como siempre son los costos en memoria, procesador y tiempo; pero son los que dan más seguridad de encontrar alguna contraseña.
Para el caso de cualquier otro tipo de digestión que contenga el módulo hashlib no hace falta nada más que cambiar la encriptación del comando:
encriptacion=hashlib.sha1(linea).hexdigest()

por cualquier otra deseada, como por ejemplo md5:
encriptacion=hashlib.md5(linea).hexdigest()

Sin nada más que explicar, nos leemos.

Apaga la TV
y enciende tu cerebro

jueves, 2 de agosto de 2012

Generador de Contraseñas [Diccionario] en Python

En el ámbito del Hacking los diccionarios de contraseñas son muy útiles a la hora de crackear contraseñas mediante la fuerza bruta, ya que el tener las posibles contraseñas es un archivo del cual se van obteniendo una por una y es analizada es más rápido que generar en tiempo real la "palabra candidata" para después ser probada.
El método que es más usado es tener una base de datos con palabras comunes y/o palabras claves que pueden ser usadas como contraseñas (Contraseñas comunes como "perro", "amor", "123456", "drácula", "thehungergames", etc); pero éste método no da un alto porcentaje de acierto a la hora de usar fuerza bruta, por lo cual es más conveniente usar la mayor cantidad de posibles combinaciones de letras, números y signos posibles para las contraseñas. Éste método requiere de más tiempo, más tiempo de procesamiento y, obviamente, más espacio de almacenado, pero entre más combinaciones se tengan mayor es el porcentaje de acierto a la hora de buscar una contraseña en específico.

En esta ocasión realicé un pequeño Script en Python que genera un archivo con todas las posibles contraseñas que contengan una longitud entre 1 y 20 que se puedan generar con las combinaciones de letras mayúsculas, minúsculas, números y los signos '-' (guión medio) y '_' (guión bajo).

Primero el código Pythoneano:

# -*- coding: cp1252 -*-
letras = ['','a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','-','_']
indices=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
#67 elementos en la lista
i=0
diccionario=open("diccionario.lis","w")
while(indices[20]==0):
cadena=""
while( j < 20  )  :
if(indices[j] > = 6 7 ) :
indices[j]=0
indices[j+1]=indices[j+1]+1
cadena=cadena+letras[indices[j]]
j=j+1
#print cadena+"\n"
diccionario.write(cadena+"\n")
indices[0]=indices[0]+1
if(indices[0]>=67):
indices[0]=0
indices[1]=indices[1]+1
diccionario.close()
print "terminado"

Como podrán notar, el código esta poco optimizado y es muy bizarro, pero cumple con su función; la explico:

Primero se crea una lista (letras) con los caracteres que quiero incluir en las combinaciones de contraseñas, tomando en cuenta la posición vacía (""). Noten que cuento que tengo 67 caracteres.

Después creo otra lista (indices) que me guardará la posición de los índices por cada posición posible y le agrego una posición más a la lista, lo cual no es del todo necesario pero no quise complicarme con validaciones.
con open('diccionario.lis','w') abro/creo un archivo con permisos de escritura en donde iré guardando las contraseñas generadas. Hago ésto antes de empezar con las iteraciones para no gastar recursos del procesador al estar abriendo y cerrando el archivo, además de que en python se sobre-escribiría el archivo si se abre de ésta manera.

Empiezo con las iteraciones, el "while(indices[20]==0)" me asegura el el último índice (el 21) de la lísta de índices será 0, ya que al vale 1 quiere decir que los demás índices ya habrán dado toda la vuelta y por consiguiente se habrán realizado las combinaciones posibles.

cadena="" crea una variable cadena que inicia vacía, esta cadena es la que contendrá la contraseña generada; poco a poco se le irán concatenando los caracteres.

while( j < 20  )  :
if(indices[j] > = 6 7 ) :
indices[j]=0
indices[j+1]=indices[j+1]+1
cadena=cadena+letras[indices[j]]
j=j+1

Esta parte de código lo que hace es concatenar el carácter que apunta cada índice a la variable cadena; el "if(indices[j] >=67)..." lo que hace es comprobar si el índice ya superó la cantidad de caracteres con los que manejo (en éste caso 67) para reiniciar a 0 la cuenta y aumentar en 1 el índice que le sigue.
Después se concatena el valor del índice a la variable "cadena".
y aumento en 1 el índice J para seguir con el siguiente, valga la redundancia, índice.

con diccionario.write(cadena+"\n") simplemente escribo la contraseña en el archivo, concatenando el salto de línea "\n".

El "if(indices[0]=..." solo comprueba que si el primer índice ya superó los 67 caracteres, para así aumentarse en 1 o bien para reiniciar a 0 y aumentar en 1 al siguiente índice.

Finalmente, cuando terminan todas las combinaciones posibles, cierro la conexión con el archivo y termino el programa.



Ésto sería todo.
Tengo pensado hacer programas que, usando el diccionario generado por este Script se puedan "desencriptar" contraseñas digeridas en MD5 y SHA1.

Por ahora nos seguiremos leyendo.


Apaga la TV
Y enciende tu cerebro

sábado, 14 de julio de 2012

[libros] Introducción a JavaScript y Ajax

JavaScript es un excelente lenguaje para la programación Web, ya que tiene utilidad tanto en la funcionalidad como en el apartado visual de las aplicaciones Web; es por ello que conocerlo se me hace muy importante, más ahora que todo se está implementando en la red.
Como es mi costumbre, les comparto un libro también de licencia "Creative Commons Reconocimiento -
No Comercial - Sin Obra Derivada 3.0":

introduccion_javascript.pdf (Javier Eguíluz Pérez) : Aun que se presente como "introducción" ésta es muy completa ya que menciona casi todo el basto arsenal de JavaScript en una forma muy detallada. Además de que está adaptado para el programador iniciante.

______________________________________________________________________________


El lenguaje AJAX rompe con ese dolor de cabeza de "cliente" por un lado y "servidor" por el otro, ya que nos evita dar todos los rodeos, saltos y "trucos" para realizar operaciones en un lado que dependen de los datos en el otro. Al estar basado su funcionamiento en XML y JavaScript me pareció muy oportuno compartir éste otro libro con la misma licencia:

introduccion_ajax.pdf (Javier Eguíluz Pérez): Éste libro, al ser del mismo autor, se complementa perfectamente con el anterior al hacer mención de los mismos recursos y la aplicación en AJAX. Contiene soporte para algunos navegadores Web (IE, Mozilla y Ópera) y varios efectos muy buenos para la aplicación basada en WEB.


Hago además, un agradecimiento a www.librosweb.es por aportar los libros de su colección bajo la licencia "Creative Commons".

domingo, 8 de julio de 2012

Mega-Marcha [7 de julio 2012 - Videos]

Aquí tienen un vistazo de los movimientos que hicimos durante la marcha.
Nuestros himnos, el apoyo ciudadano, la variedad y cantidad de personas. Ésto no es algo "pequeño", ésto es algo épico:
































































sábado, 7 de julio de 2012

Mega-Marcha [7 de julio 2012 - Fotos]

Aquí tienen las fotografías que demuestran la poca razón de los políticos, medios y gobierno que nos hacen a los manifestantes Mexicanos.
Nos dicen que somos pocos, somos "acarreados", somos unos vándalos, bajos sin oficio, que hacemos marchas que detienen el tráfico, que nadie nos hace caso, que es solo "inconformidad", que no tenemos apoyo...

Compatriotas, mis pruebas de ésta marcha [Empezó a las 3:20 PM]: