jueves, 30 de abril de 2015

Alternativas Monetarias para Venezuela


Tengo que aclarar que no soy economista, sino informático y este blog hasta ahora ha estado centrado solo en los tópico de mi área específica. Sin embargo crear otro blog para verter las ideas y opiniones que voy a dar aquí es algo que me parece un desperdicio. Tengo otro blog pero es sobre  temas algo más raros y lo publico bajo seudónimo. Hasta ahora no he querido romper ese anonimato. Pero seria complemente errado suponer que los informáticos no estamos en la capacidad de opinar o razonar sobre temas como estos, los requerimientos del mundo actual nos obligan a ser expertos de negocio y el caso del dinero o la moneda no es una excepción como lo demuestra el origen de las actuales criptodivisas.

La otra razón que mi impulsa a escribir esta entrada es la terrible y  insufrible crisis que estamos atravesando los venezolanos,  la muy relativa paz y el silencio atronador con la cual la estamos sobrellevando muchos de nosotros. Asi que de momento voy a salirme de la línea del blog para comentar que alternativas monetarias tendríamos los venezolanos para salir de la crisis.

Nuestro país esta atravesando una crisis financiera. Con crisis financiera se quiere decir que el problema de raíz no es una crisis de escasez de recursos, que no es una crisis humanitaria sino básicamente una crisis del flujo del dinero y la entrada del dinero, los problemas derivan de eso.  Hay escasez de dólares, una alta demanda del mismo y una baja oferta de esa codiciada moneda, por otra parte los únicos que compran bolívares son los colombianos. Esta escasez de dólares es causada por el control monetario y la fuga de divisas.

Debemos entender que una moneda es un producto y que como tal esta sujeta a las leyes de la oferta y la demanda. Esto puede sonar extraño a algunos, pero no lo es. Una moneda es un producto basado en la confianza y la solidez del estado que la emite. El estado además le da un uso obligatorio a la moneda y hace necesaria su circulación con tan solo tasar sus tributos en la misma.

Básicamente el dólar sube porque hay una alta demanda del mismo y hay una alta demanda de dólares debido a la gran cantidad de importaciones que tiene el país. Nada más en lo que comemos se importa el 70%. El país importa, pero no produce. El flujo de dólares entrante proviene de las exportaciones de un recurso no renovable al cual la naturaleza le tomo millones de años producir, mientras que el hombre lo consumirá en apenas un par de siglos: el petróleo.

El problema de raíz de Venezuela es en realidad que no produce. Importa alimentos, vehiculos de transporte terrestre y aéreo, electrodomésticos, maquinaria pesada, repuestos para maquinaria, etc, todo, casi todo. Somos grandes consumistas y para seguir importando necesitamos dólares.  De allí la escasez de la divisa.

La escasez de dólares provoca la depreciación monetaria del bolívar y la escasez de los productos que importamos de forma directa o la escasez inducida por el cierre de las fábricas nacionales que a su vez dependen de los dólares para la compra de repuestos o insumos. 

El dólar se encarece y nuestra moneda cada vez vale menos hasta que llegamos al punto de cuestionarnos si realmente sigue teniendo sentido sequir usándola.

Además la depreciación monetara aupada al control cambiario y al control de precios trae aparejada una seria de distorsiones que en la actualidad son el flagelo de la economía venezolana:

  • El contrabando: se obtiene una altisima rentabilidad al llevarse los productos nacionales de forma ilegal, dado que el control de precios pone esto muy por debajo de los equivalentes en dólares en el mercado vecino. Las ganancias son multimillonarias.
  • Bachaqueo: comprar productos regulados por el control de precios para después venderlos más caros. 
  • Mercado negro de dólares: para el caso de Venezuela que es el que tratamos se dice que tiene su principal sede el Cúcuta, Colombia, el país que más se benecia del contrabando con Venezuela y cuya deflación no seria exagerado suponer que se debe en gran parte a la  merma e inflación de la economía venezolana.

Hay pocas alternativas que están sobre la mesa y que se podrían considerar para o bien sustituir la moneda o aumentar la apreciación de la misma. Entre estas alternativas están:

  • Dolarización 
  • Bolivarización del precio del petróleo
  • Moneda electrónica

Dolarización


Es la alternativa de la que más se ha hablado y la que parece más viable y atractiva de todas. Ha sido implementada con éxito en paises como Ecuador.







Bolivarización del precio del petróleo

De quien leí esta propuesta originalmente fue de Jairo Larotta en Aporrea. En su artículo el habla es de bolívares-oro no simplemente de bolívares. La propuesta original de Jairo no la he podido comprender del todo

























miércoles, 29 de abril de 2015

X11 como usuario root o cualquier otro usuario

Muchos de los usuarios de linux se han sentido tentados alguna vez por ejecutar una aplicación gráfica desde la terminal en modo root o cualquier otro usario, pero se han encontrado con algo como esto:

.... cannot open display: :0.0

Si se trata de una aplicación java dira algo así:

java.lang.internalerror can't connect to X11 window server using ' 0.0' as the value of the DISPLAY variable

La forma más fácil de salir de esto seria mediante un: 

$ xhost +si:localuser:nombre_usuario 

También se podría modificar directamente los archivos involucrados en esto, aunque como era de suponer, es más tedioso, lo indico a modo de curiosidad. 

Para permitir que la aplicación se ejecute con el usuario activo en la consola se debe primero ubicar una clave en el directorio /var/run/xauth/ , allí se encuentra un archivo que se puede también conseguir con el comando:

$ find /var/run/xauth/A${DISPLAY}-*|tail -n1

Publicado por KENTNL, de cuyo blog extrage toda esta información . Luego de identificado el archivo (en mi máquina solo es uno), se debe imprimir y decodificar la clave con el comando:

$ sudo xauth -f /var/run/xauth/nombre_archivo  list

Lo cual mostrara algo como esto:

#ffff##:  MIT-MAGIC-COOKIE-1  711f067eae4ec73599dc38dbfaa164f0


Es casi obvio que 711f067eae4ec73599dc38dbfaa164f0 es la clave. Dentro del usuario en el cual queremos tener acceso tipearemos finalmente un comando como este:

$ xauth add :0 MIT-MAGIC-COOKIE-1 711f067eae4ec73599dc38dbfaa164f0

El cual creara un archivo llamado .Xauthority en el directorio home del usuario logueado con las credenciales que le daran finalmente el acceso a X11. Si después se le quiere quitar acceso a X11 basta con borrar ese archivo. Desgraciadamente la clave cambia con cada reinicio de la computadora asi que si se quiere hacer este cambio permanente deben seguirse las recomendaciones del blog de KENTNL.


viernes, 24 de abril de 2015

El Misterio del pase de parámetros en Java: ¿por valor o referencia?


Resulta sorprendente como después de llevar tiempo programando en Java y haber hecho infinidad de maravillas  uno se pueda quedar perplejo y hasta embarazado con la cuestión de si se pasan o no los parámetros por valor o referencia y cómo y cuándo. En un aula de clases no se le suelen dedicar ni dos horas ha hablar sobre eso.  De hecho en la Web existen diversidad opiniones sobre este tema, ¡pero no debería estar sujeto a opinión!, estamos hablando de algo que indiscutiblemente  tiene una implementación formal, de algo que esta programado y definido por el standar de Java por lo siglos de los siglos y que nadie puede cambiar ¿pero de cuál standar estamos hablando? ¿sera uno de estos? ¿o estos? ¿quién sera tan sesudo y paciente como para ponerse a revisarlos?. La polémica esta armada, vean la que se armo en stack overflow por este tema.

Parece que el problema esta en la forma en como hablamos. De hecho creo que eso de parámetros por valor y referencia es semánticamente confuso, pero Scott Stanchfield que es mucho más experto que yo, no esta de acuerdo con mi opinión, ni con la de muchos otros. Hablar de parámetros por valor y referencia no es algo muy típico de java o de los libros que tratan sobre java, no les extrañe si no consiguen nada sobre eso en muchos o no pocos de ellos.  Eso es algo más bien propio de lenguaje C. En java no se declara explicítamente parámetros por referencia o por valor, no existen por ejemplo los punteros , que es de donde viene esa distinción. Y sin embargo los parámetros implicítamente se pasan por valor o por referencia. Así que no es simplemente una extrapolación invalidad de los conocimientos de lenguaje C.

Un tema tan sencillo como este es algo que este link, parece haber cubierto plena y satisfactoriamente.  Lo dice y lo muestra muy claro:

"En Java todos los parámetros se pasan por valor
Cuando se realiza la llamada a un método, los parámetros formales reservan un espacio en memoria y reciben los valores de los parámetros actuales.
Cuando el argumento es de tipo primitivo (int, double, char, boolean, float, short, byte), el paso por valor significa que cuando se invoca al método se reserva un nuevo espacio en memoria para el parámetro formal. El método no puede modificar el parámetro actual.
Cuando el argumento es una referencia a un objeto (por ejemplo, un array o cualquier otro objeto) el paso por valor significa que el método recibe una copia de la dirección de memoria donde se encuentra el objeto. La referencia no puede modificarse pero sí se pueden modificar los contenidos de los objetos durante la ejecución del método"

En primer lugar lo que dice allí hecha por tierra que en Java se pasen parámetros por referencia y valor, dado que dice que solo se pasan por valor, y por tanto si se estaría extrapolando de forma invalidad los conceptos de lenguaje C. Pero antes de discutir eso vamos a ver cómo es que maneja java el pase de los parámetros.

Según ese link si los parámetros son primitivos la función tomará sus valores pero no podrá modificar el valor del parámetro original. Si los parámetros son objetos, la función podrá modificar los contenidos de los objetos.

Pero ¿qué pasa si los parámetros que se le pasan son arrays de primitivos? Efectivamente el link no dice nada sobre eso. Los arrays en Java son objetos aunque sean array de primitivos,  no es algo que sea obvio o haya que deducir (excepto programando), hay que saberlo.  Alguien que comento en Stack overflow dice que eso se especifica claramente en en la sección 4.3.1 de la Java Language Specification

Asi que si escriben:

char bb[] = {'s', 'o', 'p'};
if (bb instanceof Object) System.out.println("Yes!");

dira 'Yes!' .

Así que eso que se decía de que todos las clases de Java heredaban de Object es también cierto para los arrays primitivos.

Eso si, si escriben:

char bb[] = {'s', 'o', 'p'};
System.out.println("Nombre de Clase: " + bb.getClass().getName());

Les saldrá una cosa rara.

El link también decia que si se pasaban objectos a un método el contenido de estos podría ser modificado por el mismo. Por el contenido entiendo los atributos del objeto. Sin embargo hay ciertos objetos que sobrecargan el operador '=' (extrapolando la terminología de C++ dado que en Java en realidad no se sobrecargan los operadores) para lo eso no es cierto. Me refiero al objetos como String o Integer.

Si se hace:

String cadena = 'dsfskjlf';

luego se pasa como parámetro  a un método y allí se sustituye por otro valor eso no tendrá ningún efecto sobre el parámetro que se paso luego de salir del método. Parece que esto es cierto para todo Objecto que sobrecargue (extrapolando como dije antes) al operador '=', los cuales no son muchos.

Formalmente no se como se explicaría estas excepciones en Java, porque en general es cierto que si los atributos de un objeto que se paso como parámetro a un método se modifican en dicho método los cambios se mantendrán luego de salir del método. En el caso de String y Integer parece claro. aunque sea raro, que el valor que se le asiga a los mismos no constituye un atributo del objeto.

Para evitar las extrapolaciones con lenguje C, Java debe tener un lenguage complementamente propio y autosufienciente, en donde los casos que he mencionado anteriormente no induzcan la menor confusión. Sin duda que Java tiene eso, aunque no lo maneje a ese nivel y al parecer son muchos los que tienen ese problema. Quiero decir, por ejemplo, que encuentro incomodo,  referirme a casos como los anteriores sin hablar de parámetros por referencia y valor o referirme a algo como la sobrecarga que como se ha visto no serían terminos muy propios o apropiados para el  lenguaje Java. Incluso seria errado simplemente decir que en Java los parámetros siempre se pasan por valor, allí también se esta extrapolando. ¿Pero no refleja esta confusión también debilidades en el lenguaje Java?.

Concluyo finalmente con un código que de forma empírica muestra como maneja los parámetros Java. Con esto espero no volver a tener nuevamente esta confusión.


package misc;

/**
 * Programa que ilustra el pase de parámetros en Java
 * @author alexander
 */
public class PasoParametrosFunciones {
    public PasoParametrosFunciones () {
        int a=3;
        char c='a';
        byte e= (byte)11;
        System.out.println("Paso de valores primitivos: ");
        System.out.println("Valor antes de ejecutar la función: a = " +a + ", c = " +c + ", d =" + e);
        paso_primitivos (a, c, e );
        System.out.println("Valor despues de ejecutar la funcion: a = " +a + ", c = " +c + ", d =" + e);
       
        int aa[] = {1, 2, 7};
        char bb[] = {'s', 'o', 'p'};
       
        System.out.println("Paso de arrays primitivos: ");       
       
        System.out.println("Valor antes de ejecutar la función: aa[2] = " +aa[2] + ",bb[1] = " + bb[1]);       
        paso_array_primitivos (aa, bb);
        System.out.println("Valor despues de ejecutar la función: aa[2] = " +aa[2] + ",bb[1] = " + bb[1]);               
       
        System.out.println("Paso de Objectos: ");       
       
        String veronica = new String ("Veronica");
        Persona persona = new Persona("Carlos Fuentes", 'M', 21);
        Integer v = 4333;
       
        System.out.println("Valor antes de ejecutar la función: String veronia = " +veronica + ", Entero v " + v +
                ", Nombre Persona = " + persona.getNombre() + ", Edad Persona = " + persona.getEdad());

        paso_objectos (veronica, persona, v);
        System.out.println("Valor antes de ejecutar la función: String veronia = " +veronica + ", Entero v " + v +
                ", Nombre Persona = " + persona.getNombre() + ", Edad Persona = " + persona.getEdad());
   
    }
    static public void main(String args[]) {
        new PasoParametrosFunciones ();
    }
    void paso_primitivos (int a, char c, byte e) {
        a=199; c='3'; e= (byte) 'f';
    }
    void paso_array_primitivos (int aa[], char bb[]) {
        aa[0]= 7;
        aa[1]= 99;
       
        aa[2]= 88;
       
        bb[0]= 'z';
        bb[1] ='b';
        bb[2] = 'i';
    }
    void paso_objectos(String nombre, Persona p, Integer aa) {
        nombre= "Laura";
        p.setNombre("Jaimito");
        p.setEdad(1000);
        aa = 821;
       
    }
}

class Persona {
    private String nombre;
    private char sexo;
    private int edad;
   
    public Persona(String nombre, char sexo, int edad) {
        this.nombre = nombre;
        this.sexo= sexo;
        this.edad = edad;
       
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public char getSexo() {
        return sexo;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }
   
}

Ghost Effect con la programación script de GIMP (script-fu)

Para GIMP se pueden hacer scripts que automaticen tareas que se hacen desde la interfaz gráfica. Por ejemplo, el siguiente script esta hecho para correr desde bash. Lo que hace es tomar un conjunto de imágenes que representan una secuencia animada y tomando una imagen como fondo transparenta el conjunto imagenes animadas sobre dicho fondo, creando lo que se conoce como un ghost effect. Las imagenes que se utilizen para ello deberán haberse tomado previamente sin mover la cámara y utilizando una imagen como fondo en un escenario vacio y sin nada animado, que este en la misma posición en la cuál se toman la secuencia de imagenes animadas. De otra forma lo que se obtendra es un revoltijo.

#!/bin/bash
# Script para crear animaciones que trabaja con dos capas
# - Una en la que hay un fondo estático
# - Y otra de la animación la cual se transparenta contra el fondo
# El resultado es aspecto fantasmal de la imagen animada.
# Tanto el fondo estático como la capa animada deben tomarse en la misma posición y sin mover la cámara

{
cat <<EOF
(define (crea-transparencia imagen_fondo imagen_animacion imagen_salidad)
  (let* (
     (image (car (gimp-file-load RUN-NONINTERACTIVE imagen_fondo imagen_fondo)))
     (layer nil)
         (drawable nil)
     )

    (set! layer (car (gimp-file-load-layer RUN-NONINTERACTIVE image imagen_animacion)))
   

    (gimp-image-add-layer image layer 0 )
    (gimp-layer-set-opacity layer 25)
    (set! drawable (car (gimp-image-merge-visible-layers image EXPAND-AS-NECESSARY)))
    (file-jpeg-save RUN-NONINTERACTIVE image drawable imagen_salidad imagen_salidad 1 0 0 0 " " 0 1 0 1)
    (gimp-image-delete image) ; ... o la memoria explotara
    )
  )

(gimp-message-set-handler 1) ; Messages to standard output
EOF

imagen_fondo="../00554/0531.jpg"

for i in ../00554/*.jpg; do
  imagen_salidad=`echo $i | cut -d '/' -f 3`
  echo "(gimp-message \"$i\")"
  echo "(crea-transparencia \"$imagen_fondo\" \"$i\" \"$imagen_salidad\")"
done

echo "(gimp-quit 0)"
} | gimp -i -b -


Este es un ejemplo de un video que desarrolle para un proyecto en la universidad hace un tiempo: