domingo, 27 de julio de 2008

Atributos virtuales en Ruby

Los métodos set y get de las clases se usan supuestamente para encapsular la información y ocultar la implementación de esa clase.

Lo que ocurre es que muchas veces no se aprovecha adecuadamente esta última posibilidad, donde hay getAtributo debería haber getInformacion, que no siempre es exactamente lo mismo. No se oculta la implementación de la clase (que haría más fácil futuros cambios) sino que prácticamente se nos están diciendo los atributos.

En ruby se pueden usar atributos virtuales para realmente separar entre la información útil de la clase y los atributos que se necesitan para almacenarla.

#!/usr/bin/ruby

class Tiempo
attr_accessor :segundos;

def minutos=(new_minutos)
@segundos = new_minutos*60;
end

def minutos
@segundos/60
end

def horas=(new_horas)
@segundos = new_horas*60*60;
end

def horas
@segundos/(60*60)
end
end

t = Tiempo.new
t.segundos = 3;
puts t.segundos

t.minutos = 3;
puts "#{t.minutos} #{t.segundos}"

t.horas = 1;
puts t.minutos

Nos es totalmente indiferente como se guarde la información (en este caso en segundos), se convierte dinámicamente entre unidades sin ningún problema, tanto para obtener información como para grabarla.

Se hace pues la distinción entre información(horas, minutos, segundos) y los atributos(segundos). Aquí hay un ejemplo de lo que no hay que hacer, por dos motivos:

1) Dejar la interfaz de la clase de forma no intuitiva, hay que convertir a milisegundos para guardar una fecha.

2) Dejar todos los métodos útiles para obtener información sin mantener (deprecated) al haber cambiado la implementación de la clase.

sábado, 19 de julio de 2008

Python en Symbian

Desde hace un tiempo es posible programar en python para esta plataforma sin muchas dificultades, yo estoy usando PyS60 que es libre y se puede descargar gratuitamente.

Para acceder a la documentación de la API específica estoy usando esta página de Nokia.

Como editor de textos uso LightNotepad que se puede descargar también gratuitamente aquí, aunque es más cómodo programar en un ordenador y luego pasar el programa al teléfono.

Os dejo con un Hello world.

import appuifw

appuifw.note(u'Hello world!', 'info')

Busqueda incremental haciendo peticiones al servidor

Con búsqueda incremental me refiero a la misma que me refería en este otro post, la diferencia es que en esta ocasión mostraré la manera de hacer la búsqueda haciendo peticiones al servidor.

Lo primero que necesitamos es poder hacer consultas al servidor sobre algo, así que en lugar de crear una base de datos vamos a simular el comportamiento mediante un programa php muy simple.

<?php
if($_GET['q']){
$consulta=$_GET['q'];
$coche[0]="seat ibiza";
$coche[1]="opel corsa";
$coche[2]="ford fiesta";
$coche[3]="citroen ax";
$coche[4]="seat leon";

for($i=0;$i<5;$i++){
$devolver=1;
for($j=0;$j<strlen($consulta);$j++){
if($consulta[$j]!=$coche[$i][$j]){$devolver=0;}
}
if($devolver==1){echo $coche[$i] . "<br>";}
}
}
?>

De la consulta que reciba va a devolver los elementos del array coincidentes.

Para el código de autocompletado vamos a usar la librería de javascript prototype, tan solo hay que bajarla de la web oficial e incluirla como fuente en nuestra página.

<html>
<head>
<script src="prototype.js" type="text/javascript"></script>
</head>

<body>
<form method="get">
<input type="text" onkeyup="new Ajax.Updater('coches', 'query.php?q='+this.value, {method: 'get' })">
</form>
<br>

<div id="coches"></div>
</body>
</html>

Con el método Ajax.Updater vamos creando consultas conforme vamos escribiendo en la caja de texto y se añaden al div que hemos dejado para que vayan apareciendo.

domingo, 13 de julio de 2008

Incluir email en la web sin sufrir spam

Es de sobra conocido que hay programas rastreando las web intentando conseguir direcciones de email para después enviarles spam.

La solución para evitarlo es colocar una imagen con la dirección de email escrita, ya que estos programas solo pueden buscar en texto, sin embargo, esta imagen no es seleccionable, por lo que se pierde usabilidad.

Hay una forma de incluir tu email en texto en una web sin que los robots de los spammers puedan leerlos, es incluir el siguiente javascript.

<script language="javascript">
user="milogin";
server="miservidor.com";
at="@"
document.write('<a href="mailto:'+user+at+server+'">');
document.write("Mi email es: "+user+at+server);
document.write("</a>");
</script>

Simplemente escribe la direccion de email en la página, xo los rastreadores no pueden ejecutar el código fuente en javascript, al menos todavía no.

Para los navegadores que no soporten javascript se puede utilizar la etiqueta noscript e incluir una imagen.

domingo, 6 de julio de 2008

Búsqueda en el historial de bash

Después de ejecutar una serie de comandos en la shell de linux es bastante probable que necesitemos repetir alguno anterior. Puede pasar además que sea largo o que tenga una mezcla de caracteres no muy cómoda de escribir.

Para esos casos existe en bash lo que se llama reverse-i-search, para probarlo hay que hacer lo siguiente.

- Ejecutar unos cuantos comandos largos en una shell de linux (si son largos mejor para el ejemplo).

- Pulsar ctrl + r, la shell cambiara y pondrá algo similar a (reverse-i-search)`':.

- Escribir las primeras letras de uno de los comandos.

Cuando te acostumbras es la mejor forma de acceder al historial de órdenes, mejor incluso que las flechas de arriba y abajo para ir recorriéndolo.

sábado, 5 de julio de 2008

Búsqueda incremental con javascript

Últimamente se ha puesto de moda en la mayoría de redes sociales y en otros servicios web un tipo de búsqueda incremental.

Esto quiere decir que si quieres buscar "blog", cuando llevas puesto "bl" ya te sale "blog" como sugerencia.

¿Cómo se puede implementar esto?
Seguramente la forma más sencilla y rápida es la siguiente. Como queremos una respuesta inmediata debermos procurar exigir lo mínimo posible al servidor y tener todos los datos en el cliente.

Así pues, para dominios reducidos (ej. tus amigos en tuenti) se hace que el servidor al generar la página genere un script en javascript dinámicamente con un vector que contenga los nombres de todos los elementos a buscar, así cuando empecemos a introducir letras la búsqueda se puede realizar rápidamente.

Para dominios mayores no se debería utilizar esta técnica, primero porque javascript no destaca por su velocidad y segundo porque el tamaño de la página generada puede ser excesivamente grande.