domingo 29 de enero de 2012

El Escritorio del Lector #61

Para finalizar la semana, y como es ya una costumbre, volvemos con "El Escritorio del Lector". No me cansaré de repetir que es una sección que me ha sorprendido muy gratamente, ya que vosotr@s sois los que la hacéis seguir enviando vuestras capturas y características. Es muy gratificante que os impliquéis con el blog, así que desde aquí os agradecemos que sigáis participando y comentando.

Nuestro visitante número 61, y no por ello menos importante, es Ariel Escobar, quien muy amablemente nos envía sus especifcaciones. Ariel ha optado por Gnome Shell en detrimento de Unity, algo por lo que muchos usuarios han optado, y que como ya hemos comentado en diversas ocasiones, demuestra el poder de elección del usuario.








  • Gnome-Shell: Adwaita
  • Iconos: Gnome


Desde aquí os animo (algo que agradezco de antemano) a participar enviando vuestra captura o capturas con sus correspondientes características, como Sistema Operativo, Fondo de Escritorio, Tema de Ventanas y Tema de iconos a nosinmiubuntublog@gmail.com 

Saludos. 

miércoles 25 de enero de 2012

Cómo crear servicios web PHP

Buenas, la semana pasada vimos como instalar un servidor LAMP en nuestro Ubuntu y las herramientas necesarias para desarrollar con PHP y MySQL. Esta semana nos ponemos manos a la obra y veremos como desarrollar un pequeño servicio web para poder utilizarlo más tarde desde una aplicación Android y nutrir nuestra aplicación con datos.


Los formatos más utilizados para compartir información mediante estos servicios web son XML (y otros derivados) y JSON. XML es un lenguaje de marcas muy similar al HTML, lo podéis ver normalmente en las fuentes RSS utilizadas para difundir listas de noticias. JSON es un formato ligero de intercambio de datos. Este último da mejores resultados en cuanto a rapidez y procesamiento, por lo tanto utilizaremos este, pero si queréis utilizar XML solamente deberéis cambiar el formato de salida y listo.


Nuestro servicio va a devolvernos una lista de libros, para ellos primero crearemos una base de datos. Abrimos phpMyAdmin para ello en un navegador escribimos http://localhost/phpmyadmin. Vamos a "Base de datos" y creamos una nueva base de datos, le llamaremos android, aparecerá en la lista de la parte izquierda. Pinchamos sobre ella y creamos una nueva tabla llamada libros con 3 columnas: id_libro, libro y ISBN.




Para cada uno de los campos deberéis indicar de que tipo es, id_libro es un INT además como va a ser un identificador será PRIMARY y para que cada vez que insertemos un registro no nos tengamos que preocupar de calcular este dato marcamos la casilla AUTO INCREMENT.
Los campos libro y ISBN son de tipo texto, tenemos VARCHAR el cual debemos indicar la longitud máxima, en nuestro caso pondremos 1.000 y 50 respectivamente. Existe otro tipo de dato para texto, TEXT, ideal cuando almacenamos grandes cantidades de texto, como por ejemplo el texto HTML de este artículo.
Una vez creada la tabla la seleccionáis e insertáis 4 ó 5 registros para que luego al crear el servicio podamos comprobar como funciona.






El siguiente paso es crear nuestro servicio para ello abrimos nuestro IDE BlueFish y dentro de la ruta /var/www/ creamos una carpeta android para nuestro servicio. El servicio constará de varios archivos los cuales os iré detallando que es lo que hace cada uno. Para crear cada uno de ellos haremos botón derecho del ratón sobre nuestra carpeta android, seleccionamos archivo nuevo y le damos el nombre correspondiente.


Empezamos con globals.php, el cual va a tener parámetros de configuración, en principio para poder acceder a la base de datos. Como podéis ver he creado una clase config y las propiedades son static, es decir, no necesito crear un objeto config para poder acceder a estas. Como veis PHP soporta programación orientada a objetos, aunque si queréis podéis utilizar programación estructurada.


<?php
class config{
 public static function getBBDDServer() {
  return 'localhost';
 }
 
 public static function getBBDDName(){
  return  'android'; 
 }
 
 public static function getBBDDUser(){
  return 'root'; 
 } 
 
 public static function getBBDDPwd(){
  return 'xxxxxx'; 
 }
}
?>


El siguiente archivo será dbmanager.php, este archivo nos ayudará a gestionar la base de datos y las consultas que hagamos a ella. Lo voy a hacer lo más básico posible para no complicar mucho el ejemplo. Vuelvo a crear una clase dbmanager con el método executeQuery, al que le pasamos una consulta, esta se ejecuta y nos devuelve el resultado.

include_onde
Destacar la instrucción include_once para referenciar nuestro archivo de configuración. Existe también la instrucción include, la diferencia entre ellas es que la primera solo incluye una vez el mismo archivo, lo cual puede dar problemas si se incluye más de una vez.

Para poder utilizar las propiedades de esta clase lo hacemos con el nombre de la clase seguido de :: y el nombre de la propiedad o método.


<?php
include_once('globals.php');

class dbmanager{
 
 public function executeQuery($sql){
  $con = mysql_connect(config::getBBDDServer(), config::getBBDDUser(), config::getBBDDPwd());
  if (!$con)
    {
     die('Could not connect: ' . mysql_error());
    }
  
  mysql_select_db(config::getBBDDName(), $con);
  
  $result = mysql_query($sql);
  
  mysql_close($con);
  return $result;
 }
}
?>


El siguiente archivo es libros.php, otra vez hago los include de los archivos necesarios y creo una clase libros con dos métodos. El primero de ellos getLibros, crea un objeto dbmanager y ejecuta la consulta que hemos construido en el mismo método. Como veis es private por que lo vamos a utilizar únicamente dentro de la clase.
El segundo método getJSONLibros es publico y se encarga de obtener los datos con el método anterior y almacenar el resultado en la variable $result, luego la recorre y construye la estructura JSON con cada uno de sus items, y por ultimo devuelve la variable $json.



Variables PHP
Como veis las variables en PHP se declaran con un $ siempre delante y para utilizar metodos de un objeto que hemos instanciado sería clase->metodo. Si el método está en la misma clase seria $this->metodo.



<?php
include_once('globals.php');
include_once('dbmanager.php');

class libros{

      private function getLibros(){
 $sql = "SELECT l.* ";
 $sql .= " FROM libros AS l ";
 $db = new dbmanager();
 return $db->executeQuery($sql);
     }

     public function getJSONLibros(){
        $json = "";
 $i = 0; 
 $result = $this->getLibros();
 $json .= " { \"libros\" : [ ";

 while($row = mysql_fetch_array($result)){
    if($i > 0)
     $json .= ",";
 
    $json .= " { \"id\" : ".$row['id_libro'].", \"libro\": \"".$row['libro']."\", \"isbn\": \"".$row['isbn']."\ ";    
    $json .= "} ";   
    $i++;
   }  
  
 $json .= " ] ";
   $json .= " } ";  
   return $json; 
    }
}


El último archivo es al que llamaremos para obtener el resultado de nuestro servicio, lo llamaremos service.libros.php. Este archivo es muy simple, únicamente se hace el include necesario, instancia la clase libros e imprimimos el resultado del método getJSONLibros.


<?php
include_once('libros.php');

$libros = new libros();
echo $libros->getJSONLibros();
?>


Por último probamos en el navegador este servicio con la url http://localhost/android/service.libros.php. Debería aparecer el JSON correspondiente, si queréis comprobar que está todo correcto podéis hacerlo en alguna de las webs que lo hacen online, http://jsonlint.com/ por ejemplo.

Ahora ya tenemos listo nuestro servicio listo para poder leerlo con cualquier cliente, en nuestro caso haremos un cliente en Android la semana que viene que lea este JSON y nos lo muestre.

martes 24 de enero de 2012

Nuestras amigas las direcciones IP

Tras haber terminado con éxito el servidor DNS. Comenzamos una nueva serie de artículos, con la finalidad de instalar un servidor DHCP. Pero para poder conseguir esto, primero debemos tener unos conceptos previos. Un servidor DHCP sirve para asignar de manera automática las IPs. En el siguiente artículo entraremos en detalle en los DHCP. Hoy nos tocan las direcciones IP.


¿Qué significa IP y para qué sirve?

IP son las siglas inglesas de Internet Protocol, lo cual significa que es el protocolo que sigue Internet para realizar sus comunicaciones, y en general la mayor parte de las redes informáticas del mundo.

Este protocolo se basa en asignar a cada elemento de la red (ordenador, router, impresora de red, móvil, página web...) una dirección IP compuesta por una serie de números y puntos, y así que el dispositivo esté localizable en la red.

Hoy en día existe una mejora de la IPv4 (la más común a día de hoy), que es la IPv6, que permite tener muchos más dispositivos, y además se agotaron las IPv4 públicas. Nos centraremos en la IPv4 porque es la que nos interesa para los posteriores artículos.

Dirección IP

La direcciónIPv4 (A partir de ahora simplemente IP), es básicamente un número binario formado por 32 bits (32 unos y ceros seguidos) que identifica de forma lógica y estructurada un dispositivo o interfaz en una red de tipo TCP/IP. Se divide en 4 octetos de código binario separados por puntos.

Una dirección IP está dividida en dos, una parte que identifica a la red a la cual está conectada, y la otra identifica el dispositivo de ésa red a la cual pertenece.

Ejemplo:


192.168.0.100
RED   11000000 . 10101000 . 00000000. 01100100 HOST


Esta dirección IP, por sí sola, no nos dice nada. Pero cuando terminéis este artículo, comprenderéis que la parte "192.168.0" identifica a la red, y el resto "100" indica que es el dispositivo 100 de la red 192.168.0. Ahora veremos porqué.

Tipos

La finalidad de este protocolo es identificar y diferenciar unos dispositivos de otros y además unas redes de otras.

  • Por ello existen varias clases de IP:

Clase A: El primer octeto identifica la red, y los otros tres, el dispositivo. Este tipo de red se utiliza para poder tener muchos dispositivos por red.

En este caso permite por cada red (primer octeto), más de 16 millones de dispositivos, pero sólo 128 redes diferentes.

Se diferencian de una manera básica, estas redes tienen un rango del primer octeto de 10.X.X.X hasta 126.X.X.X.

Clase B: Los dos primeros octetos identifican la red, y los otros 2 los dispositivos. Es un tipo de red equilibrada, permite bastantes redes (16.384), y bastantes host o dispositivos (65.534) por cada red.

Sus rangos son desde: 128.0.X.X hasta 191.255.X.X.

Clase C: Los tres primeros octetos identifican la red, y el último identifica el host. Permite más de dos millones de redes y 254 host por cada red.

El rango para reconocerla es desde 192.0.0.X hasta 223.255.255.X

  • También se pueden clasificar en públicas o privadas.

Las IP públicas, son las que se venden para poder tener una página web, un servidor o cualquier dispositivo accesible en la red de redes (Internet).

También son las que usamos para que tengamos acceso a Internet, cada proveedor (ISP) de internet nos proporciona una.

Las IP privadas, son las que no son públicas, y se utilizan para crear redes locales, para que no creen conflictos con las públicas. Estas están reservadas por clases:

Clase A: 10.0.0.0 hasta 10.255.255.255
Clase B: 172.16.0.0 hasta 172.31.255.255
Clase C: 192.168.0.0 hasta 192.168.255.255


  • Las direcciones IP se pueden clasificar según su configuración.
IP fija
Nosotros decidimos nuestra IP (local), definiéndola en la configuración del sistema operativo. En lo referente a Ubuntu podemos cambiarla siguiendo un artículo de mi compañero.

IP dinámica
Un router o un servidor de DHCP asigna una IP  a cualquier dispositivo que se conecte a la red. Éste envía unos paquetes por la red y el servidor DHCP le responde con la IP que debe tomar.


Máscaras de Subred

Las máscaras de subred sirven para dividir la parte de red en una dirección IP de la de host. Son también una serie de 32 bits separados en octetos. Pero la diferencia es que la parte de red la indican los unos, y la parte de host la indican los ceros.

Ejemplo

Dirección IP:

Clase C:

192.168.0.100

11000000 . 10101000 . 00000000. 01100100
 
Máscara de subred:

255.255.255.0

11111111 . 11111111 . 11111111. 00000000 

También puedes crear subredes cambiando la máscara, indicando hasta dónde es la parte de red, y dónde es el host.

Y hasta aquí este simple artículo sobre las direcciones IP. Espero que os ayude a entender el entramado de las redes informáticas. Cualquier duda, escribirla en los comentarios e intentaré ayudaros.

Un saludo.
Licencia de Creative Commons