Entradas con el tag ‘tutorial’

Como hacer una calculadora simple en Android (I)

jueves 21 de junio de 2012

En estas dos entradas vamos a crear una primera aplicación en Android, consistente en una calculadora que únicamente procese números enteros. La idea es manejar el TableLayout y los listeners.

Creando el proyecto

Para empezar desde Eclipse, seleccionamos File/New/Android Project… Le damos como nombre de proyecto Calculadora, elegimos una de las plataformas que tenemos instaladas y en la última ventana elegimos el nombre del paquete al que pertenece la aplicación. Este nombre es importante, ya que será el nombre completo con el que la aplicación será conocida, y podría entrar en conflicto con otras aplicaciones si el nombre se repitiera. En este caso ponemos: edu.uhuru.moviles.android.Calculadora

Creando el layout

Vamos al fichero main.xml que está dentro de la carpeta res. En ese fichero se define el diseño de la actividad principal (y única en nuestro caso). Desde el diseñador gráfico incluímos un TableLayout.

Nota: en muchas ocasiones puede ser interesante insertar los layouts en la ventana de Outline, que muestra el árbol de recursos de la Activity

Los layouts son los elementos invisibles pensando para controlar la distribución, posición y dimensiones de los controles que van en su interior. Hay varios disponibles, pero en este nos decidimos por un TableLayout, que organiza a sus hijos en forma de tabla. Se compone de elementos TableRow (filas). Cada fila puede contener cero o mas celdas. El ancho de la columna viene normalmente definido por el ancho de la celda más ancha, aunque siempre es posible aplicar algún atributo para jugar con el tamaño de las columnas.

Por defecto se nos crean 4 filas, así que añadimos una más simplemente arrastrando desde la paleta de controles una TableRow. Una vez añadida, procedemos a ir incorporando a cada fila los distintos recursos:

  1. Fila 1: 1 EditText
  2. Fila 2: 4 Buttons
  3. Fila 3: 4 Buttons
  4. Fila 4: 4 Buttons
  5. Fila 5: 4 Buttons

El siguiente problema es como hacer «crecer» el EditText para que ocupe las 4 columnas. Para ello utilizamos la propiedad  layout_span=»4″, que al igual que en HTML, nos expande la columna para que ocupe 4 columnas. Para colocar estas propiedades es casi más recomendable (y rápido) dejar el editor visual y trabajar directamente sobre el HTML:

<EditText  android:id="@+id/editTextos" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_span="4" />

A continuación hay que ajustar los botones, para que se repartan de manera equitativa por todo el ancho de la actividad. Para ello utilizamos la propiedad android:stretchColumns=»*», que indica que columnas (en nuestro caso todas, *) pueden expandirse para absorver el espacio libre dejado por las demás columnas a la derecha de la pantalla. De esta forma, los botones aparecerán ya compensados. O al menos aparentemente. El problema vendría si alguno de los botones tuviera más de un caracter (por ejemplo si pusiéramos  +/- , MR …). En ese caso, todos los botones de la columna de ese botón aumentaría su ancho. El problema se soluciona de una manera simple mediante  el uso de la propiedad  android:layout_weight=»1″.

Esta propiedad indica el peso relativo que ha de tener ese recursos con sus hermanos. Por ejemplo, si a 3 de los botones les pusieramos android:layout_weight=»1″ y al cuarto android:layout_weight=»2″, este último sería el doble de ancho que el primero. Como en nuestro caso queremos tener todos del mismo ancho indicamos android:layout_weight=»1″.

Por otra parte, necesitamos indicar al renderizador que el ancho de los botones no ha de ir en función de su tamaño «natural» (cuanto más texto tenga dentro, más grande). Por ello cambiaremos el ancho de wrap_content a 0dip. Juntando cada una de estas dos opciones en uno de los botones (por ejemplo el 7) quedaría:

<Button android:id="@+id/button7"
         android:layout_width="0dip"
         android:layout_height="wrap_content"
         android:text="7"
         android:layout_weight="1" />

Por último, para darle los últimos detalles estéticos, vamos a justificar el texto del EditText a la derecha, a no permitir la edición y a ocultar el cursor. Para ello, modificamos el EditText añadiendo:

<EditText  android:id="@+id/editTextos" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_span="4" 
            android:editable="false"
            android:gravity="right"
            android:cursorVisible="false" />

 

Configuración y uso de rsync contra un Ubuntu Server

martes 3 de enero de 2012

rsync es una aplicación que se puede encontrar en vuestros sistemas Linux, MacOS o  Windows y que permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos carpetas de una misma máquina. Su uso es sencillo y es ideal para mantener al día copias de elementos utilizados por varias personas,  hacer copias de seguridad de nuestros datos de manera rápida y segura o mantener actualizada nuestra página web.
Puede funcionar de dos maneras:

  1. Instalando un daemon (un servicio) en nuestro servidor (donde tenemos los elementos a sincronizar) al cual accederemos mediante el protocolo rsync.
  2. Mediante un terminar remoto como SSH

Caso 1.El objetivo es instalar un daemon en nuestro servidor que atienda las peticiones de sincronización. Para ello los pasos a seguir son:

1.a) Instalar rsync. En general viene instalado de serie, y más en una versión server de Ubuntu, pero si no fuera así simplemente instálalo con Synaptic o mediante:

sudo apt-get install rsync

1.b) Hay que crear el fichero de configuración del daemon «/etc/rsyncd.conf». En él definimos las caracterísiticas generales de la conexión, así como las de cada uno de los módulos o,  para definirlo mejor, las posibles ubicaciones de sincronización. El fichero tendrá una forma similar a esta

max connections = 2
log file = /var/log/rsync.log
timeout = 300

    [nombremodulo1]
    comment = Carpeta de documentos personales sobre Linux
    path = /carpeta/sobre/la/que/sincronizo/los/documentos/personales
    read only = yes
    list = yes
    uid = usuario1
    gid = usuario1  
    auth users = usuario1
    secrets file = /etc/rsyncd.secrets

    [nombremodulo2]
    comment = Carpeta de documentos Uhuru
    path = /carpeta/sobre/la/que/sincronizo/los/documentos/uhuru
    read only = yes   
    list = yes   
    uid = nobody
    gid = nogroup   
    auth users = usuario1 usuario2
    secrets file = /etc/rsyncd.secrets

Al principio del fichero se definen aquellas características generales de la conexión. En este caso aparecen el número de conexiones simultáneas, donde se va a ubicar el fichero log y el tiempo máximo de espera. En esta parte es posible indicar también algunas de las características que aparecen en los módulos para que todos ellos la hereden (salvo que se redefinan dentro de uno en concreto). Por ejemplo, en el código anterior, podríamos haber escrito en las características generales la configuración de secrets file o la opción list, ya que su valor es común para todos los módulos.

A continuación aparecen la definición y características del módulo. Los elementos más importantes son:

  • comment: un comentario sobre que se sincroniza con ese módulo.
  • path: el camino completo de la ubicación.
  • uid: nombre del usuario con el que rsync realizar las acciones.
  • gid: grupo con el que rsync realizará las acciones.
  • auth users: usuarios a los que se les está permitido la sincronización. Estos usuario en principio no tiene porque coincidir con ningún usuario del sistema.
  • secrets file: lo vemos en el apartado siguiente.

1.c)  Crear el fichero «/etc/.rsyncd.secrets». Este fichero almacena parejas usuario:contraseña, que hacen relación a los usuarios definidos en el fichero «/etc/rsyncd.conf». En nuestro caso podría ser algo como esto:

usuario1:mipassword1
usuario2:mipassword2

Obviamente este fichero, al ser texto plano,  ha de ser protegido contra «mirones», ya que en caso contrario nuestras contraseñas quedan fácilmente accesibles. Es más rsync ni siquiera funcionará si no asignamos unos permisos adecuados a este fichero. Para ello:

sudo chmod 600 /etc/rsyncd.secrets

Es decir, el propietario debe ser el root y sólo puede ser leído por él.

1.d) Una vez configurado, sólo nos queda arrancarlo. Para ello lo mejor es utilizar xinetd, otro de los demonios que podemos encontrar en linux y que permite gestionar las conexiones de otros demonios bajo demanda.

Para ello lo primero es instalarlo (si es que no lo tienes aún):

sudo apt-get install xinetd

1.e) Configurar xinetd. Si no existe crea el fichero «/etc/xinetd.d/rsync» con el contenido siguiente.

service rsync
{
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}

1.f) Comprobar el puerto por el que el servidor rsync escuchará. Para ello ves al fichero»/etc/services» y comprueba que la siguiente línea existe y no está comentada:

rsync 873/tcp

1.g) Reinicia el daemon xinetd. Para ello:

sudo /etc/init.d/xinetd restart

1.h) Ya tenemos el servidor funcionado. ¿Como lo usamos?. Sencillo, en local ejecutamos:

rsync -v --recursive --times --perms --links --delete /mi/carpeta/personal/local rsync://[email protected]/nombremodulo1

donde estamos haciendo una sincronización recursiva, preservando fechas y permisos de los archivos origen, incluyendo vínculos, borrando archivos que fueron borrados en el directorio origen. Todo ello desde un directorio origen /mi/carpeta/personal/local y utilizando el protocolo rsync contra el servidor miservidor, con el usuario1 y utilizando el módulo nombremodulo1

Caso 2. La segunda opción consiste en la utilización del terminal remoto seguro ssh.

El proceso de creación de clave pública y privada y configuración del terminal escapa de este tutorial.

En este caso no es necesaria la configuración del demonio en el servidor, tan sólo que rsync esté instalado en él. Para ejecutar la sincronización:

rsync -v --rsh=/usr/bin/ssh --recursive --times --perms --links --delete /mi/carpeta/personal/local [email protected]:carpeta/destino/servidor