Importar un script en Bash

Si estas programando un script en Bash y quieres utilizar variables o funciones que definiste ya en otro archivo existente, puedes importarlo a tu script actual de una manera sencilla:

# Modo completo
source ruta_al_archivo1

# Modo abreviado
. ruta_al_archivo2

Ejemplo:

funcion.sh:

#!/bin/sh

imprimir_mensaje()
{
    echo
    echo "Hola $1!..."
    echo "Esto es una prueba."
    echo
}

run.sh:

#!/bin/sh

# Importamos el archivo que contiene la función
source funcion.sh

imprimir_mensaje "Fulanito"

La salida sería esta:


Hola Fulanito!...
Esto es una prueba.

Anuncios
Importar un script en Bash

Meld en Git como herramienta de Fusión (merge) y Comparación (diff)

En la presente publicación voy a explicar como configurar Git para que haga uso de la herramienta Meld cuando queramos hacer comparaciones del código (diff) o resolver los conflictos que se presentan cuando fusionamos las ramas (merge). En primer vamos a ver cuales son los comandos que podemos utilizar en Git para hacer comparaciones o resoluciones de conflictos.

git diff

Este comando permite que podamos hacer una comparación entre los archivos de nuestro proyecto versionado, el cual nos indicará cual era el estado anterior y cuales han sido las modificaciones sufridas por esos archivos. De forma predeterminada, la salida de este comando es similar a esta:

diff --git a/main.cpp b/main.cpp
index 2172b27..14c3fbb 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,6 +1,8 @@
 #include <iostream>
 
+using namespace std;
+
 int main(){
-       std::cout << "Hola Mundo" << std::endl;
+       cout << "Hola Mundo, soy un archivo cambiado." << endl;
        return 0;
 }

A mi gusto, esta no es la forma más fácil de entender las diferencias.

git difftool

En un estado estándar, si no hemos configurado nada para este comando, hará lo mismo que git diff, pero la diferencia entre ambos radica en que este comando puede fácilmente ser configurado para llamar a otra aplicación o herramienta que permita visualizar las diferencias de manera más clara o por lo menos presentando mayores opciones al usuario.

git mergetool

Este comando se encarga de ejecutar la herramienta correspondiente para hacer la resolución de conflictos que pudieran surgir al fusionar dos ramas en git. Si aún no ha sido configurado por el usuario, ejecutará por defecto la aplicación vim para hacer la resolución de conflicto, pero al igual de git difftool, puede ser fácilmente configurado por el usuario para que ejecute alguna otra herramienta especializada.

git config

Es el comando que nos permitirá realizar modificaciones a la configuración básica de nuestro git, si lo ejecutamos con el parámetro --global entonces las configuraciones se harán de forma general para todos los proyectos que usen git, si no, entonces las configuraciones se harán válidas sólo para el proyecto actual en el que estemos ejecutando el comando.

¿Que es Meld?

Meld es una herramienta visual para hacer comparaciones y fusiones destinada a desarrolladores. Meld te ayuda a comparar archivos, directorios y proyectos con control de versiones (aquí es donde entra git). Permitiendo una visualización de dos o tres columnas.

Para visualizar la diferencia entre dos archivos o dos directorios con meld sólo debemos ejecutar:

meld archivo_uno archivo_dos

Meld comparando dos archivos

Meld comparando dos carpetas

Configurando Meld en Git

Git viene preparado para utilizar bastantes herramientas de resolución de conflictos, sin necesidad de andar ajustando la configuración. Puedes utilizar:

  • kdiff3,
  • opendiff,
  • tkdiff,
  • meld,
  • xxdiff,
  • emerge,
  • vimdiff, o
  • gvimdiff
    • En este caso voy a explicarles cómo configurar Meld, porque obviamente es la herramienta que yo uso, sin embargo los pasos y configuraciones son iguales para las otras herramientas de comparación y fusión.

      Para realizar la configuración de nuestra herramienta de comparación y fusión de archivos en git sólo debemos ejecutar algunos comandos sencillos:

      Instalar Meld

      Esto sólo es necesario si aún no le tenemos en nuestro sistema. Ejecutamos como super-usuario:

      # aptitude install meld
      

      Configurar Meld como herramienta de comparación

      Esta acción debería hacerse con nuestro usuario normal, nunca como super-usuario al menos que sepas lo que haces.:

      $ git config --global diff.tool meld
      

      Para probarlo modifica un archivo de tu proyecto y ejecuta:

      git difftool
      

      También lo puedes utilizar para comprobar las diferencias que existen entre una rama y otra, en el siguiente ejemplo pedimos que nos muestre las diferencias que hay entre dos ramas de ejamplo que he llamado “estable” y “desarrollo”:

      git difftool estable..desarrollo
      

      Configurar Meld como herramienta de fusión

      Con esto podremos visualizar gráficamente los conflictos que se hayan generado como producto de la fusión entre dos ramas:

      $ git config --global merge.tool meld
      

      Para probarlo une dos ramas que den conflictos (con merge o con pull):

      git difftool
      

      Ya con esto tendremos configuradas nuestras visualizaciones de diferencias en git de manera grafica con meld. Una vez hechas estas configuraciones, el ejemplo que dimos al inicio con el diff del “Hola Mundo” se verá así:

      Comparación (diff) visual, usando Meld
      Así se verá nuestro ejemplo anterior una vez configurado el Git para trabajar en conjunto con Meld

      Soy un genio, entiendo mas el modo texto que el modo gráfico ¿Cómo deshago esta configuración?

      Si te gustan más los signos de arroba (@@), suma (+++), resta (—) y los hash (2172b27..14c3fbb) y quieres deshacerte de toda esta configuración visual que acabamos de realizar, entonces simplemente tienes que devolver las variables de configuración a su estado original usando el parámetro --unset de la siguiente manera:

      $ git config --global --unset diff.tool
      $ git config --global --unset merge.tool
      

      De esa manera la configuración se devolverá a la que está por defecto para git.

      Resumen

      ### Instalar meld
      # aptitude install meld
      
      ### Configurar herramienta de comparación
      $ git config --global diff.tool meld
      
      ### Configurar herramienta de fusión
      $ git config --global merge.tool meld
      

      Fuentes:

Meld en Git como herramienta de Fusión (merge) y Comparación (diff)

Paquetes debian con gconf-defaults y gconf-mandatory

Trabajando con la configuración por defecto para el escritorio de las Canaimitas y configurando las restricciones de algunas opciones que no se quiere que sean modificada por los niños, me topé con el reto de crear un paquete .deb que fuese capaz de manejar los valores por defecto para el GConf (Sistema de configuración de gnome) y también capaz de configurar valores obligatorios para el mismo, es decir que no pudiesen ser modificados o borrados.

Después de investigar sobre esto voy a pasar a hacer la respectiva difusión del conocimiento recién obtenido.

Es importante acotar que para la creación de paquetes que explico a continuación hago uso del ‘debhelper’.

GConf

No voy a profundizar mucho en esta parte, pero creo es necesario dar una pequeña introducción del GConf.

Como ya dije el gconf es un sistema de configuración para gnome y sus aplicaciones. El formato que utiliza para hacer referencia a algo está compuesto de claves y valores.

Claves Gconf

Se refiere a un identificador específico para cada valor y se expresa de manera muy similar a un sistema de archivos linux, ejemplo:

/desktop/gnome/background/draw_background

La clave anterior almacena un valor booleano que indica si se debe mostrar una imagen en el escritorio o sólo un color de fondo. Es decir, activa o desactiva el fondo de escritorio.

Valores Gconf

No es necesario explicarlo mucho, son los valores de cada clave y permiten modificar el comportamiento del sistema. Los valores permitidos son:

  • Enteros
  • Booleanos
  • Strings
  • Listas

Ejemplo de los valores indicados arriba respectivamente:

25
true
"/usr/share/images/desktop-base/desktop-background"
[top_panel, bottom_panel]

Para modificar los valores del gconf se utiliza generalmente alguna de estas aplicaciones:

  • gconftool-2 (Para hacerlo por consola)
  • gconf-editor (Para hacerlo en modo gráfico)

Pero en este caso no me interesaba utilizar dichas herramientas, sino que fueran instaladas dichas configuraciones/personalizaciones de manera automática a través de un paquete .deb, metodo el cual esbozo a continuación.

Valores por defecto para GConf (archivo debian/gconf-defaults)

Los valores por defecto son aquellos que tendrá todo usuario y el cual tendrá la posibilidad de cambiarlos cuando desee por los valores que desee.

Para configurar los valores por defecto de las claves, una vez configurado nuestro paquete para ser ‘debianizado’, simplemente, dentro de la carpeta debian/ de nuestro código fuente creamos el archivo llamado:

NOMBRE-DEL-PAQUETE.gconf-defaults

Dónde NOMBRE-DEL-PAQUETE debe ser idéntico al indicado en el archivo debian/control.

A continuación indicamos las claves y valores que deseamos tengan un valor específico por defecto para los usuarios. El formato para hacer llenar el archivo es la clave seguida de espacio o tabulador luego el valor, como el siguiente ejemplo:

/apps/gnome-screensaver/idle_activation_enabled true
/apps/gnome-screensaver/idle_delay 5
/apps/gnome-screensaver/lock_enabled false

En el ejemplo anterior indicamos que por defecto:

  • el protector de pantallas se activa cuando el sistema este inactivo,
  • que el sistema se considera inactivo luego de 5 minutos sin uso
  • y que no bloquee la pantalla al activar el protector de pantalla.

Una vez terminado podemos empaquetar nuestra aplicación y debhelper se encargará del resto.

Valores obligatorios para GConf (archivo debian/gconf-mandatory)

Si queremos que los usuarios no puedan modificar de ningún modo algun(os) valores del gconf, el archivo gconf-mandatory es el que necesitamos.

Las reglas a seguir con este archivo son idénticas al gconf-defaults definidas arriba sólo variando el nombre, es decir, el archivo debe nombrarse de esta manera:

NOMBRE-DEL-PAQUETE.gconf-mandatory

Como ya sabemos, NOMBRE-DEL-PAQUETE debe ser idéntico al nombre del paquete indicado en el archivo debian/control.

Comentarios

Los archivos gconf-defaults y gconf-mandatory aceptan comentarios, los cuales están conformado por una linea que comienza por ‘#’ seguido del comentario. Ejemplo:

##Configuracion del Salvapantallas##
# Activar cuando este inactivo
/apps/gnome-screensaver/idle_activation_enabled true
# Tiempo de espera para activar
/apps/gnome-screensaver/idle_delay 5
# No pedir contraseña para salir del salvapantalla
/apps/gnome-screensaver/lock_enabled false

Notas finales

Una de las características que en mi caso es muy útil es que con ese archivo simple de llenar, se hacen automáticamente las configuraciones indicadas al instalar el paquete y desaparecen cuando se desinstala, sin tocar el comando gconftool-2 o el gconf-editor.

Paquetes debian con gconf-defaults y gconf-mandatory

Iconos gratis para tus aplicaciones Web o programas

Revisando la web en busca de iconos gratuitos para una pagina web he encontrado un Site el cual contiene mucha información y herramientas útiles para los desarrolladores Web.

En ella he encontrado una inmensa e impresionante cantidad de iconos muy útiles por lo que me parece completamente adecuado hacerle referencia desde aquí.

La dirección es:

http://www.hongkiat.com/blog/category/freebies-online/free-icons/

Espero les interese también!

Iconos gratis para tus aplicaciones Web o programas

Etiquetas para identificar Ciclos en Java

Es común que durante la ejecución de un programa, te veas en la necesidad de interrumpir el curso normal de un ciclo repetitivo como un for, un while o un do-while. Para hacerlo cuentas en java con las sentencias break y continue.

Normalmente cuando las utilizas estas interrumpiendo el normal recorrido del ciclo mas interno al cual se ingreso previamente antes de encontrarse con algunas de las sentencias break o continue.

Sin embargo Java brinda la posibilidad de etiquetar a cualquiera de las sentencias for, while, do-while e incluso switch para que de este modo pueda ser interrumpida directamente desde cualquier ciclo interno sin importar que tan profunda se encuentre la llamada a break o continue.

Acá te dejo un ejemplo para que lo pruebes.


import java.util.Scanner;

class Ciclo {
 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);

  ciclo1: while (true) {
   System.out.println("Estoy en Ciclo1");

   ciclo2: while (true) {
    System.out.println("Estoy en Ciclo2");

    ciclo3: while (true) {
     System.out.println("Estoy en Ciclo3");

     cicloLectura: while (true) {
      System.out.println("Estoy en CicloLectura");
      System.out.print("Dame un numero: ");

      //Leemos de la entrada estandar
      int num = in.nextInt();

      switch (num) {
       case 1:
        break ciclo1;
       case 2:
        break ciclo2;
       case 3:
        break ciclo3;
       case 4:
        break cicloLectura;
       default:
        System.out.println("Solo numeros del 1 al 4");
        break;
      }
     }
     System.out.println("Sali de CicloLectura");
    }
    System.out.println("Sali de Ciclo3");
   }
   System.out.println("Sali de Ciclo2");
  }
  System.out.println("Sali de Ciclo1");
  System.out.println("Fin");
 }
}

Para entender un poco mejor lo que realiza este código podemos ver la siguiente imagen:

Labels en Java
Ejemplo de Labels en Java

En esta imagen se ve como las sentencias break con etiquetas interrumpen el los ciclos while mas superiores y no los mas profundos cercanos a ellas. Mientras que el break sin etiqueta no posee esa cualidad.

Fuente: http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

Etiquetas para identificar Ciclos en Java

Java acepta Unicode donde sea

Encontré un detalle un poco escondido pero muy curioso en el tutorial oficial de java, específicamente aquí.

Para el compilador de java el siguiente código imprime “2011” y luego “Hola“.


public class NuevaClase {
    public static void main(String[] args) {

    int año = 2010;
    a\u00F1o += 1;
    System.out.println(año); // Imprime 2011

    //aqui dice:
    //System.out.println("Hola");
    System\u002E\u006F\u0075\u0074\u002Eprintln("Hola");
  }
}

Se puede notar que hay caracteres de escape unicode por todos lados.

Según el tutorial las secuencias de escape del código Unicode pueden ser insertadas “elsewhere” (donde sea) como en nombres de variables por ejemplo.

Pueden probarlo.

Java acepta Unicode donde sea

Interfaces Gráficas para J2ME (Java 2 Micro Edition)

En esta oportunidad explicaré lo que conseguido acerca de como mejorar el aspecto gráfico de nuestras aplicaciones para equipos móviles celulares. Hace un tiempo que me vengo interesando en el tema de las aplicaciones para teléfonos móviles utilizando java como lenguaje de programación ya que tengo cierto tiempo de experiencia en el manejo de este lenguaje en aplicaciones de escritorio.

J2ME o Java 2 Micro Edition, es un subconjunto derivado de la plataforma Java que ofrece una colección de APIs de desarrollo de software para dispositivos con recursos restringidos, la cual es mucho mas pequeña que las versiones J2SE (Java 2 Standard Edition) y J2EE (Java 2 Enterprise Edition) ya que debe adaptarse a los dispositivos de bajos recursos para los cuales esta desarrollada.

La plataforma J2SE es actualmente utilizada para desarrollar mayormente juegos para celulares y en menor medida aplicaciones o herramientas complementarias para el celular. En esta oportunidad la rama que vamos a tratar es la referente a las aplicaciones complementarias, las cuales se caracterizan por utilizar componentes como Cuadros de Texto, Labels, Formularios, Listas desplegables, entre otras.

Es claro notar que las aplicaciones hechas con el API de Interfaz de Usuario que viene integrado en J2ME, contenidas en el paquete javax.micoedition.lcdui son poco agradables a la vista del usuario final ya que ofrecen componentes demasiado simples y poco flexibles al momento de hacer interfaces gráficas agradables y llamativas, esto debido a que las ya conocidas librerías AWT, Swing o SWT son muy pesadas para ser utilizadas en los dispositivos móviles.

Para dar el ejemplo de una aplicación hecha utilizando el API estándar de J2ME tenemos la imagen que se muestra a continuación.

API UI basico J2ME
API UI básico J2ME

Como se puede ver en la imagen, tenemos un cliente de twitter hecho con la interfaz gráfica estándar de J2ME. No es difícil notar que es bastante sencilla y estática. Son pocas las aplicaciones que podríamos hacer así que lleguen llamar la atención y ganar el aprecio del usuario final puesto que hay aplicaciones en el mercado que lucen mil veces mejor, como la que se muestra a continuación.

Aplicacion J2ME con Interfaz grafico avanzado
aplicación J2ME con Interfaz gráfico avanzado

Por esta razón he decidido buscar alguna librería o framework que facilite el desarrollo de interfaces gráficas llamativas y agradables para las aplicaciones móviles.

Es asi que he encontrado información sobre varias librerías que vienen a mejorar el aspecto y usabilidad de las aplicaciones java para teléfonos móviles, y aunque no las he probado todas, menciono las que me han parecido mas interesantes, útiles o completas.

KUIX

Es un framework  de desarrollo que permite la creación fácil de aplicaciones en J2ME. Provee de los elementos gráficos mas utilizados como botones, campos de texto, listas, menús, etc. para crear interfaces gráficas avanzadas usando XML/CSS para describir las pantallas y las acciones del usuario en la aplicación.

http://www.kalmeo.org/projects/kuix

kuix
Aplicacion hecha con kuix

LWUIT

Es una librería de Interfaces de Usuario que se incluye junto a las aplicaciones y ayuda a los desarrolladores de contenido a crear aplicaciones irresistibles y consistentes en java ME. LWUIT soporta componentes visuales y otros trucos visuales como temas, transiciones, animaciones y mas.

https://lwuit.dev.java.net/

LWUIT
Aplicación hecha con LWUIT

Fire (Flexible Interface Rendering Engine)

Fire es una libreria que pretende ser un conjunto de componentes extensible para los desarrolladores en Java ME. El conjunto básico de componentes de Fire ofrece todas las funcionalidades de las interfaces de usuario J2ME (Formularios, Items, etc) ademas de interfaces de usuario mucho mas agradables con temas, animaciones, popups menu y mejores Layouts de componentes. Fire no depende del dispositivo para ordenar los componentes en la pantalla, sino que crea interfaces de usuario que funcionan igualmente en diferentes teléfonos y tamaños de pantalla.

http://sourceforge.net/projects/fire-j2me/

Fire
Fire

J2ME Polish

Mas que solo una librería de interfaces gráficas, J2ME Polish es una suite de herramientas y tecnologías que pretenden facilitar el desarrollo de aplicaciones móviles y ofrece varias librerías que ayudan en el desarrollo de completas aplicaciones. Su librería gráfica se llama LUSH y comprende una variadísima cantidad de componentes como formularios, listas desplegables, entre muchísimas otras. Ademas de animaciones, efectos de texto, transiciones de pantalla, entren otros.

http://www.j2mepolish.org/

J2ME Polish
J2ME Polish

Las librerías mencionadas anteriormente son las que me parecieron mas interesantes, pero existen muchas mas. A continuación menciono algunas otras:

Apime

http://www.java4ever.com/index.php?section=j2me&project=apime&menu=main〈=_en

Byblos

http://code.google.com/p/byblos/

LwVCL

http://www.lwvcl.com/j2me.php

J4ME: Java For Me

http://code.google.com/p/j4me/

kUI

http://www.kobjects.org/kui/index.php

MWT

http://j2me-mwt.sourceforge.net/

Synclast UI API

http://www.synclast.com/ui_api.jsp

Fuente: http://j2me.ngphone.com/opensource/ui.htm

Interfaces Gráficas para J2ME (Java 2 Micro Edition)