jueves, 18 de octubre de 2012

Javascript: Parámetros por valor y por referencia


Valores y referencias

Cuando programamos en Javascript suele ser confuso, o en algunos casos poco natural, la manera en que maneja los pasajes de parámetros en las funciones. Especialmente el caso cuando se pásan funciones de objetos. Solo a modo de recordatorio, al asignar un objeto, Javascript realiza la asignación por referencia, ya que la semántica del lenguaje (para los objetos) es siempre de esta forma.

Veamos algunos ejemplos concretos, empecemos por una funcion que recibe un atributo primitivo (un string, un número, etc.):
function funcion(x)
{
      // x == 1
      x = 2;
      // x == 5
}

var x = 1;
// x == 1
funcion(x);
// x = 1
En este ejemplo, el valor x se pasa por valor, luego, al volver de la funcion no se ve alterado. A continuacion, un ejemplo de un pasaje de parámetros con un objeto:
function objeto()
{
 this.value = 1;
}
var o = new objecto();
// o.value == 1

function funcion(fnc)
{
 fnc.value = 2;
}
funcion(o);
// o.value == 2
A diferencia del caso anterior, el objeto se pasa por referencia, por lo tanto, al modificar el valor de su atributo, la función tiene un efecto colateral.
Para finalizar un ejemplo más, donde se pasa por parámetro un método del objeto.
function objeto()
{
 this.value = 1;
}
objeto.prototype.add = function()
{
 this.value++;
}

var o = new objeto();
// o.value = 1
o.add();
// o.value = 2
function funcion(fnc)
{
 fnc(); // ejecuta la función pasada como parámetro
}
funcion(o.add);
// o.value = 2, es decir, no se modifica
El problema en este caso es que al utilizar la palabra 'this', se hace referencia al contexto del objeto, pero cuando se pasa por parametro la función dicho contexto se pierde, y se asigna el valor de un nuevo objeto 'value'. Se agrega este valor al objeto 'funcion'.

Espero quede claro, pero si no, los invito a escribir sus inquietudes.

Saludos!

Referencia: http://www.snook.ca/archives/javascript/javascript_pass/

sábado, 29 de septiembre de 2012

Servidor UPnP/DLNA en Linux

Una de las ventajas de los televisores modernos es poder reproducir archivos multimedia a través de la red. Para esto, además del tele compatible (obviamente), necesitamos un servidor para UPnP-DLNA.

En general, los televisores recomiendan uno propio, en mi caso, un Samsung me decia que utilice el programa AllShare. Obviamente, no está para Linux, asi que tuve que buscar una alternativa, y después de revisar varios, el ganador es MiniDLNA.

MiniDLNA para Linux


Antes que nada, quiero hacer una advertencia. Me gustan mucho los programas que cumplen una función puntual y no están llenos de configuraciones que nunca se usan. K.I.S.S. dirían algunos.

En fin, MiniDLNA es un servidor muy simple, rápido, y de fácil configuración. Corre como demonio y tiene un solo archivo de configuración, donde se especifica los directorios que se deben escanear, el nombre del servidor y alguna que otra cosilla más, pero nada de gran complejidad.

Para instalarlo ejecutamos (Warning: está en los repositorios de rpmfusion):
yum -y install minidlna
El archivo de configuración es: /etc/minidlna.conf, el archivo tiene comentarios muy entendibles, sino se puede ver el manual ejecutando "man minidlna". Una vez configurado ejecutamos el servicio:
service minidlna start
Y listo, ya deberíamos poder verlo desde el cliente de DLNA.

Saludos!

domingo, 2 de septiembre de 2012

Wireless Broadcom en Fedora

El problema de las broadcom

Al instalar Fedora, puede que exista un problema con las placas wireless Broadcom. En mi caso, tengo una HP dv5. La solución es bastante simple, pero siempre tengo que buscarla en internet, y no está en castellano.

La solución

Simplemente, ejecutamos estos comandos, como root:
Agregamos los repositorios de rpmfusion
rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm 
rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
Actualizamos los paquetes
yum update
Instalamos el paquete de la solucion
yum install kmod-wl
Reiniciamos y listo. Con eso debería funcionar.

Espero que les sirva.

Saludos!

miércoles, 8 de agosto de 2012

Expresiones regulares en Javascript

El problema recurrente

Siempre que hacemos un formulario para solicitar datos de entrada necesitamos validar las entradas. Una de las formas más básicas para validar es mediante expresiones regulares. Este deberia ser una de las primeras etapas de validación. 

Nunca tengo a mano un listado con las expresiones más comunes, asi que aca anoto 3 que son bastantes comunes. Están expresados para utilizar en javascript, pero son facilmente adaptables.

Fecha
^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$
Mail
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$
CUIT Argentina
El mejor para lo último. Agrego también la función para validar el dígito verificador.
^[0-9]{2}-[0-9]{8}-[0-9]$
function validarCUIT(cuit){
        cuit = cuit.toString().replace(/[-_]/g, "");

        var codigo_valido = true;
        if(cuit.length != 11)
            codigo_valido = false;
        else {
            /* Funcion de CUIT encontrada en internet */
            var mult = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
            var total = 0;
            for(var i = 0; i < mult.length; i++) {
                total += parseInt(cuit[i]) * mult[i];
            }
            var mod = total % 11;
            var digito = mod == 0 ? 0 : mod == 1 ? 9 : 11 - mod;
            codigo_valido = digito != parseInt(cuit[10]);
        }
        return codigo_valido;
}
A medida que vaya utilizando nuevas, las voy a ir agregando. Saludos!

lunes, 6 de agosto de 2012

El criticado goto


Una discusión reiterada con mis amigos programadores es acerca el uso del goto. En  cualquier libro sobre lenguajes de programación se lo nombre, pero casi todos recomiendan evitar su uso. Este último punto es sobre el cual peleamos de manera sistemática: siempre me dicen que usarlo está mal, de manera inapelable.

Yo no creo que esto sea así. Es verdad que el 99% de las veces en las que se podría utilizar esta sentencia, usarla estaría mal desde el punto de vista de legibilidad del código, principalmente. Pero hay casos en los que utilizarlo hacen el código mas entendible. El problema es que estos casos son muy puntuales, y no se los nombra, al menos con la fuerza necesaria para recordarlos, en los libros de programacion. Todo se reduce a "Usar el goto esta mal".

Ejemplos


Un ejemplo muy claro en el que el uso se justifica, para mi, es el siguiente:

bool encontre = false;
for (int i = 0; i < vector.size(); ++i) {
 for (int j = 0; j < otro_vector.size(); ++j) {
   for (int k = 0; k < otro_vector_mas.size(); ++k) {
    if (condicion de corte){
     encontre = true;
     break;
    }
   }
   if (encontre == true)
    break;
 }
 if (encontre == true)
  break;
}

En este ejemplo,se recorren 3 vectores de forma anidada y se busca una condición de corte al recorrer el tercer vector (podría ser, por ejemplo, que la suma de los elementos de los 2 primeros vectores sea igual al tercero). El caso se generaliza para cualquier cantidad de vectores. Sin utilizar goto, se debe tener una variable booleana, y luego, al salir de cada ciclo chequear por esta variable para saber si cortar el recorrido o no. Creo, que utilizando goto queda un código más limpio:

bool encontre = false;
for (int i = 0; i < vector.size(); ++i) {
 for (int j = 0; j < otro_vector.size(); ++j) {
   for (int k = 0; k < otro_vector_mas.size(); ++k) {
    if (condicion de corte){
     encontre = true;
     goto fin_recorrido;
    }
   }
 }
}
label fin_recorrido;
En este caso no hay que chequear nada al salir de cada ciclo, quedando un código con menos condicionales, y, a mi entender, mas legible y fácil de seguir. Siempre hay que tener en cuenta de usar nombres significativos tanto para las variables como para las etiquetas del goto, pero eso es una condición general para poder programar con cualquier tipo de sentencia :)

Espero sus comentarios sobre tan delicado tema.

Saludos!

domingo, 22 de julio de 2012

Objetos en sesión en PHP

Objetos en PHP


Una buena forma de mantener información de sesiones en PHP es mediante objetos. Sin embargo, es muy común utilizar diferentes campos del arreglo $_SESSION. Este forma es muy práctica, pero si la cantidad de información es demasiada puede resultar confuso (cuantas veces he tenido que volver a mirar el código para recordar como nombre pensé que recordaría...). Un objeto es más amigable y hace que el código se pueda mantener con más facilidad.
Mantener un objecto en sesión es trivial, pero hay que tener en cuenta unos detalles.
  • Se debe serializar el objecto, sino, al recuperarlo los datos podrían no se correctos.
  • Los campos estáticos no se pueden guardar (esto es claro por el paradigma orientado a objetos, pero  a veces genera confusión)
  • Se debe incluir el archivo que define la clase antes de levantar el objeto.
A continuación, un ejemplo.

miércoles, 18 de julio de 2012

Servidor PHP en Fedora 17

Este post va a ser muy cortito, solamente quiero explicar como hacer para instalar un servidor PHP en un Fedora 17 (aunque creería que sive para cualquier release, incluso para cualquier distribución que utilice yum como gestor de paquetes).

El post lo hago porque siempre hay problemas al querer hacer un link simbólico a nuestro home, y creo que esto puede aclarar algunas cosillas. El error especifico es:
Symbolic link not allowed or link target not accessible

Aunque se puede dar por otros motivos, este es un problema que siempre que instalo un servidor nuevo, se me olvida. :(