Mostrando entradas con la etiqueta Java. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java. Mostrar todas las entradas

martes, septiembre 24, 2013

Developing a jGnash plugin

jGnash is a personal financial software, available as Free Libre Open Source Software (FLOSS). I've been using it since some years, and i can say that is a great software. It has many functionalities, PDF reports and charts, to register and control your incomes and expenses. It just lack of some analysis reports, so i decided to build my own.

It's possible to create plug-ins for jGnash. So you can add a new functionality or a new report, without recompile the whole software. There's a folder in jGnash installation directory called "plugins", in this folder you can add a JAR file containing the new plug-in and next time you start jGnash, it will load your plug-in.

Requirements to build a new plug-in

For build a new plug-in you will need Java programing knowledge, and some specifics thing depending on the kind of functionalities that you are trying to extend. For building new graph charts or reports, I will suggest experience related to: Java Swing, JFreeChart, DynamicJasper and JasperReports. There is not good documentation about packages and source code of jGnash, but you can download the source code and will find is not hard to read, also you will find help on email lists.

According to jGnash help menu, these are the external libraries they use, so could be good also know a little bit about them: args4j, db4o, JasperReports, DynamicJasper, JFreeChart, JGoodies Animation, JGoodies Forms, JGoodies Looks, Apache MINA, XStream and SwingX.

I like Eclipse IDE, so I will use it, but any Java IDE should be good.

Of course, you must have installed jGnash, to link the jars files to your new plugin project.

Architecture

jGnash provides a plug-in system that is easy to understand. The jgnash2.jar provides a interface called: jgnash.plugin.Plugin and a abstract class called: jgnash.plugin.AbstractEnabledAction, to create a new plugin, inside the new plugin jar, just implement the Plugin interface and extend the AbstractEnabledAction.


Also it will be needed to write a couple of lines inside the jar MANIFEST file.

Steps to create a basic plugin

1- Start a new Java Project, this is a normal Java project in Eclipse IDE.

2-In the Java Build Path of the project (Right click on the project, Properties, Java Build Path, Libraries) add the External Jar: jgnash2.jar from your jGnash installation path.


3- Inside the project, create a new file called: MANIFEST.MF

This file must contain something similar to this:

Manifest-Version: 1.0
Plugin-Activator: myplugin.mypackage.MyPlugin
Plugin-Version: 1.0

Where "Plugin-Activator:" points to the class that implements the jgnash.plugin.Plugin interface.

4- Create the Plugin implementation class, that indicate, which menus will be added to the user interface and which actions will be executed. This is a simple example:

package myplugin.mypackage;

import javax.swing.JMenuItem;
import javax.swing.JPanel;

import jgnash.plugin.Plugin;

public class MyPlugin implements Plugin{

    @Override
    public JMenuItem[] getMenuItems() {
        JMenuItem menuItem = new JMenuItem();

        menuItem.putClientProperty(Plugin.PRECEDINGMENUIDREF, "new-command");
        menuItem.setAction(new MyAction());

        return new JMenuItem[] { menuItem };
    }

    @Override
    public String getName() {
        return "My Plugin";
    }

    @Override
    public JPanel getOptionsPanel() {
        return null;
    }

    @Override
    public void start() {
    }

    @Override
    public void stop() {  
    }
}

The line menuItem.putClientProperty(Plugin.PRECEDINGMENUIDREF, "new-command"); will tell to jGnash where to add the new menuItem, the preceding code, indicate before New Command menuItem. Other places you can choose are listed in the source code of jGnash, check this file:

/jgnash2/jgnash-resources/src/main/resources/jgnash/resource/main-frame-actions.xml

Another important line is: menuItem.setAction(new MyAction()); it says, when user clicks this menuItem execute the code inside MyAction class, that we must create later.

5- Implementing AbstractEnabledAction.

package myplugin.mypackage;

import java.awt.event.ActionEvent;

import javax.swing.Action;
import javax.swing.JOptionPane;

import jgnash.ui.actions.AbstractEnabledAction;

public class MyAction extends AbstractEnabledAction {

    public MyAction(){
        putValue(NAME, "Title");
        putValue(Action.SHORT_DESCRIPTION, "Description");
    }
  
    @Override
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(null, "Hello World");
    }
}

It's important to set the "NAME" and "Action.SHORT_DESCRIPTION" values, they will be shown as the title and tool tip text of the menuItem.

The actionPerformed method will be executed when the menuItem is clicked by the user, in this example will show a simple dialog window saying "Hello World".

6- Creating the jar file. In Eclipse, right click over your project, select Export, and then Jar File.


After that, follow the instructions, and take care when "Jar Manifest Specification" windows appear, select the option: "Use existing manifest from workspace", and choose the "MANIFEST.MF" file that we have created before.


7- Copy the generated jar file inside "plugins" folder of jGnash, run jGnash and you will see the message "Hello World" when you click the new menu "Title" inside "File" menu.



Thanks to jGnash developers for this great software. My hope is that lots of jGnash plug-ins come alive to make it a better software for all.

martes, agosto 06, 2013

Mi Aplicación Java en la Nube con Google App Engine


Fuente developers.google.com
Google App Engine (GAE) es en resumen la plataforma para publicar aplicaciones Web en la nube de Google, basada en el modelo PaaS (Plataforma como Servicio).

Google permite utilizar, sin costo, su SDK de desarrollo,  desplegar aplicaciones Java, Python, PHP o Go y utilizar repositorios de escritura y acceso a datos escalables (Big Data) basado tanto en NoSQL (llamado Datastore en GAE) como en SQL (BigQuery en GAE). El SDK se integra completamente con el IDE de desarrollo Eclipse, desde el cual se puede publicar directamente al servidor lo que se desarrolla.

"Una aplicación de una cuenta gratuita dispone de hasta 1 GB de espacio y admite hasta cinco millones de vistas mensuales." developers.google.com

Aplicación Tipo Cambio NIO

Mi Primera Aplicación Java en la Nube con Google App Engine, llamada Tipo Cambio NIO, está publicada en http://denisjtorresg.appspot.com

Se trata de una simple aplicación que permite a los usuarios conocer de forma simple y consolidada los tipos de cambio del Córdoba respecto al Dólar y el Euro. Permitiendo consultar esta información en diferentes formatos como: RSS, ATOM, JSON, HTML, y por medio de Chat (XMPP).

Básicamente lo que la aplicación hace es leer regularmente la información pública de los tipos de cambio del Córdoba respecto al Dólar y el Euro de los siguientes sitios web públicos: Banco Central de Nicaragua y de los bancos privados: BAC Nicaragua, BANPRO - Grupo Promerica, BDF - Banco de Finanzas, Citibank de Nicaragua, LAFISE Nicaragua y ProCredit Nicaragua.

Luego esta información puede ser consultada de diferentes maneras, tanto por: usuarios usando una navegador Web o su chat de Gmail, y por aplicaciones que puedan leer servicios Web basados en JSON, RSS o ATOM.


Para hacer uso del servicio ofrecido por medio de chat, agregar a GoogleTalk o al chat de Gmail la siguiente dirección: denisjtorresg@appspot.com y luego escribir la palabra "ayuda" (sin comillas).



Para consultar los datos del día desde el navegador web o consumir mediante HTTP desde una aplicación se pueden usar las siguientes URLs:

Consulta RSS con datos de hoy:
http://denisjtorresg.appspot.com/tcnio?f=hoy&s=RSS

Consulta ATOM con datos de hoy:
http://denisjtorresg.appspot.com/tcnio?f=hoy&s=ATOM

Consulta JSON con datos de hoy:
http://denisjtorresg.appspot.com/tcnio?f=hoy&s=JSON

Consulta HTML con datos de hoy:
http://denisjtorresg.appspot.com/tcnio?f=hoy&s=HTML

Se puede  sustituir el parámetro "f" por una fecha en formato aaaa-mm-dd.

Este servicio se ofrece sin garantía. Los resultados suministrados provienen de las páginas web públicas de las entidades enumeradas. 


domingo, junio 23, 2013

Servicio Web para Consultar el Tipo de Cambio del Córdoba Respecto al Dólar (cliente Java)

WSLD Servicio Web Tipo Cambio BCN
El Banco Central de Nicaragua ha publicado en Internet un servicio web SOAP para consultar las tasas de cambio del Córdoba respecto al Dólar. Según he podido experimentar han publicado las tasas de cambio a partir del 1ro de Enero del 2012.

El siguiente sitio web detalla algunos aspectos, tanto técnicos, como de condiciones de uso del servicio web:

http://www.bcn.gob.ni/tc/

El BCN ha hecho público ejemplos de cómo consumir el servicio web en plataformas .NET (con VisualBasic) y en PHP. Dado que falta un ejemplo para todos los que usamos Java, estoy liberando bajo licencia de dominio público, un archivo .jar para que pueda ser agregado en proyectos libres o comerciales.

Descargar archivo .jar (Java) para consultar servicio web de tipo de cambio.

Descargar código fuente y documentación del proyecto para el IDE Eclipse.

Ejecución del demo:

java -jar tcBCN.jar



Ejemplo de uso en un programa propio:



package info.denisjtorresg.tcbcn;

import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;

public class Prueba {

public static void main(String[] args) {
       
// Tipo de cambio del día
        System.out.println(TipoCambioBCNSimple.getTipoCambio());
       
// Tipo de cambio en la fecha indicada (año, mes, día)
        System.out.println(TipoCambioBCNSimple.getTipoCambio(2013,6,21));

System.out.println(TipoCambioBCNSimple.getTipoCambio(2012,1,1));
       
// Tipos de cambio del mes indicado
Map tcRango = TipoCambioBCNSimple.getTipoCambio(2013, 2);
        

for(Entry elemento: tcRango.entrySet()){
  Date fecha = elemento.getKey();
  Double tc = elemento.getValue();
           
  System.out.println(fecha + " => " + tc); 

}
}
}
 

El archivo jar suministra una clase de utilería simple llamada TipoCambioBCNSimple ubicada en el paquete: info.denisjtorresg.tcbcn. No requiere de ningún API o jar extra, funciona con Java SE 6 o superior.

Esta clase contiene el método estático getTipoCambio el cual está sobrecargado para recibir distintos tipos de parámetros que especifiquen la fecha o rango de fechas para las cuales se desea conocer el tipo de cambio.

La documentación completa de la clase de utilería TipoCambioBCNSimple se puede ver en:

http://sites.google.com/site/denisjtorresg/TipoCambioBCNSimple.html

Espero que sea de utilidad para el que la necesite.

Otros artículos similares:
Validar números de cédulas de Nicaragua con Java

jueves, agosto 16, 2012

Gracias a Dios: Java Standard Edition 6 Programmer Certified Professional

El día de ayer en GueGue centro de pruebas autorizado por Pearson y Oracle puede realizar un examen para el cual estaba en preparación desde hace ya algún tiempo, gracias a Dios todo salió bien, mi primera certificación :)


Espero que esto anime a varios amigos, compañeros y conocidos a que también se preparen y que sientan que ellos también pueden. Gracias a todos por las felicitaciones.

domingo, enero 08, 2012

Contabilidad personal con jGnash

Contabilidad personal con jGnash


El año pasado junto con otros amigos (Hamer y Marconi) nos apuntamos a recibir un curso de Finanzas para no Financieros en la UPOLI.



En ese curso aprendimos un poco de contabilidad por partida doble, activo, pasivo, capital, etc. Luego intentando implementar los conocimientos recién adquiridos y llevar control de mis finanzas personales busqué un software libre que me asistiera, así encontré: jGnash.


jGnash según Wikipedia:

jGnash es una aplicación libre de gestión de finanzas personales programada en Java.

Entre sus principales características destaca:

- Está basado en transacciones de partida doble (debe y haber)
- Cuenta de ajuste o reconciliación
- Generación de informes o reportes en PDF
- Soporte para múltiples monedas
- Actualizaciones automáticas en línea de tasas de cambio de monedas
- Catálogo de cuentas personalizable
- Interfaz de usuario amigable
- Multiplataforma, es ejecutable en cualquier plataforma que soporte Java (linux y windows)

Su sitio Web, desde el cual se puede encontrar más información o desde el cual se puede descargar, es:

http://sourceforge.net/apps/mediawiki/jgnash/index.php?title=Main_Page

Instalar jGnash

1- Descargar la última versión de jGnash de su sitio Web.
2- Descomprimir el zip

Ejecutar jGnash y crear una nueva base de datos

Desde una consola ejecutar el jar de la siguiente manera (en windows se puede hacer doble clic sobre el ejecutable):

denis@host:~/jGnash$ java -jar jgnash2.jar

Seleccionar del menú Archivo, la opción Nuevo. Y en los siguientes pasos es necesario indicar la ruta y el nombre del archivo a crear, moneda por defecto, otras monedas a ser soportadas, aunque luego se puede ajustar esta configuración, al final se selecciona el catálogo de cuentas inicial que es posible también personalizar.

Ruta y nombre del archivo:


Moneda por defecto de las cuentas:



Seleccionar otras monedas a soportar:


Los catálogos de cuentas disponibles por defecto están en inglés, pero el usuario luego puede crear el suyo propio en español.



Al finalizar ya se tiene un archivo con el catálogo de cuentas inicial y sin ninguna transacción.

Ejercicio simple con jGnash

1. Suponer que a la fecha se tiene una cuenta de ahorro en un banco, con C$ 10,459.45 córdobas
2. En mi cartera del pantalón tengo C$ 350.00 córdobas
3. Suponer ingresos mensuales en concepto de salario de fin de mes por C$ 4,000.00 en 3 meses, estos son depositados al banco.
4. Cada 15 de mes retiro el 75% del salario y ahorro el 25%.
5.En el primer mes he gastado C$ 110.00 córdobas en recargas al celular, en el segundo mes C$ 55.00 y en el tercero C$ 20.00 los cuales pago con cash.
6. Suponer que en el primer mes fuí al cine y pagué C$ 65.00 córdobas con la tarjeta de débito de la cuenta bancaria
7. Generar los informes siguientes para el período registrado: patrimonio o capital neto, balance general, y el estado de resultados o pérdidas y ganancias.

La contabilidad por partida doble, se basa en que el dinero que entra debe haber salido de algún lugar, y el dinero que sale debe entrar en algún lugar. "No hay deudor sin acreedor, ni acreedor sin deudor", entendiendo este principio es fácil usar jGnash.

Para este ejemplo, en el punto número 1 para que en el banco (cuenta Saving en jGnash) ingresen (o se depositen) los C$ 10,459.45 córdobas iniciales de este conteo, es necesario que ese mismo monto salga de otra cuenta (contracuenta), la contracuenta para este punto es básicamente lo que los contadores llaman el balance de apertura o capital inicial (cuenta Opening Balances en jGnash).

Con el botón Registro de la izquierda de la pantalla activada, seleccionar la cuenta Opening Balances, en la parte derecha hay 4 fichas Disminución, Aumento, Transferencia y Ajuste, evidentemente estamos aumentando el capital inicial por lo que es necesario seleccionar la ficha Aumento, el siguiente paso importante es seleccionar la contra cuenta, o sea donde se va depositar el dinero, en este ejemplo en la cuanta de bancos (Savings), luego colocar una breve descripción de la transacción, completar la fecha y el monto:



Dado que se utiliza partida doble, es posible seleccionar la cuenta Savings, para verificar que en efecto el banco tiene un depósito de C$ 10,459.45 córdobas.



Vale destacar que el registro de la transacción no necesariamente tenía que realizarse desde la cuenta Opening Balances, sino que también se pudo haber realizado desde la cuenta Saving y seleccionar como contra cuenta Opening Balances sin alterar el mismo resultado.

El punto número dos del ejemplo también corresponde con un balance de apertura de la caja chica, cash, o en finanzas personales mi cartera. Se puede registrar igual que antes, usando las cuentas Opening Balances y Cash:



Punto número 3, suponer ingresos mensuales en concepto de salario de fin de mes por C$ 4,000.00 en 3 meses, estos son depositados al banco.

Para este ejemplo suponer que cada fin de mes se depositan 4000 en la cuenta Saving, este dinero debe ingresar por algún lado, es evidente que debe ingresar por la cuenta Salary del grupo Income Accounts.



Es fácil usar jGnash como registrador de transacciones contables. En otro momento comparto el ejercicio resuelto completamente.

domingo, diciembre 11, 2011

78.57% en el simulador del examen SCJP - 1.6 de CertPal

78.57% en el simulador del examen SCJP - 1.6 de CertPal


Yupi!

Me tomó un poco más de dos horas, 70 preguntas. Resultado: 15 fallas. Lo que resulta en 78.57%, y según la web de Oracle se pasa con 61% con 60 preguntas [1] lo cual significa que ya casi estoy listo, ahora a dar los últimos retoques...



Esta es la web del simulador:

http://www.certpal.com/ExamWeb/content/logon.do


[1]
http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_851

sábado, agosto 27, 2011

Sistema de Comunicación para Redes Internas (SISCORI) hecho en Java

Sistema de Comunicación para Redes Internas (SISCORI) hecho en Java


En Febrero del 2009 publiqué un artículo sobre un proyectito de java hecho en para una materia en la universidad: Simulador del procesador DLX (jbz) hecho en Java, resultando ser uno de los temas más leídos del foro, entonces aquí les va otro proyecto java del tiempo de la universidad: SISCORI.

Prácticamente, SISCORI, es un sistema de mensajería instantánea hecho en java (tipo jabber, pero muy, muy simple), con un protocolo de comunicación simple basado en texto, la interfaz de usuario es awt, allá por el 2004 estaba aprendiendo java, casi no habían libros al respecto y aún no tenía documentación de swing, de hecho usamos un IDE que ya no existe, se llamaba Bluette. SISCORI se compone de dos grupos de programas, los servidores y los clientes, se usa el API estándar de Socketes de java para la transmisión y recepción de datos.

La segunda versión de SISCORI si está hecha en swing, en el tiempo en que JBuilder era lo último!, mucho antes que NetBeans. Esta segunda versión usa el java sound API para capturar el audio del sistema y luego transmitir los bytes de audio sobre una red IP y permitir comunicación oral entre dos personas.

Los proyectos a futuro era integrar ambos programas y hacer una tercera versión que permitiera transmitir video, pero eso nunca sucedió, otros proyectos personales y académicos llegaron a ser prioridad.

Aquí hay más información, he desempolvado el viejo sitio que hicimos para aquel proyecto, también a partir de ahora queda liberado como software libre conforme la GPL v3.


Este es un resumen de una presentación en una feria de tecnología del CONICYT y AIN en el hotel Crowne Plaza en Nicaragua, donde como miembros de ANETIC (Asociación de Estudiantes TIC) presentamos a SISCORI, en el video se puede ver a Janet Wheelock (QEPD) quien era la presidenta de ANETIC en esa fecha.











sábado, agosto 13, 2011

Operador residuo (módulo %) en java con decimales



#java #ocjp #scjp some one tell me why?

double a = -1.1;
double b = -0.7;
System.out.println(a%b); // resultado -0.4

Pasos para resolver el ejercicio, una calculadora no ayuda...



Hay que hacerlo a mano:

- Multiplicar por 10 para eliminar el decimal
- Hacer la operación de división normal tomando en cuenta los signos, y calcular el residuo de los enteros
- Dividir el resultado entre los 10 que originalmente multiplicamos



El ejercicio lo vi en este simulador del examen:

http://www.santis.ch/training/java/jcp/selftester/indexe.php


martes, julio 19, 2011

miércoles, junio 22, 2011

OCJP: Objetivo 3.2

OCJP: Objetivo 3.2


OCJP: Objetivo 3.2 A partir de un escenario que involucre navegación por el sistema de archivos, lectura de archivos, o escritura en archivos, desarrollar la solución correcta usando las siguientes clases (algunas veces en combinación), del paquete java.io: BufferedReader, BufferedWriter, File, FileReader, PrintWriter y Console.

A continuación publico un ejemplo tonto y simple que trata de usar las clases mencionadas en el objetivo 3.2 del Oracle Certified Programmer for Java.

Descargar Deditor.java

import java.io.Console;

import java.io.File;

import java.io.FileReader;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.FileWriter;

import java.io.BufferedWriter;



public class Deditor {

  public Deditor(){

    inicio();

  }



  public static void main(String[] args) throws Exception{

    Console c = System.console();

        

    if(c==null){

      throw new Exception("No se pudo obtener consola.");

    }  

    

    new Deditor();

  }

  

  private void inicio(){

    int op = 1;



    do{

      op = getOpcionMenu("Salir","Abrir","Nuevo","Borrar","Listar");

      

      switch(op){

        case 1: break;

        case 2: abrir(); break;

        case 3: nuevo(); break;

        case 4: borrar(); break;

        case 5: listar(new File(".")); break;

      }



    } while(op!=1);



  }

  

  private void listar(File ruta){

    File files[] = ruta.listFiles();

    

    try {

      for(File f:files){

        System.console().printf("\t%s\n",f.getCanonicalPath());

      }

    } catch(IOException e){

      e.printStackTrace();

    }

  }



  private void abrir(){

    try {



      System.console().format("Archivo a abrir \n>");



      String ruta = System.console().readLine();

      File file = new File(ruta);



      if(!file.exists()){

        System.out.println("Error! el archivo no existe.");

        return;

      }



      FileReader fr = new FileReader(file);

      BufferedReader bfr = new BufferedReader(fr);



      String linea ;



      while((linea = bfr.readLine())!=null){

        System.console().printf("%s",linea + '\n');

      }



      bfr.close();

    } catch (FileNotFoundException e){

      System.out.println("Archivo no encontrado");

     } catch(IOException e){

      System.out.println("Error IO");

    }

  }



  private void nuevo(){

    String nombreArchivo = null;



    System.out.println("Esriba el nombre del archivo: ");

    nombreArchivo = System.console().readLine();

    

    if(nombreArchivo==null || nombreArchivo.length()<1 br="">
      System.console().printf("El nombre de archivo es invalido.");

      return;

    }



    File file = new File(nombreArchivo);

    if(file.exists()){

      System.console().printf("Error el archivo ya existe!");

      return;

    }



    System.out.println("Escriba el contenido del archivo\n(finaliza con .)\n\n\n");

    

    StringBuilder contenido = new StringBuilder();

    

    String l = null;

    do{

      l = System.console().readLine();

      contenido.append(l);

      contenido.append('\n');

    } while (l!=null && !l.equals("."));



    try {

      FileWriter fw = new FileWriter(file);

      BufferedWriter bw = new BufferedWriter(fw);



      bw.write(contenido.toString());



      bw.flush();

      bw.close();

    } catch(IOException e){

     e.printStackTrace();

    }

  }



  private void borrar(){

    System.out.println("Escriba el nombre del archivo a borrar> ");



    String nombreArchivo = System.console().readLine();



    if(nombreArchivo==null || nombreArchivo.length()<1 br="">
     System.out.println("Archivo invalido");     

     return;

    }



    File file = new File(nombreArchivo);

    if(!file.exists() || file.isDirectory()){

      System.out.println("El archivo no es valido");

      return;

    }



    boolean isOk = file.delete();

    

    if(isOk){

      System.out.println("Archivo borrado");

    } else {

      System.console().printf("Problemas borrando archivo.");

    }

  }



  private int getOpcionMenu(String... opciones){

    int i = 1;



    System.out.println("Seleccione una opcion:");

    for(String o:opciones){

      System.out.println("\t" + i + " - " + o);

      i++;

    }



   System.out.print("> ");



    return readInt();

  }



  private int readInt(){

    int retorno = 0;

    String r = "";

    boolean esNumerico = false;



    while(r==null || r.length()<1 br="" esnumerico="">
      r = System.console().readLine();

      try {

        retorno = Integer.parseInt(r);

        esNumerico = true;

      } catch(NumberFormatException e){

        // no es error

      }

    } 

    

    return retorno;

  }

}

sábado, abril 10, 2010

Más luto para Duke (Java): James Gosling se va de Sun upss! que diga se va de Oracle!

Más luto para Duke (Java): James Gosling se va de Sun upss! que diga se va de Oracle!

Supongo que los planes de Oracle respecto a Java ya no son para Gosling las ideas y planes que él tenía para su hijo mimado (Java).

Según el blog del propio Gosling el pasado 2 de Abril renunció a Oracle.

Respecto a los motivos de su renuncia sólo escribió lo siguiente: "En cuanto a por qué me fui, es difícil de responder: casi cualquier cosa que pudiera decir que sea precisa y honesta haría más daño que bien".

Lo cual de cierta manera da a pensar sobre el posible futuro de Java, Glassfish, Netbeans, etc. como parte de Oracle.

Jajaja! esto es cómico en su auto-bio-blog-grafía dice al final: "... trabajó un corto tiempo para Oracle después de la adquisición de Sun. El es ahora un feliz desempleado :-) ", si le tocara buscar trabajo en Nicaragüa no creo que estaría tan contento... pero siendo él quien es, supongo que no va a pasar mucho tiempo, o más bien ya ha de estar lleno de ofertas de trabajo para grandes empresas de tecnología.

http://news.cnet.com/8301-1001_3-20002207-92.html

http://nighthacks.com/roller/jag/entry/time_to_move_on

http://nighthacks.com/roller/jag/resource/bio.html

http://es.wikipedia.org/wiki/James_Gosling

martes, marzo 04, 2008

Validar números de cédulas de Nicaragua con JavaScript

A continuación comparto un pequeño código JavaScript para validar si una cadena de texto es un número de cédula válido en Nicaragua.

Siéntanse en la libertad de usarlo, modificarlo, copiarlo o compartirlo. Se ha liberado como L-GPL3.

http://sites.google.com/site/denisjtorresg/validar_cedula_js.zip

Ver versión para Java.

miércoles, febrero 13, 2008

Validar números de cédulas de Nicaragua con Java

Validar números de cédulas de Nicaragua con Java

A continuación comparto un pequeño código Java para validar si una cadena de texto es un número de cédula válido en Nicaragua.

Siéntanse en la libertad de usarlo, modificarlo, copiarlo o compartirlo. Se ha liberado como L-GPL3 y software de dominio público.

Esta es la versión del 10 de agosto del 2013. Con el aporte de Filgrados Correos.

http://sites.google.com/site/denisjtorresg/cedula.zip

Ver versión para JavaScript.


package denisjtorresg.info;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

/**
 * Validador de Número de Cédula Nicaraguense
* Este programa es software libre: usted lo puede redistribuir y/o modificar * bajo los términos de la GPL version 3 y/o software de dominio público.
* * blog.denisjtorresg.info * * Con colaboración de: * - Filgrados Correos. *
* * @autor: denisjtorresg@gmail.com * @version: 10/08/2013 * * */ public class ValidarCedula { private final String LETRAS = "ABCDEFGHJKLMNPQRSTUVWXY"; private String cedula = null; /** * Para Pruebas * @param args */ public static void main(String[] args){ String tempo = null; boolean gui = false; ValidarCedula cedula = new ValidarCedula(); if(args.length==0){ cedula.setCedula(JOptionPane.showInputDialog( "Indique la cédula a validar" )); gui = true; } else cedula.setCedula(args[0]); tempo = "Cédula a Validar: " + cedula.getCedula() + "\n"; tempo+= "Prefijo a Validar: " + cedula.getPrefijoCedula()+ "\n"; tempo+= "Fecha a Validar: " + cedula.getFechaCedula()+ "\n"; tempo+= "Sufijo a Validar: " + cedula.getSufijoCedula()+ "\n"; tempo+= "Letra a Validar: " + cedula.getLetraCedula()+ "\n"; tempo+= "¿Es Cédula Válida?: " + (cedula.isCedulaValida()?"SI":"NO")+ "\n"; tempo+= "¿Es Prefijo Válido?: " + (cedula.isPrefijoValido()?"SI":"NO")+ "\n"; tempo+= "¿Es Fecha Válida?: " + (cedula.isFechaValida()?"SI":"NO")+ "\n"; tempo+= "¿Es Sufijo Válido?: " + (cedula.isSufijoValido()?"SI":"NO")+ "\n"; tempo+= "¿Es Letra Válida?: " + (cedula.isLetraValida()?"SI":"NO")+ "\n"; tempo+= "La letra esperada es: " + cedula.calcularLetra() + "\n"; if(gui) JOptionPane.showMessageDialog(null,tempo); else System.out.println(tempo); } /** * Retorna true si la cédula es válida * false en caso contrario * * @return */ public boolean isCedulaValida(){ if(!isPrefijoValido()) return false; if(!isFechaValida()) return false; if(!isSufijoValido()) return false; if(!isLetraValida()) return false; return true; } /** * Retorna true si el prefijo de la cédula es válida * false en caso contrario * * @return */ public boolean isPrefijoValido(){ String prefijo = this.getPrefijoCedula(); if(prefijo==null) return false; Pattern p = Pattern.compile("^[0-9]{3}$"); Matcher m = p.matcher(prefijo); if (!m.find()) return false; return true; } /** * Retorna true si la fecha de la cédula es válida * false en caso contrario * * @return */ public boolean isFechaValida(){ String fecha = this.getFechaCedula(); if(fecha == null) return false; Pattern p = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])([0-9]{2})$"); Matcher m = p.matcher(fecha); if (!m.find()) return false; // verificar si la fecha existe en el calendario try { DateFormat df = new SimpleDateFormat("ddMMyy"); if(!fecha.equals(df.format(df.parse(fecha)))){ return false; } } catch (ParseException ex) { return false; } return true; } /** * Retorna true si el sufijo de la cédula es válida * false en caso contrario * * @return */ public boolean isSufijoValido(){ String sufijo = this.getSufijoCedula(); if(sufijo == null) return false; Pattern p = Pattern.compile("^[0-9]{4}[A-Y]$"); Matcher m = p.matcher(sufijo); if (!m.find()) return false; return true; } /** * Retorna true si la letra de la cédula es válida * false en caso contrario * * @return */ public boolean isLetraValida(){ String letraValida = null; String letra = this.getLetraCedula(); if(letra == null) return false; letraValida = String.valueOf(this.calcularLetra()); return letraValida.equals(letra); } /** * Retorna un entero que representa la posición en la cadena LETRAS * de la letra final de una cédula * * @return */ public int getPosicionLetra(){ int posicionLetra = 0; String cedulaSinLetra = this.getCedulaSinLetra(); long numeroSinLetra = 0; if(cedulaSinLetra == null) return -1; try{ numeroSinLetra = Long.parseLong(cedulaSinLetra); }catch(NumberFormatException e){ return -1; } posicionLetra = (int)(numeroSinLetra - Math.floor((double)numeroSinLetra/23.0) * 23); return posicionLetra; } /** * * Calcular la letra al final de la cédula nicaraguense. *
* Basado en el trabajo de: Arnoldo Suarez Bonilla - arsubo@yahoo.es *
* http://espanol.groups.yahoo.com/group/ptic-nic/message/873 * Mie, 6 de Feb, 2008 2:39 pm *
* Es correcto, los ultimos 4 numeros de la cédula son un consecutivo de las personas que nacen en la misma fecha y municipio. * La letra se calcula con el siguiente algoritmo (yo se los envío en SQL). *
*
     * declare  @cedula      varchar(20),
     *          @val         numeric(13, 0),
     *          @letra       char(1),
     *          @Letras      varchar(20)
     *          
     *          select @Letras = 'ABCDEFGHJKLMNPQRSTUVWXY'
     *          select @cedula = '0012510750012' --PARTE NUMERICA DE LA CEDULA SIN GUIONES
     *          --CALCULO DE LA LETRA DE LA CEDULA   
     *          select @val = convert(numeric(13, 0), @cedula) - floor(convert(numeric(13, 0), @cedula) / 23) * 23
     *          select @letra = SUBSTRING(@Letras, @val + 1, 1)
     *          select @letra
     * 
* @return Letra válida de cédula dada */ public char calcularLetra(){ int posicionLetra = getPosicionLetra(); if(posicionLetra <0 posicionletra="">= LETRAS.length()) return '?'; return LETRAS.charAt(posicionLetra); } /** * Fiajr el Número de Cédula * * @param cedula Número de Cédula con o sin guiones */ public void setCedula(String cedula) { cedula = cedula.trim().replaceAll("-",""); if(cedula == null || cedula.length() != 14) this.cedula = null; else this.cedula = cedula.trim().replaceAll("-","").toUpperCase(); } /** * Retorna el Número de Cédula * @return */ public String getCedula() { return cedula; } /** * Retorna el prefijo de la cédula * @return */ public String getPrefijoCedula(){ if(cedula!=null) return cedula.substring(0,3); else return null; } /** * Retorna la fecha en la cédula * @return */ public String getFechaCedula(){ if(cedula!=null) return cedula.substring(3,9); else return null; } /** * Retorna el sufijo en la cédula * @return */ public String getSufijoCedula(){ if(cedula!=null) return cedula.substring(9,14); else return null; } /** * Retorna la letra de la cédula * @return */ public String getLetraCedula(){ if(cedula!=null) return cedula.substring(13,14); else return null; } /** * Retorna la cédula sin la letra de validación * @return */ public String getCedulaSinLetra(){ if(cedula!=null) return cedula.substring(0,13); else return null; } }