Archive for 22 junio 2009

HowTo: Explorar un equipo remoto por medio de ssh y nautilus (sftp)

Una de las funcionalidades más interesantes del escritorio gnome es sin duda el gvfs (gnome virtual file system – Sistema virtual de archivos de gnome) por medio del cual podemos explorar gráficamente distintos equipos remotos de una forma simple y como si fuera local.

Para realizar la exploración es necesario conectarnos a estos equipos remotos mediante algún protocolo como smb (samba – comparticiones de windows), ftp, webdav, sftp (secure ftp) entre otros.

En esta ocasión veremos el caso de sftp que nos permite conectarnos a un equipo que tenga instalado el openssh y esté corriendo el servidor del mismo, esto nos permite explorar todo el contenido al que tenga acceso el usuario (del equipo remoto) con el que nos conectemos.

Para comenzar necesitamos tener instalados algunos paquetes:

Del lado del equipo remoto:


  sudo apt-get install openssh-server
 

Del lado del equipo cliente:


  sudo apt-get install sshfs openssh-client
 

Ya que tenemos estos paquetes instalados abrimos el nautilus en su modo de navegador y damos click en el botón de cambiar la barra de dirección entre botones y texto para que podamos escribir la dirección a la que queremos llegar.


Una vez que tenemos la barra de dirección editable escribimos la linea de conexión de esta forma:


  ssh://<ip>/<carpeta o direccion en el equipo remoto>
 

Tambien podemos agregar el usuario a la linea de conexión de esta forma:


  ssh://<usuario>@<ip>/<carpeta o direccion en el equipo remoto>
 

Despues damos enter y nos aparecerá una ventana en la que nos pedirá el nombre de usuario (si no lo incluimos en la linea de conexion) y contraseña y en donde podemos elejir una opción para manejar las identidades y al dar click ok.



Si los datos son correctos nautilus mostrara los archivos de la carpeta a la que nos acabamos de conectar..


En algunos casos puede aparecer un error que indica que nautilus no sabe como manejar el protocolo sftp pero puede ser un simple error del nautilus que no afecte la conexión. La forma de comprobar esto es observar los elementos de la barra lateral ya que, si se encuentra conectado, debe aparecer un elemento con la leyenda “sftp” como este:



También se puede observar el icono de la conexión en el escritorio.

Algo interesante de gvfs es q te deja hacer uso de los archivos de forma casi local, es decir, si queremos editar un archivo simplemente le damos doble click y este se abrirá y me dejara editarlo y al guardar los datos se guardaran en el equipo remoto. También podemos reproducir vídeo y audio sin mayor problema y sin necesidad de copiar el archivo a nuestro equipo.

Una vez que se a terminado de usar la conexión esta puede ser cerrada dando click al icono de “eject” que esta en la barra lateral a un lado de la carpeta montada:

Para cerrar la conexión también se puede dar click derecho a la carpeta que aparece en el escritorio y seleccionar la opción desmontar

Una vez que el elemento desaparezca de la barra lateral la conexión abra quedado cerrada.

Nota Extra:

Las conexiones establecidas quedan montadas en una carpeta con el nombre de la conexión y se crea dentro de una carpeta llamada .gvfs que esta en el directorio del usuario que hizo la conexión.

Espero que sea útil esta información.

Anuncios

HowTo: Realizar consultas a una base de datos sqlite desde java.

Sqlite no es un gestor de bases de datos como MySql, Oracle o PostgreSql sino que, es una librería que permite tener una base de datos transaccional en un archivo sin necesidad de un servidor o configuración alguna lo cual puede llegar a ser muy útil para cierto tipo de proyectos que no requieran un servidor dedicado de base de datos.

Para poder utilizar este tipo de bases de datos como nuestra capa de persistencia en java todo lo que necesitamos es la librería (jar) o “driver” que puede ser descargado desde aquí.

Una vez descargada la librería de sqlite para java, podemos agregarlo a nuestro buildpath si es que estamos usando una IDE como eclipse o netbeans o agregarlo al classpath al momento de compilar la aplicación.

Para realizar la conexión únicamente necesitamos agregar las siguientes lineas:


  Class.forName("org.sqlite.JDBC");
  Connection conn = DriverManager.getConnection("jdbc:sqlite:sqliteFile");
 
  • La primera linea se encarga de cargar la clase de la librería sqlite.
  • La segunda linea crea una conexión a la base de datos auto contenida (archivo).
  • “sqliteFile” es la ruta completa del archivo (ej. /opt/base1.sqlite) que contiene o contendrá la base de datos, si el archivo no existe sera creado eh inicializado y si ya existe sera usado.

Una vez creada la conexión podemos usarla para acceder a la base de datos.


  PreparedStatement ps = null;
  ps = conn.prepareStatement("insert into tabla1 values (?);");
  ps.setInt(1,10);
  ps.execute();
  ps.close();
 

Hay que tomar en cuenta que por el carácter de este tipo de bases de datos no se puede escribir cuando se tiene un flujo de lectura abierto o leer cuando se tiene un flujo de escritura abierto, es decir, al realizar una transacción en la base de datos esta se bloquea hasta que la transacción se cierra por lo que es muy importante cerrar dicha transacción tan pronto como sea posible.
Se recomienda hacer uso de los prepared statements y de los batch y realizar todas las transacciones de una sola vez.


  PreparedStatement ps = null;
  ps = conn.prepareStatement("insert into tabla1 values (?);");
  for(int i=0; i < 20 ; i++){
    ps.setInt(1,i);
    ps.addBatch();
  }
  conn.setAutoCommit(false);
  ps.executeBatch();
  conn.commit()
  ps.close();
 

Tambien hay que recordar cerrar los ResultSet en cuanto se terminen de usar.


  PreparedStatement ps = conn.prepareStatement("SELECT * FROM tabla1");
  ResultSet rs = ps.executeQuery();
  while(rs.next()){
    System.out.println(rs.getString(1));
  }
  rs.close();
 

Para finalizar dejare el codigo de un ejemplo completo:


/** @author cool2k
* fecha 05/JUN/2009
*
* Ejemplo para crear una base de datos con la libreria sqlite y crear algunas entradas.
*
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class sqlite {

private sqlite(){}

/**
*
* @param args
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:/tmp/db1.sqlite");
PreparedStatement ps = null;

conn.prepareStatement("create table tabla1(id,nombre,apellido,telefono)").execute();
conn.prepareStatement("create table tabla2(id,usuario,password,email)").execute();

conn.setAutoCommit(false);

ps = conn.prepareStatement("insert into tabla1 values(?,?,?,?)");
ps.setInt(1, 1);
ps.setString(2, "Juan");
ps.setString(3, "Perez");
ps.setString(4, "55123456");
ps.addBatch();
ps.setInt(1, 2);
ps.setString(2, "José");
ps.setString(3, "Peres");
ps.setString(4, "55345612");
ps.addBatch();
ps.setInt(1, 3);
ps.setString(2, "Ana");
ps.setString(3, "Perez");
ps.setString(4, "55561234");
ps.addBatch();
ps.executeBatch();
conn.commit();
ps.close();

ps = conn.prepareStatement("insert into tabla2 values(?,?,?,?)");
ps.setInt(1, 1);
ps.setString(2, "jperez");
ps.setString(3, "mypass");
ps.setString(4, "j.perez@correo.com");
ps.addBatch();
ps.setInt(1, 2);
ps.setString(2, "joperes");
ps.setString(3, "mypass2");
ps.setString(4, "jose.peres@correo.com");
ps.addBatch();
ps.setInt(1, 3);
ps.setString(2, "aperez");
ps.setString(3, "mypass3");
ps.setString(4, "ana@correo.com");
ps.addBatch();
ps.executeBatch();
conn.commit();
ps.close();

conn.close();

}
}
 

Espero que esta entrada les sea de ayuda.
Saludos !!