miércoles, 16 de febrero de 2011

Convertir números arabigos a números romanos y números romanos a números arabigos

/**
* Conversor.java 
* 1.0
*  
* 12/10/2005 
* 
* Copyright 2005 Lisibeth Troconis. All rights reserved. Used by permission. 
* 
* Libreria para convertir números arabigos a números romanos y números 
* romanos a números arabigos
*/
public class Conversor {
 
 /**
  * SIMBOLO_ROMANO[]: arrreglo que almacena los sinbolos correspondientes al
  * alfabeto perteneciente a los números romanos
  */
 private static final String SIMBOLO_ROMANO[] = 
   { "M", "CM", "D", "CD", "C","XC", "L", "XL", "X", "IX", "V", "IV", "I" };

 /**
  * VALOR_ROMANO_ARABIGO[]: arrreglo que almacena valores arabigos que
  * corresponden a cada símbolo romano
  */
 private static final int VALOR_ROMANO_ARABIGO[] = { 1000, 900, 500, 400,
   100, 90, 50, 40, 10, 9, 5, 4, 1, 0 };

 /**
  * Longitud de los arreglos SIMBOLO_ROMANO[]y VALOR_ROMANO_ARABIGO[]
  */
 private static final int n = 13; 

 
 private static String tomarValorRomano(int cifra) {
  
  if (cifra == 0){
   return "";
  } 
  int i;//indice posición del valor o simbolo romano
  
  /**
   * busco el simbolo que le corresponde
   */
  for (i = 0; i < n; i++){
   if (cifra >= VALOR_ROMANO_ARABIGO[i]){
    break;
   } 
  }
  int v = VALOR_ROMANO_ARABIGO[i];
  String valorRomano = SIMBOLO_ROMANO[i];

  /**
   * Se ve si es un simbolo prohibido y si lo es se busca el siguiente que
   * no lo es
   */
  for (; ((v < cifra) && ((SIMBOLO_ROMANO[i] == "V")
    || (SIMBOLO_ROMANO[i] == "L") || (SIMBOLO_ROMANO[i] == "D") 
    || (SIMBOLO_ROMANO[i].length() > 1))); i++);
  while (v < cifra) {
   v = v + VALOR_ROMANO_ARABIGO[i];
   valorRomano = valorRomano + SIMBOLO_ROMANO[i];
  }
  return valorRomano;
 }

 public static String aRomano(int nArabigo) {
  
  /**
   * Se verifica el rango y si es erroneo retorna vacio
   */
  if (nArabigo > 3999 || nArabigo < 1) {
   return null;
  }

  /**
   * Se convierte el número a Romano
   */
  String resultado = "";// acumulador
  int base = 10; // posicion del número a convertir
  do {
   int cifra = nArabigo % base;
   resultado = tomarValorRomano(cifra) + resultado;
   nArabigo = nArabigo - cifra;
   base = base * 10;
  } while (nArabigo != 0);
  return resultado;
 }

 private static int estadoSiguiente(int edoActual, char caracter) {
  
  /**
   * Se verifica el caracter y se busca su correspondiente indice en el
   * automata Se inicializa a 7 para representar que el caracter es
   * cualquier valor diferente del Alfabeto valido
   */
  int posAlfabeto = 7;
  switch (caracter) {
  case 'I':
   posAlfabeto = 0;
   break;
  case 'V':
   posAlfabeto = 1;
   break;
  case 'X':
   posAlfabeto = 2;
   break;
  case 'L':
   posAlfabeto = 3;
   break;
  case 'C':
   posAlfabeto = 4;
   break;
  case 'D':
   posAlfabeto = 5;
   break;
  case 'M':
   posAlfabeto = 6;
  }
  
  /**
   * sintaxi: Automata de aceptación de la cadena de los números romanos
   * Aceptación>0 y Rechazo = -1, Alfabeto = {I V X L C D M} Estados =
   * 0..19
   */
  int[][] sintaxi = 
               // I   V   X   L   C   D   M, OTRO /*estado*/    
              {{ 1,  4,  5,  8,  9, 12, 14, -1}, /* (0) */
               { 2,  3,  3, -1, -1, -1, -1, -1}, /* (1) */ 
               { 3, -1, -1, -1, -1, -1, -1, -1}, /* (2) */
               {-1, -1, -1, -1, -1, -1, -1, -1}, /* (3) */
               {16, -1, -1, -1, -1, -1, -1, -1}, /* (4) */
               { 1,  4,  6,  7,  7, -1, -1, -1}, /* (5) */ 
               { 1,  4,  7, -1, -1, -1, -1, -1}, /* (6) */  
               { 1,  4, -1, -1, -1, -1, -1, -1}, /* (7) */  
               { 1,  4, 18, -1, -1, -1, -1, -1}, /* (8) */  
               { 1,  4,  5,  8, 10, 11, 19, -1}, /* (9) */  
               { 1,  4,  5,  8, 11, -1, -1, -1}, /* (9) */  
               { 1,  4,  5,  8, -1, -1, -1, -1}, /* (11)*/  
               { 1,  4,  5,  8, 13, -1, -1, -1}, /* (12)*/  
               { 1,  4,  5,  8, 10, -1, -1, -1}, /* (13)*/  
               { 1,  4,  5,  8,  9, 12, 15, -1}, /* (14)*/ 
               { 1,  4,  5,  8,  9, 12, 16, -1}, /* (15)*/  
               { 1,  4,  5,  8,  9, 12, -1, -1}, /* (16)*/  
               { 2, -1, -1, -1, -1, -1, -1, -1}, /* (17)*/  
               { 1,  4,  6, -1, -1, -1, -1, -1}, /* (18)*/ 
               { 1,  4,  5,  8, -1, -1, -1, -1}};/* (19)*/  
 
  /**
   * retorna el estado siguiente en el automata
   */
  return sintaxi[edoActual][posAlfabeto];
 }

 private static boolean validaRomano(String nRomano) {
  int edo = 0; //se inicializa el estado
  
  /**
   * Se recorre el automata y se verifica que es correcta la sintaxi del
   * romano
   */
  for (int i = 0; edo >= 0 && i < nRomano.length(); i++) {
   edo = estadoSiguiente(edo, nRomano.charAt(i));
  }
  
  /**
   * se retorna la condición de aceptación o rechazo
   */
  return ((edo < 0) ? false : true);
 }

 public static int aArabigo(String nRomano) {
  
  /**
   * Se verifica la sintaxi correcta de la cadena que se recive
   */
  if (!validaRomano(nRomano)) {
   return -1;
  }
  int valorArabigo = 0; // acumulador
  int anterior; // indice del simbolo anterior en la cadena
  int actual; // indice del simbolo actual en la cdena
  /**
   * Se toma el valor arbigo actual del final de la cadena que luego sera
   * el valor anterior en la cadena
   */
  for (actual = 0; actual < n; actual++)
   if (SIMBOLO_ROMANO[actual].compareTo(nRomano.charAt(nRomano
     .length() - 1)
     + "") == 0) {
    valorArabigo = VALOR_ROMANO_ARABIGO[actual];
    break;
   }
  anterior = actual;
  
  /**
   * Se convierte el romano a arabigo recorriendo desde el final hacia
   * adelante la cadena, caracer por caracter Sumando su valor si el valor
   * del caracter anterior es mayor o igual al valor del caracter actual y
   * restando si el valor anterior es menor
   */
  for (int i = nRomano.length() - 2, j = 0; i >= 0; i--) {
   for (actual = 0; actual < n; actual++) {
    if (SIMBOLO_ROMANO[actual].compareTo(nRomano.charAt(i) + "") == 0) {
     break;
    }
   }
   if (VALOR_ROMANO_ARABIGO[actual] < VALOR_ROMANO_ARABIGO[anterior]) {
    valorArabigo = valorArabigo - VALOR_ROMANO_ARABIGO[actual];
   } else {
    valorArabigo = valorArabigo + VALOR_ROMANO_ARABIGO[actual];
   }
   anterior = actual;
  }
  return valorArabigo;
 }
}

sábado, 4 de septiembre de 2010

Manifest.MF - java.io.IOException: line too long

Al tratar de crear el jar de mi proyecto, especificando Main-Class y Class-Path me arrojaba el siguiente error
jar -cfm programa.jar Manifest.txt
java.io.IOException: line too long
at java.util.jar.Attributes.read(Attributes.java:362) 
at java.util.jar.Manifest.read(Manifest.java:182) 
at java.util.jar.Manifest. <init> (Manifest.java:52) at sun.tools.jar.Main.run(Main.java:151)
at sun.tools.jar.Main.main(Main.java:1149)
En el campo Class-Path se colocan todos los jar que necesito, adicionales, para ejecutar mi programa, cada jar separados por espacio, pudiendo decir path_relacional/otrojar.jar, como lo dice la documentación de java.

Pero al ejecutar el comando y pasarle el archivo para crear el manifest, me arrojaba el error anterior, busque en internet el error y no conseguí la solución, solo más personas con el mismo problema, pero por pura casualidad mis compañeros de trabajo y yo vimos como lo hace el Netbeas y notamos lo siguiente:

Las lineas donde se colocan los jar son de tamaño fijo, y la siguiente linea donde continua colocando los jar comienza con un espacio en blanco.

Como en el archivo siguiente "Manifest.txt"
Manifest-Version: 1.0
Class-Path: lib/abeilleforms/formsrt.jar lib/apache-http-client/common
s-codec-1.3.jar lib/apache-http-client/apache-mime4j-0.6.jar lib/apac he-http-client/commons-codec-1.3.jar lib/apache-http-client/commons-l ogging-1.1.1.jar lib/apache-http-client/httpclient-4.0.jar lib/apache -http-client/httpcore-4.0.1.jar lib/apache-http-client/httpmime-4.0.j ar lib/axis2/annogen-0.1.0.jar lib/axis2/axiom-api-1.2.7.jar lib/axis 2/axiom-impl-1.2.7.jar lib/axis2/axis2-adb-1.4.1.jar lib/axis2/axis2- java2wsdl-1.4.1.jar lib/axis2/axis2-kernel-1.4.1.jar lib/axis2/backpo rt-util-concurrent-3.1.jar lib/axis2/commons-codec-1.3.jar lib/axis2/ commons-httpclient-3.1.jar lib/axis2/commons-logging-1.1.1.jar lib/ax is2/log4j-1.2.15.jar lib/axis2/neethi-2.0.4.jar lib/axis2/wsdl4j-1.6. 2.jar lib/axis2/wstx-asl-3.2.4.jar lib/axis2/XmlSchema-1.4.2.jar lib/ hsqldb/hsqldb.jar lib/jcalendar/jcalendar-1.3.3.jar /lib/jcalendar/lo oks-2.0.1.jar lib/toplink/toplink-essentials.jar lib/toplink/toplink- essentials-agent.jar Created-By: 1.6.0_0 (Sun Microsystems Inc.) Main-Class: MiClaseMain
Al ejecutar nuevamente
jar -cfm programa.jar Manifest.txt
se creó el jar sin ningún problema

Error al depurar aplicaciones de eclipse en debian squeeze

FATAL ERROR in native method: JDWP No transports initialized,
ERROR: transport error 202: connect failed: Conexión rehusada ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) JDWP exit erro
Es un bug en debian en el archivo
/etc/sysctl.d/bindv6only.conf 
Donde aparece
net.ipv6.bindv6only = 1 
Provoca que el jdk no pueda conectarse con el java debugger
Hay que setearlo a 0
Solución: como root escribir
sed -i 's/net.ipv6.bindv6only\ =\ 1/net.ipv6.bindv6only\ =\ 0/' \/etc/sysctl.d/bindv6only.conf && sudo invoke-rc.d procps restart

domingo, 15 de agosto de 2010

Usando HSQLDB

Conectar HSQLDB al administrador

Posicionarse donde se encuentra la base de datos
cd ../data

Abrir administrador de la base de datos
java -classpath .../lib/hsqldb.jar org.hsqldb.util.DatabaseManager


Ejemplo de conector = jdbc:hsqldb:file:/home/lisibeth/workspace/proyecto/hsqldb/data/nombre_base_dato

Otras clases

org.hsqldb.util.DatabaseManager
org.hsqldb.util.DatabaseManagerSwing //Esta interfaz es mas amigable que la anterior
org.hsqldb.util.Transfer
org.hsqldb.util.QueryTool
org.hsqldb.util.SqlTool

HSQLDB Server
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb





sábado, 14 de agosto de 2010

Instalar Virtualbox con soporte USB en Debian Lenny o Freeze


  1. Antes de comenzar debemos tener instalados los fuentes del kernell linux-header-NUESTRA VERSIÓN

    Si no está instalado, para saber que versión instalar, en consola root escribir

    uname -r
    Que arroja la versión del kernell, luego instalamos

    apt-get install linux-header-NUESTRA VERSIÓN

    *Donde NUESTRA VERSIÓN = al valor dado por uname -r

  2. El paquete build-essensial también tiene que estar instalado, este nos va permitir compilar el Virtualbox

    apt-get install build-essential

  3. Agregamos el repositorio para Virtualbox en consola root

    gedit /etc/apt/sources.list

    Agregar al archivo

    deb http://download.virtualbox.org/virtualbox/debian lenny non-free

  4. Descargar key de Oracle de aquí oracle_vbox.asc

    Agregar Key

    sudo apt-key add oracle_vbox.asc

  5. Actualizamos repositorios
    sudo apt-get update

    Instalamos
    apt-get install virtualbox-3.2

  6. Agregamos nuestro usuario al grupo virtualbox

    adduser lisibeth vboxusers

  7. identificar grupo vboxusers

    $ grep vbox /etc/group

    vboxusers:x:120:lisibeth

    en otro caso pudiera ser diferente.


  8. Abrir archivo mountkernfs.sh

    $gedit /etc/init.d/mountkernfs.sh

    Ubicar
    domount proc "" /proc proc -onodev,noexec,nosuid

    Debajo de ésta agrega la siguiente línea...

    domount usbfs usbdevfs /proc/bus/usb -onoexec,nosuid,nodev,devgid=120,devmode=664

    El valor subrayado es el id del paso 7

  9. Abrir archivo mountkernfs.sh

  10. $ gedit /etc/fstab

    Agregando al final las siguientes líneas

    #usbfs
    none /proc/bus/usb usbfs devgid=46,devmode=664 0 0


  11. Habilitar usb en la configuración de la maquina virtual y reiniciar los cambios

lunes, 26 de julio de 2010

Frases ... Pitágoras

“Dios habla a través de las matemáticas”

...Pitagoras...

Estoy jodía!! no entiendo nada, nada la vida! ... Esas matemáticas están fatales.... Seguiré haciendo demostraciones sobre lógica y teoría de conjunto, para mi examen... resultan más fácil de comprender....

lunes, 12 de julio de 2010

Apuntes - Teoría de conjuntos - Paradoja de Russell




Russell:"Me parece que una clase a veces es, y a veces no es, un miembro de sí misma. La clase de las cucharitas de té, por ejemplo, no es otra cucharita de té, pero la clase de cosas que no son cucharitas de té es una de las cosas que no son cucharitas... [esto] me condujo a considerar las clases que no son miembros de sí mismas; y estas, parecía, debían formar una clase. Me pregunté si esta clase es o no un miembro de sí misma. Si es un miembro de sí misma, debería poseer las propiedades que definen a dicha clase, que consisten en no ser miembros de sí mismas. Si no es un miembro de sí misma, no debe poseer la propiedad definitoria de la clase, y por tanto debe ser un miembro de sí misma. Así cada alternativa lleva a su opuesta y existe una contradicción."

Otra forma de exponer la misma idea:

Russell: en un pueblo había un barbero que afeitaba a todos aquellos que nunca se afeitaban a sí mismos, y solo a ellos. ¿Se afeitaba el barbero a sí mismo?