jueves, 15 de noviembre de 2012

Conexión lenta Ubuntu y el DNS

No se si os ha ocurrido, pero en ocasiones el operador que nos da servicio a Internet nos da unas IPs de servidores DNS que en ocasiones no todas funcionan (por eso nos dan varios). Si al configurar la red se colocan primero en orden servidores que están caídos el navegador y cualquier aplicación o servicio que use el DNS van a tardar mucho en hacer la conexión ya quehace las peticiones por orden.

La solución es muy simple, llega con cambiar el orden de los servidores y listo.
También se puede ser un poco más metódico.

Veámoslo con un ejemplo:

Tenemos una conexión con los servidores dns 213.60.205.75 y 213.60.205.174 (colocados en ese orden) y la conexión nos va lenta. Lo primero es ejecutar un ping para saber si funciona o no el servidor:

ping 213.60.205.174
ping 213.60.205.75

Si resulta que el  213.60.205.75 está caído no nos va a responder al ping. En ese caso llega con cambiar el orden y poner 213.60.205.174 primero y 213.60.205.75 después (o eliminar este último).




jueves, 21 de junio de 2012

Programación en Java: Conceptos básicos de programación y estructura de un programa en Java


Programa (o Algoritmo): Serie de operaciones detalladas y no ambiguas, a ejecutar paso a paso, y que conducen a la resolución de un problema.
Hay diversas formas de realizar un algoritmo. Simplemente hay que definirlo de forma no ambigua.


Dato: Información que procesa un algoritmo (y por tanto un futuro programa).


Tipo de dato: Tipo de información que se maneja. Es un concepto muy importante y que hay que ir teniendo muy claro al desarrollar programas.
Cuando se trabaja con un dato, hay que saber si dicho dato es un número entero, un número real, un carácter, una frase (una lista de caracteres), un valor lógico, etc... ya que el ordenador usa distintas formas para guardar distintos tipos de datos.


Variable: Es un elemento que contiene un dato y su valor puede variar a lo largo del programa. Internamente en el ordenador es una zona de memoria reservada donde se guarda un dato de determinado tipo y cuyo valor cambia a lo largo de la ejecución.
Atributos:
  • Nombre o identificador: Lo que la designa
  • Tipo de dato: El tipo de información que puede manejar esa variable.
Se utilizarán para recoger datos, para manejar datos internos variables y para devolver datos.


Constantes: Elemento de valor invariable y de un tipo determinado. También se les denomina Literales. Al igual que una variable internamente en el ordenado ocupa una región de memoria pero su contenido no varía, esto permite un uso más eficiente en determinadas circunstancias.
Ejemplos:
  • Entera: -3 , 5, 17
  • Real: 6x108 (se verá como 6e8), 5.34
  • Carácter : 'A'
  • Cadena de caracteres (String): “Hola”


Expresiones: Combinaciones de variables, constantes símbolos de operación, paréntesis y nombres de funciones especiales.
Ejemplo:
m(n+5) –cos(p)


Veamos la estructura de un programa en Java con un nuevo ejemplo ligeramente más amplio que el primero.
import java.util.Scanner;

public class Hola2 {
   public static void main (String args[]) {
      // Declaración de variables
      String nombre;
      Scanner sc= new Scanner(System.in);
      // Código
      System.out.print("Dime tu nombre: ");
      nombre=sc.nextLine();
      System.out.println(nombre+", Welcome to the Java World");
      System.out.println("Nos vemos");
   }
}

Antes de explicar las distintas líneas veamos unos aspectos generales:
  • Cada sentencia acaba en ; ya que es el indicador de fin de sentencia. Puedo escribir una sentencia en varias líneas como hicimos en el ejemplo de GUI ya que lo que marca el final es el ;
  • Las llaves {} marcan inicio y fin de bloque. Cuando hay una serie de comandos o sentencias que queremos meter dentro de un bloque los meteremos entre estos símbolos.
  • La identación o tabulación es esencial en el mundo de la programación. Sirve para entender que comandos están dentro de que bloques de forma clara.


Los elementos que nos encontramos a lo largo de cualquier programa son:
  • Palabras reservadas: Son palabras que pertenecen al lenguaje Java y por tanto no pueden ser usadas por nosotros para nombrar variables. La lista completa es:
    abstract default if private this
    boolean do implements protected throw
    break double import public throws
    byte else instanceof return transient
    case extends int short try
    catch final interface static void
    char finally long strictfp volatile
    class float native super while
    const for new switch
    continue goto package synchronized
  • Identificadores: Son palabras que crea el programador para dar diferentes nombres a elementos como las variables, las clases, funciones, etc... Hay algunas limitaciones para poner nombres:
    • Se usan sólo letras, números, y los símbolos _ y $
    • No puede, por tanto, contener espacios.
    • No puede empezar por número.
    • Se distingue entre mayúsculas y minúsculas .
    • No se pueden usar palabras reservadas (class, import, etc...)
    De cara a la claridad de programación, vamos además a usar algunas reglas en cuanto a la creación de nombres de identificadores: Las clases siempre empezarán por mayúsculas y las variables por minúsculas. Si una clase o variable es una palabra compuesta, las siguientes palabras se escribirán comenzándolas en mayúscula: Clase SistemaOperativo, variable datoTransferido.
  • Comentarios: Son líneas de código que no afecta al funcionamiento del programa. No se compilan. Por tanto son usadas para aclarar ciertas partes del código que tienen un funcionamiento especial o para documentar de forma técnica el programa. Existen tres tiops de comentarios en java:
    • Comentario de línea: Comienza donde se escriba // hasta el fin de la línea.
    • Comentario multilínea: Comienza con /* y acaba con */ en la misma línea o en otra.
    • Comentario de documentación: el SDK de Java incorpora un programa denominado javadoc que facilita la creación de documentación técnica y cuyo funcionamiento veremos en otra asignatura. Los comentarios detectados por javadoc comienzan por /** y acaban por */.
  • Constantes o literales: Datos explícitos como 3, “hola”, '$' ó -78.23


Teniendo en cuenta estos puntos anteriores vamos a explicar de forma aproximada el funcionamiento del programa anterior:

Importación
Lo primero que encontramos en un programa en Java son las líneas de importación. En estas líneas se indican los paquetes (packages) donde existen clases de Java que podemos necesitar y ya están programados. Una clase podemos verla como un contenedor. Por tanto todos los comandos de Java (salvo las instrucciones más básicas) aparecerán dentro de clases que a su vez se guardan en pquetes.
En este caso se importa la clase Scanner que vamos a usar para pedir datos al usuario. Esa clase se encuentra en el paquete util que a su vez está en el paquete genérico java. Ese es el significado de java.util.Scanner.
Puede haber varias líneas de importación para usar varias clases, pero en el caso de usar diversas clases que están en un paquete puede usarse el comodín *. Es decir, si en un programa tenemos que importar clases de esta manera:
import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.IOException;

podría ser más cómodo escribirlo en una única línea así:
import java.io.*;

Ese * indica “todas las clases del paquete io que está en java”. Los puristas dicen que es mejor escribir sólo las clases que se van a usar por claridad, pero realmente no se pierde eficiencia y sí tiempo escribiendo.


La clase principal.
public class Hola2 {
}

Tras la zona de importación en el archivo viene la clase principal. Como ya se comentó una clase la veremos por el momento como un contenedor de elementos y ya veremos definiciones más precisas y correctas. Nos quedamos con la idea de que todo el código que vamos a meter hay que hacerlo dentro de la clase.
Una clase comienza por la palabra class y a continuación se le da el nombre deseado. Ya comentamos también que por claridad y estandarización vamos a nombrar las clases comenzando por letra mayúscula.
Todo lo que va dentro de la clase se mete entre llaves.
En un archivo se pueden meter varias clases pero por ahora meteremos sólo una que sirva para contener nuestros programas. Además el archivo ha de tener el mismo nombre que dicha clase (conservando mayúsculas y minúsculas) y precediendo a la palabra class irá le modificador public que indica que “cualquiera” puede acceder a la clase. Entenderemos mejor esto último en el tema de orientación a objetos.



Programa principal (función principal).
public static void main (String args[]) {
}

Un apartado denominado por la palabra reservada main (principal) y precedido por las palabras reservadas public, static y void es el bloque donde meteremos las sentencias ejecutables que conformarán nuestro programa al menos al principio.
A este apartado se le denominará también función o método principal o función o método main.
En general una función o método es una zona del programa que contiene comandos ejecutables y que puede ser invocada desde otras partes del programa o sistema. Crearemos más adelante otros métodos distintos del principal.
El elemento especificado entre paréntesis (String args[]) no lo tendremos en cuenta al menos por el momento.
Cuando se construye un programa Java hay que indicar las variables que se van a usar y el tipo de dato que son. Realmente se puede hacer en cualquier parte de la función pero por claridad conviene separar la zona de declaración de variables (se puede poner al principio) del resto del código.
Vamos a ver dos grandes bloques de variables, por un lado las básicas que simplemente hay que declarar su nombre y el tipo de dato que contendrán:
String nombre; //Variable que guarda una cadena de caracteres
int numero; // Variable que guarda un valor entero

y los objetos o variables referenciadas que, sin entrar en detalle, son “variables” para las cuales hay que reservar memoria y por tanto se declaran e inicializan en la misma línea.
Scanner sc = new Scanner(System.in);

aunque podría hacerse en líneas distintas (una de declaración y otra de reserva de memoria):
Scanner sc;
sc = new Scanner(System.in);

En este caso se inicializa la variable sc que es el objeto que representa al teclado (System.in) y va a servir para pedirle datos al usuario.
La diferencia entre las simples y las referenciadas es que las simples básicamente manejan un valor único y las referenciadas son complejas en cuanto a que pueden guardar varios valores e incluso contener código ejecutable asociado a la variable (son los denominados objetos).


Finalmente describimos brevemente cada línea de código:
System.out.print("Dime tu nombre: ");

Muestra una frase en pantalla pero no pasa a la línea siguiente.
nombre=sc.nextLine();

Se queda esperando a que el usuario introduzca una cadena de caracteres y una vez que el usuario pulsa enter introduce el dato en la variable nombre.
System.out.println(nombre+", Welcome to de Java World");

Muestra en pantalla el contenido de la variable nombre seguido del texto , Welcome to de Java World sin las comillas. La operación + con cadenas de caracteres se denomina concatenación (coloca una cadena detrás de otra). Además una vez que termina de escribir pasa a la línea siguiente.
System.out.println("Nos vemos");

Muestra otra frase en pantalla y pasa a la línea siguiente.
Nota: si leéis algún documento en la que se explique una versión de Java anterior a la 1.5 la introducción de datos se realizaba con otro objeto de la siguiente manera:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
nombre=br.readLine();
Además había que hacer el denominado control de excepciones que veremos más adelante pero que aumenta la complejidad de la entrada de datos.


sábado, 19 de mayo de 2012

Programación en Java: Creando, compilando y ejecutando un programa en Java


Una vez que tenemos el equipo preparado vamos a realizar nuestro primer programa en Java. Este simplemente mostrará una frase en la consola. Abre un editor de texto cualquiera, por ejemplo el gedit y escribe el siguiente código.

public class Hola {
   public static void main (String args[]){
      System.out.println("Welcome to de Java World");
   }
}

Guarda el programa con el nombre
Hola.java
ya que es imprescindible que el nombre del archivo coincida con el nombre de la clase (class indicará por ahora el nombre del programa aunque ya se verá en un futuro tema la utilidad de dicho concepto), si no nos dará un error al compilar. Este es un requisito de Java. La clase pública (en la mayoría de los casos la única clase en el archivo) tendrá el mismo nombre que el archivo.
Abre ahora un terminal y vete al directorio donde hayas grabado el código. Suponiendo que está en el directorio programas usa el comando cd de la siguiente manera.
nombre@equipo:~$ cd programas

A partir de ahora pondré solo el $ para indicar entrada de línea de comando.
Si ahora escribes el siguiente comando:
$ ls

o
$ ls -lh

verás los archivos que hay en la carpeta programas. En el segundo caso hay más información: permisos, propietario, tamaño, fecha,...
Tiene que aparecer, por supuesto, Hola.java.
Nota: En el caso de Windows el comando para cambiar de directorio también es cd y el de listar los archivos del directorio es dir.
Bien, a continuación vamos a compilar el código Java a un lenguaje (bytecodes) que comprenda la máquina virtual. Para ello ejecutamos:
$ javac Hola.java

Si hay algún error saldrá ahora algún tipo de mensaje. Los errores más típicos son el escribir una letra minúscula en mayúscula o viceversa, olvidarse de un punto y coma o de una llave o escribir mal un comando. Si no ha habido problema ejecutemos el comando ls y se puede ver que ha aparecido un nuevo archivo denominado Hola.class. Ese es el programa que puede ejecutar la JVM. Para ello:
$ java Hola

Se puede observar que no es necesario escribir el .class. Como resultado aparece la frase que hemos puesto entre comillas en el comando System.out.println() de Java. Efectivamente mediante dicho comando sacaremos mensajes de distinto tipo a la consola.
En general compilar implica traducir el código fuente (Java, Pascal, C, …) al código máquina (binario) que entiende la máquina en la que se ejecutará. En el caso de Java esa máquina es virtual, es decir, es un emulador de una máquina pero también tiene su propio juego de instrucciones en binario. Se profundizará en esto en otro módulo.
Finalmente vamos a realizar todo esto pero de una forma más cómoda. Vamos a usar un editor especializado en programación que viene a ser un paso intermedio entre la forma anterior de programar (es decir, escribir código por un lado y compilar y ejecutar por otro) y un Entorno de Desarrollo (IDE) completo que veremos más adelante. El editor que usaremos se denomina Geany el cual permite compilar y ejecutar los programas en distintos lenguajes.
  1. En el menú de Aplicaciones → Programación está el Geany.
  2. Abre el programa Hola.java en el menú File.
  3. En la parte superior están los iconos de compilar y ejecutar.
  4. En la parte inferior hay zona de mensajes de compilación.
Prueba a compilar, a ejecutar e incluso a forzar algún error.


Veamos ahora un ejemplo de lo que sería una aplicación gráfica en java. En un nuevo archivo escribe el siguiente código:
import javax.swing.*;

public class HolaWin{
  public static void main(String[] args){
    JOptionPane.showMessageDialog(null,
      "Welcome to the Java World",
      "Usando Swing",
      JOptionPane.INFORMATION_MESSAGE);
  }
}

En futuros temas entenderemos el significado de todo lo aquí expuesto.


Error 0x80020025 en Mac OS X Lion

Por si a alguno le ha sucedido que cuando va a grabar un CD/DVD le sale un error  con código 0x80020025 que viene a significar que no reconoce el disco, lo que sucede es que por algún motivo (sospecho del Parallels pero no lo tengo confirmado) se bloquea la unidad de grabación. La solución es reiniciar el Finder (botón derecho en el icono) o reiniciar la sesión.
Personalmente me ocurrió que luego el directorio de grabación estaba bloqueado. Esto se soluciona a su vez tomando el archivo que representa a dicho directorio (extensión fpbf) y con el botón derecho, obtener información y se desmarca la casilla de Bloqueado.