jueves, 21 de marzo de 2013

Tipos de datos y variables en Java


TIPOS DE DATOS PRIMITIVOS

Datos simples ordinales (enteros)
Representan los datos enteros sin decimales

Tipo
Tamaño (bytes)
Descripción
Rango
byte
1
byte
-128 a 127
short
2
entero corto
-32768 a 32767
int
4
entero
-231 a 231-1
long
8
entero largo
263 a 263-1
Ej: 1, 27, 5948272, 435623L

Los datos long deben incluir una L al final

Datos simples reales
Representan los datos con decimales o de punto flotante.

Tipo
Tamaño (bytes)
Descripción
Rango
float
4
real simple precisión
+-3.4X1038  a +-1.4x1045
double
8
real doble precisión
+-1.8x10308 a +-4.9x10-324
Ej: 30.0, 5678.345

La coma decimal se representa con un punto ( . ), si se emplea una coma ( , ) no funcionará ya que la coma tiene otra funcionalidad que ser verá más adelante.

Para poder distinguir un float de un double hay que incluir las letras F o D al final del numero representado:
Double: 15.05D
Float: 15.05F

Por defecto en Java se emplea double por lo que la D no sería obligatoria.

Los datos reales también se pueden expresar en notación científica puesto que soportan rangos muy grandes de valores:

1234500000 -> 123.45E+7
O lo que es lo mismo: 123.45 x 107

Datos de tipo carácter
Representan caracteres con formato unicode. Se representan entre comillas simples ( ‘ ).

Tipo
Tamaño (bytes)
Descripción
Rango
char
2
carácter
codificación Unicode
Ej: ‘a’, ‘5’ , ‘-‘, ‘@’

Existen unos caracteres especiales, o caracteres de control, no imprimibles que requieren una secuencia de escape representada con una barra inclinada ( \ ) . Igualmente se escriben entre comillas simples:

Carácter especial
Descripción
‘\n’
Salto de línea
‘\t’
Tabulador
‘\b’
Retroceso
‘\r’
Retorno de carro
‘\’’
Comilla simple
‘\\’
Barra inclinada
‘\”’
Comilla doble
‘\0’
Carácter nulo

Datos de tipo lógico
Representan valores lógicos. Estos valores cumplen el algebra de Bool, de ahí su nombre, y solo pueden tomar valores verdadero (true) o falso (false).

Tipo
Tamaño (bytes)
Descripción
Rango
boolean
1
booleano
true o false



VARIABLES

Un programa escrito en cualquier lenguaje maneja datos que son almacenados en memoria e identificados a través de un nombre simbólico.  A estos datos se les llama variables o constantes, dependiendo de si su contenido es variante o fijo. Los datos almacenados en estas posiciones de memoria pueden ser de cualquiera de los tipos especificados anteriormente.

Identificadores validos
El nombre con el que se identifica una variable se llama identificador y debe cumplir una serie de normas para que sea valido:

- Debe empezar por una letra (a-z A-Z) ó por el carácter subrayado ( _ ) ó por el carácter $.
- No puede contener espacios.
- No se pueden usar las palabras reservadas como identificador:

abstract
continue
float
native

super

void
boolean
default
for

new

switch

volatile
break
do
goto

null

synchronized

while
byte
double
if

package

this


byteevalue
else
implements

private

threadsafe


case
enum
import

protected

throw


catch
extends
instanceof

public

throws


char
false
int

return

transient


class
final
interface

short

true


const
finally
long

static

try



Ej:
Identificador
Correcto
numero
si
$numero
si
índice
si *
nombre propio
no (no se pueden usar espacios)
nombre_propio
si
numero&letra
no (el & no es un carácter valido)
miIdentificador
si
MiIdentificador
si *

* El uso de tildes y mayúsculas está permitido, pero se desaconseja. Las tildes pueden dar problemas en algunos sistemas operativos. El uso de mayúsculas se recomienda para las clases y las constantes. Lo veremos más adelante.

NOTA: Java es un lenguaje casesensitive por lo que distingue identificadores escritos en mayúscula de los que están escritos en minúscula. No es lo mismo casa que Casa.

Declaración de una variable
Para poder usar las variables primero hay que declararlas. Cada variable se declara una única vez.

La declaración sigue la siguiente sintaxis:
tipo_de_dato identificador_valido[=inicialización];

El tipo de dato puede ser cualquiera de los existentes en Java.
El identificador estará definido cumpliendo las reglas expuestas anteriormente para que sea un identificador valido.
La declaración terminará en punto y coma ( ; ).









La inicialización no siempre es obligatoria. En el caso de inicializar la variable se usará el operador de asignación ( = ) seguido del valor con el que se desea inicializar la variable. Esta practica no se recomienda, salvo excepciones.










CONSTANTES

Las constantes representan variables que tienen un valor fijo que no puede modificarse.
Para representar una constante basta con incluir la palabra final antes de la declaración.
El identificador, por convenio, se escribe en mayúsculas.
El valor de la constante se suele incluir también en la declaración ya que no se podrá modificar posteriormente:
final tipo_de_dato IDENTIFICADOR_VALIDO = inicialización;





CADENAS DE CARACTERES (STRING)

Las cadenas de caracteres son conjuntos de caracteres unicode que se escriben de forma consecutiva entre comillas dobles ( “ ). Al ser objetos poseen funcionalidades propias para su manejo.
La sintaxis es la siguiente:
String identificador[=”inicialización”];
Las explicaré en profundidad más adelante.





OBJETOS DE CLASES ENVOLTORIO (WRAPPERS)

Todos los tipos de datos primitivos tienen una clase envoltorio asociada que les confiere funcionalidades más avanzadas.

Tipo de dato primitivo
Clase envoltorio
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

La sintaxis para definir un objeto de clase de envoltorio es la siguiente:
Nombre_de_wrapper identificador_valido[=inicialización];









VARIABLES DE REFERENCIAS

Contienen la dirección de memoria de un objeto.
Un objeto es un bloque de sentencias y datos generado a partir de una clase.
Estos términos, junto con las cadenas de caracteres y los wrappers, los explicaré con mayor detalle en otro post.

jueves, 13 de octubre de 2011

Ha fallecido Dennis Ritchie


En 1972 Dennis Ritchie creó el lenguaje de alto nivel C con el que desarrolló posteriormente el sistema operativo Unix junto con Ken Thompson.
Podría decirse que Dennis Ritchie fue el padre de la informática moderna puesto que C sirvió como base de otros lenguajes modernos como Java y Unix fué el pie para desarrollar los sistemas operativos actuales.
Richie falleció hoy a los 70 años de edad a causa de una enfermedad.
DEP.

jueves, 6 de octubre de 2011

Ha fallecido Steve Jobs

Esta mañana al encender mi Mac me he encontrado con esta imagen. Es cierto eso que dicen que una imagen vale más que mil palabras. Se me cortó la respiración al verla.


Tan solo un día después del lanzamiento del nuevo iphone 4s, Steve Jobs nos deja. Al final el cáncer le venció.
Es una de las pocas personas de las que se podría decir que ha hecho grandes cosas en la vida. Deja un gran legado y una marca muy onda en el mundo de las tecnologías.
Se ha ido un genio. ¿Qué será ahora de Apple sin el?

sábado, 25 de junio de 2011

Cómo instalar Oracle 10g Express Edition

A la hora de elegir una base de datos tenemos muchas alternativas: MySQL, Oracle, PostrgreSQL, etc. Como se suele decir, para gustos hay colores.

Si alguna vez habeis usado Oracle es posible que hayais tenido dificultades a la hora de instalarla, si no lo habíais hecho nunca antes. Para los que os interese esta base de datos, pero no la hayais usando antes, yo os recomiendo una versión mucho más sencilla, tanto de instalar como de manejar, que es la 10g Express Edition. Evidentemente no es tan profesional como pueden ser otras versionesm ni tan potente, pero si os estais iniciando en este mundillo de las bases de datos y os interesa Oracle, sin duda esta versión es la idónea.

Para conseguirla os la podeis descargar de la pagina de Oracle. Al colocar el cursor sobre la pestaña Downloads se desplegará un menú con todos los productos que Oracle permite descargar clasificados por categorías. Dentro de Bases de Datos encontraremos la que nos interesa.


En la siguiente pagina os dejará elegir el sistema operativo (Windows o Linux).


Tras haber seleccionado la opción apropiada para nuestro sistema tendremos que aceptar el acuerdo de licencia para poder descargarla.


Y posteriormente seleccionaremos la base de datos que nos interesa según nuestras necesidades. La primera opción solo está en inglés, la segunda tiene más idiomas (entre ellos el español, está será la que seleccionemos) y la ultima es un cliente para poder acceder a nuestra base de datos desde otras maquinas.


Una vez elegida la base de datos llega una parte que no nos suele gustar, pero que Oracle obliga a hacer en todas sus descargas: Registrarnos. Es obligatorio, sino no podremos bajar nada de la pagina de Oracle. Si ya tenéis una cuenta, como es mi caso, no es necesario el registro, bastará con iniciar sesión. Si no la tenéis registraros y después iniciad sesión.


Una vez iniciada la sesión comenzará automáticamente la descarga. Pulsaremos en guardar para que se descargue en la ubicación que le indiquemos.


Tras seleccionar el directorio donde queremos que se guarde comenzará la descarga que tardará algunos minutos


Una vez descargada, ya podemos comenzar la instalación. Buscamos el archivo que se ha descargado y hacemos doble click en el. Si os ocurre lo que me ha pasado a mi, que no me dejaba abrirlo porque no sabía con que programa asociarlo, cambiadle en nombre y añadir al final .exe, con eso sería suficiente. Después de abrir el archivo pincharemos en ejecutar en la ventana que se nos abre.


Comenzará a cargar el asistente de instalación, tardará unos segundos


Los pasos para instalar son muy sencillos, prácticamente siguiente, siguiente, siguiente...
La primera ventana que nos aparece es el mensaje de bienvenida al asistente de instalación. Pulsaremos en siguiente.


Después nos aparecerá el contrato de licencia. Lo aceptaremos y pulsaremos siguiente.


El siguiente paso es seleccionar el directorio donde queremos instalar Oracle. Podeis dejar por defecto el que viene o poner vostros el que querais. Yo dejaré el que viene por defecto que es C:\oraclexe\. Pulsamos siguiente.


Este paso es muy importante, probablemente el más importante de toda la instalación. Aquí debéis elegir una contraseña para el administrador de la base de datos. Elegid una contraseña que luego recordéis puesto que sin ella no podréis conectaros cuando vayáis a usar la base de datos. Recordad que el administrador es SYS o SYSTEM. Tras elegir la contraseña pulsamos siguiente.


Antes de comenzar la instalación nos mostrará la información de los puertos necesaria para administrar la base de datos (8080 por defecto) y establecer las conexiones (1521 por defecto). Es posible que el puerto 8080 ya lo esté usando otra aplicación como puede ser un servidor web. Si esto nos llegase a ocurrir podremos cambiarlo.
Pulsamos instalar.


Comenzará la instalación. No suele tardar mucho, eso ya depende de vuestro ordenador.


Una vez instalado nos aparecerá un mensaje que así lo indique. Si nos fijamos aparece un tick en Iniciar la página inicial de la base de datos. Podemos dejarlo activado y al dar a terminar se arrancará el explorador donde se abrirá la pagina de administración de la base de datos.


Siempre que necesitemos realizar alguna tarea de administración tendremos que abrir esta página en el explorador. Podremos acceder a ella escribiendo http://localhost:8080 y una vez en ella podremos entrar con el usuario SYSTEM y la contraseña que configuramos durante la instalación de Oracle.


En un post posterior os explicaré con más detalle la administración de la base de datos.

viernes, 6 de mayo de 2011

Cómo configurar un objeto DataSource con GlassFish

Si estáis trabajando con aplicaciones web con servlets y bases de datos os puede resultar muy útil usar con contenedor de datos. En posts anteriores os expliqué como utilizar el Apache Tomcat. Existen otros contenedores como Weblogic de Oracle o GlassFish, entre otros.

En esta ocasión explicaré como configurar un Objeto DataSource con GlassFish server 3, que será muy útil a la hora de utilizar bases de datos en nuestra aplicación web.

Para acceder a la consola de administración* de GlassFish basta con escribir en el explorador: http://localhost:4848 (El puerto 4848 es el que se asigna por defecto cuando se instala, si lo habéis cambiado tendréis que poner el que definieseis).

Os aparecerá algo como esto:

En la parte izquierda aparece un menú con todas las opciones de administrador que ofrece GlassFish. En nuestro caso nos interesa configurar un recurso nuevo (un objeto DataSource) que usaremos con el API JDBC de Java por lo que seleccionaremos Recursos y dentro JDBC. Nos aparecerán dos directorios: Recursos JDBC y Conjunto de conexiones:


Conjunto de conexiones
El primer paso es crear un Conjunto de conexiones nuevo, por lo tanto seleccionaremos el segundo directorio. Nos aparecerán en el lado derecho todos los conjuntos de conexiones configurados en el servidor:


Para crear una nueva pulsamos en Nuevo... Nos aparecerá el primer paso de la configuracion:


En el campo nombre escribiremos el nombre que queramos darle al conjunto de conexiones y que más tarde usaremos para inicializar el DataSource.
En el Tipo de recurso seleccionaremos javax.sql.DataSource
Y por ultimo el Proveedor de la base de datos será el que vayamos a usar para nuestra aplicación web (Ej: Oracle, MySql, Postgresql, etc.)
Una vez fijados los campos, en la esquina superior derecha pincharemos en Siguiente y nos aparecerá el paso 2 para continuar con la configuración del conjunto de conexiones:

Configuración general:


Activaremos el Ping y lo demás quedará como está.

Configuración del conjunto:

Dejaremos los valores por defecto.

Transacción:
También dejaremos la configuración por defecto.

Propiedades adicionales:
El ultimo apartado nos servirá para indicar los datos de conexión con nuestra base de datos. Este paso se puede hacer de diferentes formas y funcionaría a la perfección. Os voy a contar dos alternativas:
  • Rellenar campos de la url por separado:
Para establecer una conexión con nuestra base de datos nos hacen falta tres cosas: url de la base de datos, el usuario y la contraseña. La url está compuesta por una serie de elementos (puerto, servidor, base de datos, etc.) que variarán en función de la base de datos que usemos (oracle, mysql, etc.). Si no conocemos o no sabemos como escribir la url pero si conocemos la información de la que está compuesta bastará con indicarle a GlassFish ésta información por separado.


  • Rellenar la url completa:
Si conocemos la url o sabemos como definirla, en lugar de incluir los elementos por separado podemos pulsar en agregar propiedad (en el caso de que no exista la propiedad url) y añadirla junto con los campos user y password.


Puede que GlassFish os añada propiedades adicionales a las anteriormente citadas. En principio no serían necesarias por lo que las podéis eliminar.

Una vez hecho todo esto le damos a finalizar y nos creará el conjunto de conexiones que aparecerá en la lista con todos los demás. Para comprobar si lo hemos configurado bien basta con abrirlo pinchando en el y el la pestaña General pinchamos en Sondeo. Si todo ha ido bien deberá aparecer el pensaje "Ping realizado con exito".


Recurso JDBC
Llegados a éste punto ya tenemos el DataSource creado. Ahora nos tendremos que crear un recurso JDBC para poder usarlo desde nuestra aplicación. Para ello entraremos en el menú de la parte izquierda mencionado anteriormente entraremos en Recursos JDBC.

Seleccionaremos Nuevo..


Para crear el nuevo recurso son necesarios dos simples pasos:

Primero le pondremos nombre al recurso (Nombre JNDI) con la siguiente sintaxis: jdbc/nombreDataSource
nombreDataSource tendrá que ser el del DataSource creado en el apartado anterior.

El segundo paso es indicar el nombre del conjunto de conexiones, que será el de nuestro DataSource.

El resto de campos que aparecen los dejaremos por defecto como están.


Y ya está. Ya tenemos un DataSource configurado y listo para usar en nuestras aplicaciones web con java y servlets.

*NOTA: Para poder acceder a la consola de administración previamente tendréis que haber arrancado GlassFish

jueves, 24 de febrero de 2011

Como usar MASM y debug

El Microsoft Macro Assembler (MASM) es el ensamblador de Microsoft para la familia de microprocesadores x86. Este ensamblador fue pensado para sistemas de 16 y 32 bits, no se desarrollaron dos aplicaciones separadas para estos sistemas. Más tarde se desarrollaron versiones que permitían crear aplicaciones para Windows, pero la versión que os voy a explicar yo solo sirve para MS-DOS. A nivel académico es una buena opción.
Para todo el tutorial usaré el código del programa suma.asm que muestro a continuación. Podéis bajarlo desde aquí.

Este programa suma dos vectores de hexadecimales y guarda el resultado en otro vacío.
Antes de empezar podéis descargaros el MASM aquí y descomprimir los dos archivos ejecutables (MASM.EXE y LINK.EXE) en el mismo directorio donde guardéis el código .asm.
MASM
Entramos en el directorio donde esté nuestro fichero .asm (en nuestro caso suma.asm) y el ensamblador (MASM.EXE y LINK.EXE)
Una vez ahi, procedemos a ensamblar el archivo con la herramienta MASM escribiendo en la linea de comandos masm (para nuestro ejemplo masm suma.asm)
A continuación nos pedirá el nombre del fichero .obj, por defecto se llamará igual que el fichero .asm (le damos a intro porque queremos que se llame igual)
Le volveremos a dar dos veces más a intro puesto que nos pedirá otras dos cosas que nos interesan. Si todo ha ido bien el ensamblado nos devolverá 0 errores y 0 warnings (los warnings en ensamblador también son errores por lo que no puede haber ninguno) y se generará el código .obj en el mismo directorio en el que estamos.
Una vez que hemos ensamblado hay que linkar el código .obj que se habrá generado en el paso anterior. Para ellos usaremos la herramienta LINK escribiendo en la línea de comandos link (en nuestro caso link suma.obj). Nos pedirá el nombre del archivo .exe que nos generará (por defecto nos pondrá el mismo nombre que el .obj, en nuestro caso suma.exe). Como queremos que se llame igual simplemente le damos a intro.
A continuación le volveremos a dar otras dos veces a intro puesto que nos volverá a pedir otras dos cosas que no nos interesan.
Una vez que hemos terminado el linkado se habrá generado el archivo .exe. para ejecutarlo simplemente escribimos el nombre del archivo en la línea de comandos (suma.exe). En nuestro caso no se mostrará nada por pantalla puesto que el ejemplo suma.asm solo suma vectores y no imprime nada por pantalla.
Con esto no sabemos con seguridad si ha salido todo bien o no, lo que tenemos que hacer es usar la herramienta DEBUG de MS-DOS.

DEBUG
Para comprobar si el ensamblado y linkado han salido bien utilizaremos el debuger de MS-DOS escribiendo en la línea de comandos debug (en nuestro caso: debug suma.exe). Después de darle a intro nos aparecerá un guión para que pulsemos una de las opciones del debuger.
si escribimos ? y pulsamos intro nos aparecerá el menú con todas las opciones que nos permite el debuger. Las que nos interesan son t, g y q. A continuación las veremos con más detalle.
Si elegimos t ejecutará una instrucción de nuestro código .asm mostrando el estado de todos los registros del microprocesador 8086 antes de la ejecución de la misma. Cada vez que pongamos t ejecutara una instrucción por orden mostrando el estado de los registros antes de la misma, es decir, el estado de los registros de la instrucción anterior. Es recomendable tener el código delante para asegurarnos que hace lo que queremos y darnos cuanta de lo que está mal en caso contrario.
Si queremos ejecutar más de una instrucción a la vez y ver sus registros pulsaremos t seguida de un numero (en la imagen siguiente he pulsado t3)
Si queremos terminar la ejecución de nuestro programa pulsaremos g. Esto terminará las instrucciones que quedan pero no mostrará el contenido de los registros. Si todo va bien nos mostrará un mensaje: "El programa ha terminado de forma normal"
Para salir del debuguer pulsaremos q y volveremos a la línea de comandos de MS-DOS
Como ya expliqué anteriormente podremos ejecutar nuestro programa escribiendo en la línea de comandos suma.exe

domingo, 23 de enero de 2011

Cómo se usa el paso por valor y por referencia en C

Retomando el post anterior, os voy a explicar como se usan funciones en C.
Como ya dije en el post anterior, una función se compone de dos partes (cabecera y cuerpo) que más o menos expliqué en el post anterior, pero queda aclarar un "pequeño" detalle bastante importante.

  • Parámetros formales
Como ya explique, las funciones puedes recibir parámetros en el momento de la llamada. Estos parámetros son variables de algún tipo definido en C.
Hay dos formas de pasar parámetros a una función, bien pasando el valor de la variable o bien pasando la dirección de memoria de la misma. A estas formas de pasar parametros se las conoce como paso por valor y paso por referencia respectivamente.

  • Paso por valor
En el paso por valor se pasa directamente el valor con el que queremos trabajar, en este caso solo se tendrá acceso a dicho valor y en el caso de cambiarlo dentro de la función, al terminar esta y volver al punto del programa desde donde se invocó, la variable que se pasó como parámetro no se habrá modificado.

int suma (int a, int b){
a=4;
return a+b;
}

La función suma recibe dos parámetros de tipo int y devuelve la suma de ambos, que también es un dato de tipo int (se especifica al principio de la cabecera).

void main(){
int a=2;
int b=3;
printf("%d",a); -> ¿Cuánto vale a?
printf("%d", suma(a,b)); ->¿Cuál es el resultado devuelto por suma?
printf("%d",a); -> ¿Cuánto vale a?
}

En la función main se declaran dos variables enteras a y b con valores 2 y 3 respectivamente.
En el primer printf se imprime el valor de a que, como no ha sido modificada desde su inicialización, será 2.
En la siguiente linea se imprime el valor retornado por la función suma definida antes. Si analizamos la función suma veremos que el valor de a se ha cambiado, por lo que la función devolverá 4+3 (o lo que es lo mismo, 7).
En la última linea se muestra de nuevo el valor de a pero, ¿cuál es? Dentro de la función suma se modificó el valor y esto afectó a la operación pero, una vez que la función termina y volvemos al lugar de la llamada ese cambio deja de tener efecto sobre a ya que se le pasó a suma por valor, por lo que el valor de a sigue siendo el mismo que cuando se inicializó: 2.

  • Paso por referencia
En el paso por referencia lo que recibe la función ya no es un valor, sino una dirección de memoria.
Veamos el ejemplo anterior.

int suma (int *a, int *b){
*a=4;
return *a+*b;
}

Si os fijáis, hay una pequeña variación con respecto a la función suma anterior. Ahora los parámetros tienen un *. Esto significa que son punteros (se verán con mas detalle).
Al pasar punteros las modificaciones que se realicen dentro de la función permanecerán cuando esta termine y retorne al lugar de la llamada, porque ahora lo que se está modificando no es el valor, sino el contenido de la dirección de memoria donde apunta el puntero. Pero ¿qué pasa si se quita el *?

int suma (int *a, int *b){
a=4;
return a+b;
}

Si no pusiésemos el * lo que estamos haciendo es modificar las direcciones de memoria de las variables, lo que producirá resultados inesperados. El * nos indica que accedemos al contenido de la dirección de memoria, es decir, al valor de la variable. Hay que tener mucho cuidado con esto.

void main(){
int a=2;
int b=3;
printf("%d",a); -> ¿Cuánto vale a?
printf("%d", suma(&a,&b)); ->¿Cuál es el resultado devuelto por suma?
printf("%d",a); -> ¿Cuánto vale a?
}

En la llamada a la función también hay una pequeña variación. Hay que incluir un & antes de los parámetros pasados por referencia. Al poner el & lo que estamos haciendo es pasar la dirección de memoria de la variable. De este modo la salida por pantalla será la siguiente:
En el primer printf se mostrará un 2, que es el valor de inicialización de a.
En el segundo printf se mostrará el valor retornado por la función suma: 7
El ultimo printf mostrará de nuevo el valor de a pero, en este caso, el valor habrá cambiado puesto que en la función se modificó, y al pasar a por referencia, el cambio se hace permanente, por lo tanto esa linea imprimirá un 4.

NOTA: Los arrays siempre se pasan por referencia por lo que no hay que especificarlo poniendo * y & (más adelante se explicará con más detalle).