Archivo de la categoría: Java

Algoritmo genético hecho en Java


Ha pasado bastante tiempo desde que no publico algún código mío, esta vez quiero compartir con ustedes un algoritmo genético hecho en Java que tuve que hacer para mi clase de Sistemas Inteligentes 😀 en el modulo de computación evolutiva, para los que no sepan que es un algoritmo genético, por aca tienen mas información.

El problema resuelto fue el problema del viajante o TSP, nuestro problema consiste básicamente en que tenemos n ciudades, que están conectadas entre si, todas con todas (n*n caminos) y existen varios objetivos, en mi caso tengo que minimizar la distancia recorrida.

Los pasos de todo algoritmo genético deben de ser

  • Generar población
  • Seleccionar a los individuos mas aptos (Torneo, selección por ruleta, etc)
  • Cruzarlos (recombinacion)
  • Mutación

Esto se realiza durante n generaciones y el objetivo es que cada generación los individuos sean mejores que los anteriores (aunque no siempre es así xD). Ahora les muestro un ejemplo de como es que funciona, supongamos que generamos nuestra población inicial la cual consiste en un camino que tiene que tomar el viajante, tiene como restricción que no puede repetir ciudades por las que ha pasado antes y el recorrido termina en la ciudad de la que partimos, ejemplo:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bathurst  Bidwill  | Bradbury Airds  Albury  Batemans-Bay-Outreach  120.68747174103011

Podemos ubicar las ciudades en un plano cartesiano y verlas como si fueran puntos, desde esa perspectiva es posible sacar la distancia total del recorrido aplicando distancia euclidiana entre los puntos.

Después de eso podemos realizar una selección, entre los métodos mas comunes están el de selección por ruleta o el de selección por torneo, en este ultimo tan solo tenemos que ordenar la lista de caminos de menor a mayor y en mi caso elegir n * 3 individuos que representaran a los padres de la siguiente generación, ahora, en este punto es importante saber cuales tenemos que elegir ya que en probabilidad es poco posible que si cruzamos los 2 individuos mejor adaptados de la generación salga uno aun mas adaptado, por el contrario podría “des evolucionar” el hijo, es por eso que yo recomiendo, si vemos la población como si estuviera ordenada en una pila, tomar de los de arriba (los mejores adaptados) y algunos de en medio.

En este punto ya tenemos a los que serán los padres, ahora debemos de cruzarlos, existen varias técnicas de cruza como recombinación en 1 punto, recombinación en 2 puntos, corte y empalme, Recombinación uniforme y uniforme media y Recombinación de cromosomas ordenados, mas información aqui.

En mi caso yo utilice recombinación en 2 puntos y después aplique un algoritmo de mi creación para corregir el camino en caso de que hubiera ciudades repetidas en el.

minCutPoint: 6 maxCutPoint: 9

Padres:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bathurst  Bidwill  | Bradbury Airds  Albury  Batemans-Bay-Outreach  120.68747174103011
Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst      | Bega  Bateau-Bay  | Bidwill  Bradbury  Blackett  Airds  122.0081148734119

Hijos sin verificar:
Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0
Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst      | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

F1Extract = | Bathurst  Bidwill  |
F2Extract = | Bega  Bateau-Bay  |

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Cruza hijo 1:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega      | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bathurst  | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

Batemans-Bay-Outreach  Ashfield  Bidwill  Bankstown  Armidale  Blackett  Bathurst      | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Cruza hijo 2:

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst  | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach       Bega  | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach       Bega  | Bathurst  Bidwill  | Bateau-Bay  Bradbury  Blackett  Airds  0.0

Aqui lo que hago es generar aleatoriamente 2 puntos de corte (minCutPoint y maxCutPoint), las ciudades entre esos 2 puntos serán los cromosomas que se insertaran en los hijos, después de eso checamos cada uno de los alelos para verificar que no esta repetido, en caso de que asi sea, remplazo la ciudad repetida por la primera ciudad no repetida del conjunto de cromosomas original del padre, lo que me asegura que siempre tendre caminos validos 🙂

Y por ultimo pero no menos importante la mutación, esta parte es bastante sencilla, genero 2 puntos aleatorios e intercambio los cromosomas de lugar, si el camino resultante es mas optimo que el original entonces el individuo evolucionara, de lo contrario se quedara igual.

Este procedimiento se realiza n generaciones, y al final esperamos tener el camino mas optimo que el viajero podría tomar.

Les dejo mi codigo fuente, espero le sirva a alguien

salu2

PD cualquier duda postearla en comentarios, gracias

Conexiones simples a mysql con JDBC en Java

Hace algún tiempo ya un amigo me pregunto que si era posible conectarse a una base de datos mysql utilizando Java, y le respondí claro que si, una opción es utilizar JDBC y el driver de mysql, hice un ejemplo bastante sencillo con el que seguro queda claro cual es la idea principal.

Lo primero que tienen que hacer es descargar el driver de conexión a mysql: mysql-connector-java-5.1.5-bin.jar y lo instalan, si utilizan eclipse es muy sencillo, tienen que copiarlo a la carpeta de su proyecto y después hacer clic con el botón secundario en su proyecto y seleccionar Build Path > Libraries > Add Jars y agregan su archivo :).

Después de eso pueden probar este pequeño código de ejemplo.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class jdbcExample {

  Connection newDB;

  void getStates()
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
  }

  void insertState(String name) {
    name = name.trim();
        if (name.length() > 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
    }

  void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
  }

  void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

          Class.forName("com.mysql.jdbc.Driver");

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }
}

Ok para los que ya están familiarizados con java les resultara muy sencillo de entender, para los que aquí va la explicación, (omitiré la parte de los imports de librerías por obvias razones xD).
public class jdbcExample {

  Connection newDB;

Al inicio de creo una nueva variable de clase de tipo Connection, desde aquí comenzamos a hacer uso de la maravilloso de los objetos :p.
void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

          Class.forName("com.mysql.jdbc.Driver");

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

Después, esta es la parte mas importante del código, aquí es donde establecemos la conexión a la base de datos, es especial esta

String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&password=" + new_password;

Donde utilizamos el protocolo JDBC para conectarnos.

Después mas abajo verán la parte donde se mandan llamar métodos de la <strong>clase</strong>

    getStates();
      insertState("Java Town");
      removeState("Java Town");

Ahora explico lo que hace cada uno de ellos, el primero hace un SELECT, el segundo un INSERT y el tercero un DELETE.
void getStates()
{
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
}

Como el código lo indica, creamos un nuevo dato de tipo Statement, armamos nuestra Query y al final realizamos la consulta (el SELECT) utilizando executeQuery y guardamos el resultado en un ResultSet que al final recorreremos utilizando un While, imprimimos el contenido con getString, esto implícitamente funciona moviendo un apuntador a través del ResulSet pero eso es otra historia xD.
void insertState(String name) {
    name = name.trim();
        if (name.length() &gt; 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
}

En este método al igual que en el anterior utilizamos un Statement, pero recibimos como parámetro un string, le aplicamos el método trim() que remueve espacios al inicio y al final de la cadena, después armamos nuestra consulta agregando el string de la variable name y la ejecutamos con executeUpdate

Entonces hasta ahorita ya deberían de saber como recuperar datos y como agregarlos de una base de datos :p, vamos por la tercera que seria eliminarlos.

void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
}

Es igual al método anterior solo que ahora la consulta en lugar de contener un INSERT será un DELETE :).
    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }

Al final creamos nuestro tan importante método main (se rumora que una vez un programador hizo un programa con 3 mains O.o???), y creamos una nueva instancia de nuestra clase y después ejecutamos el método performConnection() que realiza la conexión.

Bueno hasta aqui este mega tutorial relámpago de conexiones a bases de datos mysql con JDBC en Java, me voy a dormir, espero les sirva y cualquier duda comenten por favor.

Aquí les dejo el código sql de la tabla que utilice en el ejemplo para si ustedes quieren utilizarla.

Les recuerdo que aun esta en pie el concurso Ganate una cuenta premium de megaupload GRATIS

salu2

Android Math Helper listo para descargar!

Bueno hace algún tiempo ya escribí un post sobre una aplicación que estaba desarrollando para la plataforma android (calculadora cientifica para android) junto con unos compañeros de la universidad, hace un par de dias encontre el código y me decidi a publicar la app en el android market 🙂

La aplicación incorpora una interfaz de usuario amigable y de facil utilización, tambien la capacidad de poder escribir multiples expresiones matemáticas al mismo tiempo como las calculadoras casio

La aplicacion tiene un precio simbolico de 3 usd, si te gusta el contenido de mi blog y la información proporcionada aqui te ha ayudado agradeceria mucho adquirieras una copia de Android Math Helper 🙂

Descargar calculadora cientifica para Android

PD

tambien ha modo de spoiler les presento algunas capturas de una nueva app para android tambien en la que estoy trabajando actualmente 🙂

salu2

Análisis y solución de un wargame de Criptografia

Bueno no se si sera exactamente criptografia x’D (mas bien es como resolver el acertijo), les comento lectores, ayer sábado estaba terminando algunos pendientes del trabajo y quise hechar un vistazo a ver como iba la comunidad de diosdelared, para los que no lo saben diosdelared es una comunidad de seguridad informatica con la característica de que tiene incluido un sistema de rangos y wargames, conforme vas solucionando mas retos vas avanzando de rango :).

Tengo mi cuenta ahi desde algunos meses o años ya.

Recordando la sección de retos informáticos (wargames) me apeteció ponerme a resolver uno antes de salir al cine a ver capitan america :p, como tenia algo de ganas de pensar en logica elegi el que se llama Valid Token, hasta aqui quiero comentarles que mostrare paso por paso como se soluciona el reto, así que si eres miembro ya de la comunidad o te gustaría serlo y pasar los retos intelectuales te recomiendo que lo intentes por ti mismo en un principio :).

Como ya es característico, el reto comienza con un texto que te hace sentir como si fueras algún ciber agente de la NSA o de la CIA xD (Murder siempre tan dramático).

Ok las instrucciones dicen lo siguiente:

Tenemos acceso al E-Mail de un administrador de SafePoint. Hemos podido recuperar su usuario y contraseña y una serie de Tokens.
El problema es que estas tokens se caducan tras ser usadas y según hemos confirmado, el algoritmo de generación cambia mensualmente.
Por si te sirve, hemos encontrado lo siguiente.
Ayudanos a generar un token valido y recibirás tu recompensa.
El usuario y contraseña que conseguimos es:
$email == ‘[email protected]’ && $password == ‘one2one’

Suerte en tu misión.

mas abajo hay un link que nos dirige al siguiente panel de login:

En las instrucciones se nos proporciona un usuario y una contraseña, pero nos falta un token (como sacamos el maldito token x’D?), entonces procedemos a descargar el archivo, que se supone es un archivo robado del generador de tokens :p

<?php
class Crypt0reto
  {
  private $prefix_token = 'ddlr-';
  private $valid_algorithm = '56-101-52-51-56';
  private function TokenCalculate($string)
    {
    $md5_1 = md5($string[0]);
    $md5_2 = md5($string[1]);
    $md5_3 = md5($string[2]);
    $md5_4 = md5($string[3]);
    $md5_5 = md5($string[4]);
    $token = ord($md5_1).'-'.ord($md5_2).'-'.ord($md5_3).'-'.ord($md5_4).'-'.ord($md5_5);
    return $token;
    }
  private function DebugToken($token)
    {
    $string_explode_array = explode($this->prefix_token, $token);
    $string = $string_explode_array[1];
    return $string;
    }
  public function CheckToken($token)
    {
    $test_token = $this->TokenCalculate($this->DebugToken($token));
    if($test_token == $this->valid_algorithm)
      {
      echo "verdadero";
      return true;
      }
    else
      {
      echo "falso";
      return false;
      }
    }
  }

Y comenzamos el análisis del código.

Vemos que tenemos 3 metodos en la clase, 2 privados (DebugToken, TokenCalculate ) y el otro publico (CheckToken), partimos del hecho de que como es publica sera la función que nos diga si nuestro token es valido o no (ademas el nombre es muy obvio no xd?).

public function CheckToken($token)
    {
    $test_token = $this->TokenCalculate($this->DebugToken($token));
    if($test_token == $this->valid_algorithm)
      {
      echo "verdadero";
      return true;
      }
    else
      {
      echo "falso";
      return false;
      }
    }

La función recibe un parametro que después es pasado al metodo privado DebugToken, veamos su código entonces.

private function DebugToken($token)
    {
    $string_explode_array = explode($this->prefix_token, $token);
    $string = $string_explode_array[1];
    return $string;
    }

Al igual que el primer metodo este tambien recibe un parametro solamente, comenzando tenemos una variable que recibe el valor resultante aplicar la función explode, para los que no saben explode te permite cortar una cadena en varias partes utilizando una expresion como delimitador, en este caso $this->prefix_token, al inicio de la clase esta declarada esta variable:

 private $prefix_token = 'ddlr-'; 

Llegados a este punto sabemos que el token contiene si o si la sub cadena ddlr- :p, ¿por que? pues por que en la función DebugToken después de utilizar explode se le asigna a la variable $string el contenido del arreglo $string_explode_array en la posición 1, la posición 0 quedo vacía puesto que no había nada antes de ddlr- al final $string es devuelto un nivel mas arriba, ósea a la función CheckToken.

Recordemos que teníamos algo así como

$test_token = $this->TokenCalculate($this->DebugToken($token));

Entonces el resultado de DebugToken ($string) es pasado directamente a TokenCalculate, veamos el metodo.

private function TokenCalculate($string)
    {
    $md5_1 = md5($string[0]);
    $md5_2 = md5($string[1]);
    $md5_3 = md5($string[2]);
    $md5_4 = md5($string[3]);
    $md5_5 = md5($string[4]);
    $token = ord($md5_1).'-'.ord($md5_2).'-'.ord($md5_3).'-'.ord($md5_4).'-'.ord($md5_5);
    return $token;
    }

Al igual que los 2 metodos anteriores recibe solo un parámetros, del cual extra los caracteres individualmente y obtiene su hash en md5, después de eso guarda el resultado de todos las variable que contiene el md5 de cada caracter en la variable $token y les asigna un ‘-‘ entre cada valor.

Hay vemos algo interesante, mientras se hace la concatenación se le aplica el metodo ord, lo que hace ord es tomar el primer caracter de una cadena y regresar su equivalente en ascii, al final la cadena $token es regresada.

Regresando a nuestro metodo original (CheckTone), ya ven que esto es como inception x’D, el resultado de todo eso es asignado en $test_token y abajo hay una comparación interesante

if($test_token == $this->valid_algorithm)

Nos esta diciendo que si nuestra cadena resultante es $this->valid_algorithm, que al inicio es declarado

private $valid_algorithm = '56-101-52-51-56';

Entonces nuestro token es valido, de lo contrario es invalido :).

Ahora, después de este análisis ¿por donde comenzamos?, ¿nuestro $test_token tiene que ser igual a $this->valid_algoritm verdad?, una vez que sabemos como se construye la cadena y como funciona el algoritmo procedemos a aplicar ingeniería inversa o resolver el acertijo … vaya :).

Lo primero que tenemos que hacer es ver cual es el valor de los números ascii, ¿por que?, pues como ya habíamos dicho arriba, si no recuerdas regresa a leer xd, el ultimo paso era aplicar la función ord que devuelve el ascii del primer caracter de una cadena, en este caso los hash en md5.

Los valores son:

  /*

  56-101-52-51-56

  56 = 8
  101 = e
  52 = 4
  51 = 3
  56 = 8

  8-e-4-3-8

  */

¿Ahora que hacemos? tenemos que confiar en que el creador del wargame no se paso mucho de listo y generar todos los md5 que comiencen con dichos caracteres (8-e-4-3-8), usando las letras del abecedario y los números del 0-9 (por eso dije que no se haya pasado de listo y haya utilizando caracteres raros jaj)

Tengo un arreglo ya preparado

$abc = array('@','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','{','|','}','~');

Imprimo las cadenas hash resultantes que coincidan con nuestro patron de búsqueda.

for($i = 0; $i < count($abc); $i++)
  {
    switch(substr(md5($abc[$i]),0,1))
    {
      case '8':
      echo $abc[$i]." : ".md5($abc[$i])."<br/>";
      break;
      
      case 'e':
      echo $abc[$i]." : ".md5($abc[$i])."<br/>";
      break;
      
      case '4':
      echo $abc[$i]." : ".md5($abc[$i])."<br/>";
      break;
      
      case '3':
      echo $abc[$i]." : ".md5($abc[$i])."<br/>";
      break;
    }

Y el resultado es (ya organizados)

/*
8-e-4-3-8

= 8 = 

F : 800618943025315f869e4e1f09471012
N : 8d9c307cb7f3c4a32822a51922d1ceaa
[ : 815417267f76f6f460a4a61f9db75fdb
` : 833344d5e1432da82ef02e1301477ce8
d : 8277e0910d750195b448797616e091ad
f : 8fa14cdd754f91cc6554c9e71929cce7
i : 865c0c0b4ab0e063e5caa3387c1a8741
k : 8ce4b16b22b58894aa86c421e8759df3
p : 83878c91171338902e0fe0fb97a8c47a

= e =

R : e1e1d3d40573127e9ee0480caf1283d6
e : e1671797c52e15f763380b45e841ec32
t : e358efa489f58062f10dd7316b65649e

= 4 =

P : 44c29edb103a2872f519ad0c9a0fdaaa
U : 4c614360da93c0a041b22e537de151eb
c : 4a8a08f09d37b73795649038408b5f33
r : 4b43b0aee35624cd95b910189b3dc231
y : 415290769594460e2e485922904f345d
~ : 4c761f170e016836ff84498202b99827

= 3 =

E : 3a3ea00cfc35332cedf6e5e9a32e94da
j : 363b122c528f54df4a0446b6bab05515
*/

Hagamos cuentas para ver cuantas contraseñas posibles podríamos generar x’D, 9 * 3 * 6 * 2 = 324 contraseñas posibles xD, no podemos utilizar fuerza bruta por que el server nos banearia así que, una vez mas una prueba de fe, armamos nuestra cadena que corresponda a 8-e-4-3-8 tomando los primeros resultados y queda

/*
8 = F
e = R
4 = P
3 = E
8 = N (la segunda letra correspondiente a los hash que comienzan con 8)

FRPEN
*/

Por ultimo le agregamos el ‘ddlr-‘ quedando ‘ddlr-FRPEN‘.

Ahora probamos, tan solo le pasamos el token que creemos es el correcto al metodo de la clase.

 $testing = new Crypt0reto();
 $testing->CheckToken("ddlr-FRPEN");

Y voilà el metodo nos regresa verdadero :), lo probamos en el formulario junto con el correo y la contraseña y efectivamente nos deja entrar al panel y superamos el reto :).

salu2

PD
Este tipo de retos me gustan mucho, me tomo 12 minutos entenderle y hacer la ing inversa, tal vez algunos lo hicieron mas rapido y mas lento, eso no importa lo importantes es tener algo para ejercitar la mente x’D

PD 2
Cada reto dice el numero de personas que lo han superado, este wargames han sido alrededor de 40 personas los que lo han pasado, quiero pensar que es por que no saben programar jeje

Sistema Operativo hecho en Java

Hola lectores, quiero comentarles que ya estoy de vacaciones :), este final de semestre acabo muy atareado, termine varios proyectos y comencé con otros nuevos (prometo realizar algunos post sobre cosas en las que estoy trabajando actualmente :)), reforcé mas mis conocimientos en programación y aprendí a programar para varias plataformas también (iphone, android, symbian, etc), también aprendí nuevas cosas sobre SEO, SMO, y cosas que tienen que ver con posicionamiento web x’D.

Pero bueno, en resumen preparare un post con varios proyectos que he terminado para que los vean, ahora como ya es de costumbre quiero publicar el código de un “Sistema Operativo” hecho en Java que nos dejaron como proyecto final para la clase de Sistemas Operativos (valga la redundancia xD), dijo Sistema Operativo entre comillas ya que en realidad no lo es, si no que simula uno, los componentes y las partes mas importantes de estos, como el administrador de memoria, administrador de procesos, la calendarización, el swaping, pages faults, el procesador, los algoritmos de administración tanto de memoria como de procesador y cosas así x’D.

Si bien yo hubiera decidido programar el “Sistema Operativo” en C, C++ o algún lenguaje de ese tipo, la practica lo pedía en java para ver como era el compartido de la memoria utilizando threads (aunque en C también se puede utilizar el multiprocesamiento y el mapeo de memoria, pero pues que se le hacia x’D) y la simulación de la memoria utilizando pilas y/o listas (según el algoritmo de administración que eligiéramos).

Como datos mas técnicos se utilizo el algoritmo LRU para realizar la administración, paginado, swaping, etc referente a la memoria.

Como bono extra también le agregamos una shell (consola/interfaz de comandos) para pasar ciertos comandos y que regresara el estado actual de la memoria, los procesos que están corriendo (su pid, etc), lanzar nuevas shells, matar procesos y hasta ejecutar un juego … también hecho en JAVA x’D.

A continuación una lista mas detallada de los comandos:

  CommandOutput += "process report    ... show how many process are running on the system (system & normal process) and their names\n";
          CommandOutput += "memory report     ... show a report about the total amount of pages that every process are consuming\n";
          CommandOutput += "show commands     ... Show this help menu\n";
          CommandOutput += "launch new shell  ... Open a new command shell\n";
          CommandOutput += "close this shell  ... Close the currenlty shell in use\n";
          CommandOutput += "play snake        ... Play Snake the video game\n";
          CommandOutput += "any Unix command  ... show the output of the command (if any)\n";
          CommandOutput += "shutdown          ... Shutdown the Operating system\n";

Puedes descargar el codigo haciendo clic en “Descargar

La mayor ganancia que me dejo realizar este proyecto fue que ahora comprendo mas a fondo como es que un sistema operativo funciona x’D (el despachador, procesos, memoria, cache, swaping, segmentación, paginado, etc), en el proyecto no lo incluí pero también aprendimos como funciona un disco duro (ejecuta un impulso magnético en los sectores del disco duro, lo que hace que este en 0 o 1 :p), las partes del disco duro (pistas, discos, cilindros cabezal), algoritmos de acceso a memoria, sistemas de archivos, particionamiento (unidades lógicas, primarias, por que la tabla de particiones es de bytes, etc) y también sobre tabla tablas y mas tablas U.U :S. La materia contenía muchísima teoría pero al final si que valió la pena :).

salu2