Diciembre 2, 2008 - 8:53 am - Posted by Camilo Nova
Llego al final aquella epoca dorada en la cual uno destinaba 6 meses para desarrollar un proyecto de software, con muchos recursos y tareas repetitivas, junto con un elevado costo.
Hoy en dia los frameworks son mas agiles y permiten una produccion mucho mayor de funcionalidad con menos codigo fuente, esta tendencia provoca que los desarrollos tomen mucho menos tiempo y recursos, lo que implica a su vez que los costos sean menores y que esta industria cada vez sea mas agil.
Yo sigo sorprendido con django, es muy poco el codigo que se debe escribir, basicamente la tarea es de arquitectura y no de codificación, por ahora estoy desarrollando una aplicacion muy sencilla y me ha tomado una tercera parte de lo que me hubiera costado realizarlo en java, creo que he acertado en la tendencia de lenguajes de programacion y esta vez python sigue ganando la batalla.
Etiquetas:Codigo Fuente, Desarrollo, Django, Java, Python, Software | Comente »
Septiembre 11, 2008 - 2:30 pm - Posted by Camilo Nova
Hace rato que tenia esta clase y ahora que la necesito aprovecho para publicarla. Su funcionalidad es de convertir un numero a su representacion en letras
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
| /**
* Esta clase provee la funcionalidad de convertir un numero representado en
* digitos a una representacion en letras. Mejorado para leer centavos
*
* @author Camilo Nova
* @version 1.0
*/
public abstract class NumberToLetterConverter {
private static final String[] UNIDADES = { "", "UN ", "DOS ", "TRES ",
"CUATRO ", "CINCO ", "SEIS ", "SIETE ", "OCHO ", "NUEVE ", "DIEZ ",
"ONCE ", "DOCE ", "TRECE ", "CATORCE ", "QUINCE ", "DIECISEIS",
"DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE" };
private static final String[] DECENAS = { "VENTI", "TREINTA ", "CUARENTA ",
"CINCUENTA ", "SESENTA ", "SETENTA ", "OCHENTA ", "NOVENTA ",
"CIEN " };
private static final String[] CENTENAS = { "CIENTO ", "DOSCIENTOS ",
"TRESCIENTOS ", "CUATROCIENTOS ", "QUINIENTOS ", "SEISCIENTOS ",
"SETECIENTOS ", "OCHOCIENTOS ", "NOVECIENTOS " };
/**
* Convierte a letras un numero de la forma $123,456.32 (StoreMath)
* <p>
* Creation date 5/06/2006 - 10:20:52 AM
*
* @param number
* Numero en representacion texto
* @return Numero en letras
* @since 1.0
*/
public static String convertNumberToLetter(String number) {
return convertNumberToLetter(StoreMath.parseString(number));
}
/**
* Convierte un numero en representacion numerica a uno en representacion de
* texto. El numero es valido si esta entre 0 y 999'999.999
* <p>
* Creation date 3/05/2006 - 05:37:47 PM
*
* @param number
* Numero a convertir
* @return Numero convertido a texto
* @throws NumberFormatException
* Si el numero esta fuera del rango
* @since 1.0
*/
public static String convertNumberToLetter(double number)
throws NumberFormatException {
String converted = new String();
// Validamos que sea un numero legal
double doubleNumber = StoreMath.round(number);
if (doubleNumber > 999999999)
throw new NumberFormatException(
"El numero es mayor de 999'999.999, "
+ "no es posible convertirlo");
String splitNumber[] = String.valueOf(doubleNumber).replace('.', '#')
.split("#");
// Descompone el trio de millones - ¡SGT!
int millon = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
8))
+ String.valueOf(getDigitAt(splitNumber[0], 7))
+ String.valueOf(getDigitAt(splitNumber[0], 6)));
if (millon == 1)
converted = "UN MILLON ";
if (millon > 1)
converted = convertNumber(String.valueOf(millon)) + "MILLONES ";
// Descompone el trio de miles - ¡SGT!
int miles = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
5))
+ String.valueOf(getDigitAt(splitNumber[0], 4))
+ String.valueOf(getDigitAt(splitNumber[0], 3)));
if (miles == 1)
converted += "MIL ";
if (miles > 1)
converted += convertNumber(String.valueOf(miles)) + "MIL ";
// Descompone el ultimo trio de unidades - ¡SGT!
int cientos = Integer.parseInt(String.valueOf(getDigitAt(
splitNumber[0], 2))
+ String.valueOf(getDigitAt(splitNumber[0], 1))
+ String.valueOf(getDigitAt(splitNumber[0], 0)));
if (cientos == 1)
converted += "UN";
if (millon + miles + cientos == 0)
converted += "CERO";
if (cientos > 1)
converted += convertNumber(String.valueOf(cientos));
converted += "PESOS";
// Descompone los centavos - Camilo
int centavos = Integer.parseInt(String.valueOf(getDigitAt(
splitNumber[1], 2))
+ String.valueOf(getDigitAt(splitNumber[1], 1))
+ String.valueOf(getDigitAt(splitNumber[1], 0)));
if (centavos == 1)
converted += " CON UN CENTAVO";
if (centavos > 1)
converted += " CON " + convertNumber(String.valueOf(centavos))
+ "CENTAVOS";
return converted;
}
/**
* Convierte los trios de numeros que componen las unidades, las decenas y
* las centenas del numero.
* <p>
* Creation date 3/05/2006 - 05:33:40 PM
*
* @param number
* Numero a convetir en digitos
* @return Numero convertido en letras
* @since 1.0
*/
private static String convertNumber(String number) {
if (number.length() > 3)
throw new NumberFormatException(
"La longitud maxima debe ser 3 digitos");
String output = new String();
if (getDigitAt(number, 2) != 0)
output = CENTENAS[getDigitAt(number, 2) - 1];
int k = Integer.parseInt(String.valueOf(getDigitAt(number, 1))
+ String.valueOf(getDigitAt(number, 0)));
if (k <= 20)
output += UNIDADES[k];
else {
if (k > 30 && getDigitAt(number, 0) != 0)
output += DECENAS[getDigitAt(number, 1) - 2] + "Y "
+ UNIDADES[getDigitAt(number, 0)];
else
output += DECENAS[getDigitAt(number, 1) - 2]
+ UNIDADES[getDigitAt(number, 0)];
}
// Caso especial con el 100
if (getDigitAt(number, 2) == 1 && k == 0)
output = "CIEN";
return output;
}
/**
* Retorna el digito numerico en la posicion indicada de derecha a izquierda
* <p>
* Creation date 3/05/2006 - 05:26:03 PM
*
* @param origin
* Cadena en la cual se busca el digito
* @param position
* Posicion de derecha a izquierda a retornar
* @return Digito ubicado en la posicion indicada
* @since 1.0
*/
private static int getDigitAt(String origin, int position) {
if (origin.length() > position && position >= 0)
return origin.charAt(origin.length() - position - 1) - 48;
return 0;
}
} |
Etiquetas:Codigo Fuente, Java | 8 Comentarios »
Julio 25, 2008 - 10:11 am - Posted by Camilo Nova
Mientras el tiempo que dure programando en JAVA, Eclipse me pareció la mejor pieza de software jamas construida, daba una especie de placer programar con este IDE, la facilidad de encontrar el autocompletado del código, la compilación al instante y muchas otras cosas que cualquier programador espera de un entorno de desarrollo venían con eclipse.
Ahora que me oriento al desarrollo con Django [1], veo que hay algunos que son nostálgicos y quieren utilizar eclipse, pero con Python. Para estas personas, hay un proyecto bastante interesante en [2] el cual junta en un solo paquete eclipse y todas las herramientas que permiten trabajar con Django, es un ahorro en tiempo de configuracion y puesta a punto bastante importante, y pues creo que hace felices a muchas personas que no quieren dejar de utilizar Eclipse.
Yo en lo personal prefiero utilizar la shell de Unix y el editor Scribes [3], alguno tiene una configuracion que recomendar?
Enlaces:
[1] http://www.djangoproject.com
[2] http://www.easyeclipse.org/site/distributions/python.html
[3] http://scribes.sourceforge.net/
Etiquetas:Desarrollo, Django, Java, Python | Comente »
Junio 5, 2008 - 12:29 pm - Posted by Camilo Nova
Algunas notas sobre Entrada y Salida en Java
Para obtener el separador propio del sistema en el cual se ejecuta el código java se puede llamar al siguiente método:
String fs = System.getProperty(”file.separator”);
Cuando se crea una instancia de la clase File, no es creado el archivo como tal, solamente existe la instancia del mismo en memoria.
Ejemplos de Flujos de Datos en bajo nivel:
- FileInputStream
- FileOutputStream
Ejemplos de Flujos de Datos en alto nivel:
- DataInputStream
- DataOutputStream
FileInputStream/FileOutputStream de bajo nivel y DataInputStream/DataOutputStream de alto nivel son usados para leer y escribir datos en formato binario.
FileReader/FileWriter de bajo nivel y BufferedReader/BufferedWriter de alto nivel son usados para leer y escribir datos en formato de texto.
ObjectInputStream y ObjectOutputStream pueden utilizarse para leer o escribir objetos encadenando flujos de bajo nivel con de alto nivel.
El proceso de escribir en disco un objeto es llamado serializacion, para que el objeto pueda ser serializado este debe implementar la interfaz ‘Serializable’.
Etiquetas:Java, Tecnología | Comente »
Junio 5, 2008 - 11:33 am - Posted by Camilo Nova
El siguiente código muestra como hacer una copia exacta de un archivo a otro en java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| import java.io.*;
public class FileCopy {
public FileCopy(String sourceFile, String destinationFile) {
System.out.println("Desde: " + sourceFile);
System.out.println("Hacia: " + destinationFile);
try {
File inFile = new File(sourceFile);
File outFile = new File(destinationFile);
FileInputStream in = new FileInputStream(inFile);
FileOutputStream out = new FileOutputStream(outFile);
int c;
while( (c = in.read() ) != -1)
out.write(c);
in.close();
out.close();
} catch(IOException e) {
System.err.println("Hubo un error de entrada/salida!!!");
}
}
public static void main(String args[]) {
if(args.length == 2)
new FileCopy(args[0], args[1]);
else
System.out.println("Debe ingresar dos parametros");
}
} |
Etiquetas:Codigo Fuente, Java | 3 Comentarios »
Junio 4, 2008 - 9:52 pm - Posted by Camilo Nova
En nuestro trabajo cotidiano es común la necesidad de respaldar los archivos o configuraciones que tenemos en equipos externos a los de nuestro uso diario, en general, lo ideal es asegurarse que se tiene un respaldo de la información importante y que sea fiable al momento de recuperar, claro esta, que también sea económica de implementar llenando los requerimientos establecidos.
Para eso nosotros tenemos una opción que recomendamos, fue elegida luego de utilizar varias herramientas y nos pareció la mejor de todas.
http://areca.sourceforge.net/
Es un software de copias de seguridad personal desarrollado en java y bajo la licencia GLP, con lo cual tenemos plena libertad de usarlo y distribuirlo, a diferencia de las otras opciones disponibles en el mercado. También existe otra opción de un software gratuito que merece la pena una revisión:
http://www.acebackup.com/
Nos gustaria recibir comentarios del uso de estas dos aplicaciones con el fin de definir cual es la mejor opcion, ustedes tienen la palabra.
Etiquetas:AxiaCore, Java, Software Libre, Tecnología | Comente »
Mayo 21, 2008 - 9:59 pm - Posted by Camilo Nova
Excepciones y aserciones.
Las excepciones de tipo ‘Runtime’ no son marcadas por el compilador, y no es necesario que el programador las maneje, aunque no es prohibido que lo haga.
Un bloque de codigo ‘catch’ solamente es ejecutado si atrapa una excepcion que provenga de un bloque ‘try’ correspondiente.
Una vez que la ejecucion del programa alcanza un bloque ‘try’ y una excepcion ocurre, el bloque ‘finally’, si existe, es siempre ejecutado independientemente si fue o no capturada una excepcion, a menos que, bajo circunstancias extremas como un llamado a System.exit() ocurran.
Hay dos reglas en la ejecucion de bloques ‘catch’
- Solamente un bloque ‘catch’ relevante a la excepcion y encontrado primero por el control de ejecucion, sera el bloque ejecutado para dicha excepcion.
- Los bloques ‘catch’ mas especificos (de menor jerarquia en el arbol de clases) deben preceder a los menos especificos (los mas generales). La violacion a esta regla genera un error de compilacion.
Una excepcion puede ser tratada solo por un bloque ‘catch’, donde en dicho bloque en sus parentesis debe existir la clase que representa la excepcion en si misma.
Si una excepcion no es capturada por ningun bloque ‘catch’, una de las siguientes acciones ocurre:
- Si no hay un bloque ‘finally’, la ejecucion se detiene en el punto donde se lanzo la excepcion y retorna al metodo que la llamo.
- Si hay un bloque ‘finally’ la ejecucion salta del punto donde se lanzo la excepcion al bloque ‘finally’ y retorna al metodo que la llamo luego del bloque ‘finally’.
Si una excepcion es capturada por un bloque ‘catch’, caso contrario al anterior, ocurre uno de los siguientes casos:
- Si existe un bloque ‘finally’, el control de ejecucion ejecuta el bloque ‘catch’ y luego el ‘finally’, para luego continuar con el metodo que la llamo.
- Si no existe un bloque ‘finally’, pasa a ejecutar el bloque ‘catch’ y luego continua con el metodo que la llamo.
El bloque ‘try’ debe estar seguido bien de un bloque ‘catch’ o ‘finally’, o ambos. El bloque ‘try’ por si mismo es ilegal. Cualquier bloque ‘catch’ debe estar precedido de un bloque ‘try’, y un bloque ‘finally’ debe continuar luego del ultimo bloque ‘catch’ o del bloque ‘try’ si no existe un bloque ‘catch’.
Se debe tener en cuenta al momento de sobrecargar un metodo que lanze una excepcion:
- Si el metodo a sobrecargar no lanza ninguna excepcion, el metodo que sobrecarga no puede lanzar ninguna excepcion, pero aun asi podra lanzar una excepcion en ejecucion.
- Si el metodo a sobrecargar lanza alguna excepcion, es legal para el metodo que sobrecarga no lanzar ninguna excepcion.
Para ejecutar un programa con aserciones se pasa el parametro -ea (enableassertions) al momento de ser ejecutado.
Es clave recordar que las aserciones deben ser usadas unicamente con propositos de pruebas y no debe confiarse en ellas para una aplicacion en produccion.
Etiquetas:Java, Tecnología | Comente »
Mayo 21, 2008 - 9:34 pm - Posted by Camilo Nova
El siguiente es un ejemplo de una asercion en java, que permite realizar pruebas sobre el codigo, sobretodo en la etapa de verificacion de la calidad.
Para compilar el codigo se hace de la misma manera que siempre
javac AssertionExample.java
Para ejecutarlo se deben habilitar las aserciones:
java -ea AssertionExample
Tambien puede ser ejecutado normalmente
java AssertionExample
Aqui esta el codigo, un ejemplo sencillo pero que muestra la funcionalidad que tiene para realizar verificaciones.
public class AssertionExample{
public static void main(String[] args) {
int x = -15;
DataAccess da = new DataAccess();
assert x > 0 : "El valor debe ser positivo";
System.out.println("Valor positivo x: " + x);
}
}
Etiquetas:Codigo Fuente, Java | 3 Comentarios »
Mayo 21, 2008 - 3:43 pm - Posted by Camilo Nova
El argumento legal de una estructura if() es ‘boolean’. Esto quiere decir que lo comprendido en el paréntesis debe dar como resultado un valor ‘boolean’
Listado de estructuras if-else:
- Hay dos tipos de estructuras, ‘if’ cuando es permitido que el bloque posiblemente no sea ejecutado, e ‘if-else’ cuando de seguro uno de los bloques sera ejecutado.
- Se pueden anidar como el anterior en expresiones ‘if-else if’ e ‘if-else if-else’.
- La primera estructura es ‘if’.
- Cualquiera de estas estructuras pueden anidarse dentro de otra.
En una estructura ’switch’, el caso ‘default’ no necesariamente debe ir al final. Puede estar en cualquier parte del bloque ’switch’.
Los argumentos legales para una estructura ’switch’ son: byte, short, char, int y enum. Si se intenta utilizar otro tipo se recibirá un error de compilación. Si existen dos ‘case’ iguales se generara un error de compilación.
De no escribir ‘break’ al final de cada caso ‘case’ la ejecución continuara hasta encontrar un ‘break’ o el final del bloque. Las sentencias de iteración en java son: while, do-while, for y for-each.
El bloque ‘do-while’ garantiza que el código sea ejecutado una vez antes de que se compruebe la expresión con la que decide si se ejecuta nuevamente o no, mientras que el bloque ‘while’ puede que no se ejecute ni una sola vez.
La sintaxis para un bloque ‘for-each’ es:
for(<variable Array o Colleccion> : <colección>) {
//Código a ejecutar
}
Se recorre la colección o array determinado por <colección> y asigna cada elemento iterado a la variable <variable> que sea del tipo indicado en la colección.
Existe una palabra reservada que permite saltar la ejecución dentro de un bucle, esta palabra es ‘continue’ y se puede utilizar en el siguiente bloque:
OuterLoop: for (int i=0; i < 10; i++) {
InnerLoop: for (int j=0; j < 10: j++) {
System.out.println(i +” – ” + j);
if ( i == j ) continue OuterLoop;
}
}
Hay varias cosas para tener en cuenta con este código. Lo primero es la capacidad para etiquetar un bucle, para esto se coloca un ‘label’ separado por ‘:’ de la declaración del bucle, esto permite identificar varios bucles encadenados de tal manera que se pueda saltar hacia cualquiera de ellos con la palabra reservada ‘continue’
fuera La palabra reservada ‘continue’ solamente es valida dentro de una estructura de bucle, de ser escrita porque generara un error de compilación. Esta palabra reservada sirve para saltarse o parar la iteración actual del bucle pasando a donde se le indique en la etiqueta, si no se indica etiqueta se salta la iteración del bucle donde se encuentre.
Para saltarse el bucle completo es necesario recurrir a la palabra reservada ‘break’. Esta palabra reservada puede ser utilizada tanto en un bucle como en una estructura ’switch’ y tiene el mismo comportamiento dentro de los bucles que ‘continue’.
Etiquetas:Java, Tecnología | Comente »
Mayo 20, 2008 - 7:30 am - Posted by Camilo Nova
La relación de herencia ‘extends’ es llamada “es un”. Si jaguar extiende de vehículo, entonces jaguar “es un” vehículo.
La relación “tiene un” proviene cuando una clase declara un atributo, así <clase> tiene un <atributo>. Si jaguar declara un atributo Motor, entonces jaguar “tiene un” Motor y “es un” vehículo.
La encapsulacion se refiere a la capacidad de tener atributos (propiedades) y métodos (comportamiento) unidos en una clase.
Una buena encapsulacion requiere que todos los atributos sean declarados ‘private’, lo cual a su vez es una buena practica de programacion.
La relación “tiene un” esta relacionada con la encapsulacion y “es un” con la herencia.
Alta Cohesión y Bajo Acoplamiento. La cohesión se refiere a como es la estructura interna de una clase y el acoplamiento a su relación con las demás.
En caso de una conversión implícita (cast) de tipos de datos primitivos no permitida, el error es informado en tiempo de compilacion.
Importante para recalcar en una conversión implícita:
1) No existe conversión entre tipos booleanos y no-booleanos
2) Un tipo de dato primitivo se puede convertir en otro dato primitivo de mayor o igual tamanno
Una conversión explicita es aquella que el programador determina en código fuente, la implícita es aquella que da por hecha el compilador.
Sobreescribir un método es cambiar el comportamiento de un método definido previamente, Sobrecargar es implementar la funcionalidad de un método usando el mismo nombre pero diferentes parámetros.
A partir de la versión 5.0 el tipo de retorno de un método sobreescrito puede ser una clase que herede o implemente la clase o interfaz con la cual fue declarado el tipo de retorno en el método. Es decir si el método en la clase padre tiene un tipo de retorno “Carro” es valido que una clase que sobreescriba ese mismo método implemente un tipo de retorno “Cadillac”, claro si, Cadillac “es un” Carro.
Una sobrecarga de método es una funcionalidad que permite escribir varios métodos con el mismo nombre en una misma clase, teniendo diferentes parámetros pero el mismo tipo de retorno.
Un método puede ser sobreescrito (Overwrite) o sobre cargado (Overloaded) a la vez en una clase que hereda.
Elementos importantes a resaltar:
-Dos o mas métodos con el mismo nombre y diferentes parámetros o en orden distinto se dice que son sobrecargados (Overloaded)
-Dos métodos sobrecargados pueden tener el mismo o diferente tipo de retorno
-Los métodos sobrecargados son practicamente independientes entre ellos
-Cualquiera de los métodos de la superclase pueden ser sobrecargados por la subclase
-Diferentes métodos sobrecargados pueden tener diferentes tipos de declaraciones ‘throws’
-Diferentes métodos sobrecargados pueden tener diferentes modificadores
Los métodos constructores de la clase no pueden ser sobreescritos, pero si pueden ser sobrecargados en la misma clase
Recordemos:
Un constructor debe tener el mismo nombre de la clase y cero o mas parámetros sin tipo de retorno.
Una clase puede tener mas de un constructor, si no se define un constructor el compilador define uno por defecto sin argumentos.
Etiquetas:Java, Tecnología | 1 Comentario »