jueves, 30 de octubre de 2008

Encodings: Strings "Windows-1252" en python

Me topé en:
http://noticias.iglesia.cl/noticia.php?id=7946
con un texto que tenía un guión misterioso que en el browser se ve como un guión un poco más largo que lo normal.
Descubrí que ese guión venía encodeado en "Windows-1252".

Al obtener el texto de esa página en un string en python, me fue deseable reemplazar ese guión por el guión normal.

Para ello, tuve primero que leer bien el string recibido desde la web:
html = html.decode('Windows-1252')

Luego, descubrir el código Unicode de ese caracter raro, usando la consola de python:
>>> u"–"
u'\u2013'


Finalmente, reemplazar ese guión por el guión normal:
html = html.replace(u'\u2013',"-")

miércoles, 29 de octubre de 2008

Sólo un login, con OpenID

SourceForge ofrece login usando OpenID, teniendo asociado, entre varios sistemas de login, el de blogspot.
Yo tengo login en blogspot, por este sitio de pildorascomputinas, por lo que lo ingreso en el login de sourceforge:




y como ya estoy logueado en blogspot, SourceForge usa esa sesión para validar el inicio de sesión en su sitio y me da la bienvenida!

Nota: La primera vez que me logueo de sea manera en SourceForge, me pregunta a qué login de SourceForge está asociado el login de blogspot.

Tuna news: Download History Statistics


No está mal...

viernes, 17 de octubre de 2008

SQL update para convertir data latin1 a utf8

En SQLyog, si queremos ver los datos de una tabla en latin1, ejecutar el sgte SQL:

SET NAMES 'utf8';

Ese comando se ejecuta por defecto al abrir una conexión en SQLyog.

Luego, para cambiar de latin1 a utf8 la data de un campo de una tabla:

update TablaTest set campotest=convert(CONVERT(CONVERT(campotest USING utf8) USING binary) using latin1)


Si vemos ahora los datos de la tabla veremos garabatos, pues quedaron en utf8. Para verlos bien, ejecutar:


SET NAMES 'latin1';


Refrescar los datos de la tabla en pantalla y lo que está almacenado en utf8 ahora se verá legible.

Cómo montar un directorio remoto por ssh en linux con fuse

Instalación de fuse y sshfs:

sudo apt-get install fuse-utils
sudo apt-get install sshfs
mkdir mihostmontado
sudo gpasswd -a pablo fuse

desloguearse y loguearse nuevamente

Ref:
http://ubuntu.wordpress.com/2005/10/28/how-to-mount-a-remote-ssh-filesystem-using-sshfs/

Ejemplo para montar:


sshfs mihost.cl:/var/www/html/misitio/ mihostmontado/


para desmontar:

fusermount -u mihostmontado/

Cómo hacer que SQLyog me hable en latin1 y a la BD en utf8

La magia es ejecutar en la ventana de Query de SQLyog el sgte comando:


SET NAMES 'latin1';


luego refrescar cualquier resultado que SQLyog haya entregado antes.

jueves, 16 de octubre de 2008

Plugins en Java

Java 6 ofrece la clase ServiceLoader, que permite cargar plugins en tiempo de ejecución.

Los plugins son objetos que implementan cierta interfaz. Por ejemplo, la sgte interfaz :


package plugintest;

public interface Saludador {
public abstract void saludar(String name);
}


Esa interfaz la podemos compilar en un .jar, para ser incluído en el proyecto principal y en el proyecto del plugin.

Entonces, en el proyecto del plugin, creamos la sgte clase que implementa la interfaz:


package plugintest.impl;

import plugintest.Saludador;

public class SaludadorIngles implements Saludador {

public void saludar(String name) {
System.out.println("hello "+name);
}

}


Luego, el proyecto del plugin lo compilamos como un jar para incluirlo en el proyecto principal.
Antes de compilar el jar del plugin, hay que crear, dentro de su directorio src, un directorio META-INF/services/ y allí, un archivo con las rutas de los plugins que implementan la interfaz. Para indicar qué interfaz implementan, ese archivo debe tener el mismo nombre que el nombre completo de la interfaz: plugintest.Saludador
El contenido del archivo debe tener una línea por cada ruta de plugin. En nuestro ejemplo el contenido será:

plugintest.impl.SaludadorIngles


Finalmente, en el proyecto principal incluímos el jar del plugin. Estos jars de plugins, en vez de dejarlos en el directorio lib, se pueden dejar en un directorio especial, ej: "plugins"

De esta manera, usando la clase ServiceLoader de java, podemos instanciar y usar los plugins. Ej:


public class Tester {

public static void main(String[] args) throws IOException {
ServiceLoader loader = ServiceLoader.load(Saludador.class,getClassLoader());
for (Saludador inst : loader) {
inst.saludar("Pablo");
}
}

private static ClassLoader getClassLoader(){
File dir = new File("plugins");
File[] files = dir.listFiles();
ArrayList urls = new ArrayList();
for (File file : files) {
System.out.println("agregando jar: "+file.getName());
try {
urls.add(file.toURI().toURL());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
URLClassLoader cl = new URLClassLoader(urls.toArray(new URL[0]));

return cl;
}

miércoles, 15 de octubre de 2008

RAE Simple: Mi primera aplicación en Google App Engine

Mi primera aplicación para GAE la subí a:
"http://rae.appspot.com"

Sirve para consultar en la RAE por los significados de palabras.
Por ejemplo, para obtener el significado de la palabra "diéresis", se puede acceder al link:
http://rae.appspot.com/diéresis

¿Cuál es la gracia?

1.- Entrega los significados de la palabra en un formato html simplificado, esto para ahorrar plata si se accede con un celular en que el cobro es por KB bajados.
Obtener los significados de una palabra desde el sitio de la RAE, sin contar imágenes ni css, ni js, cuesta entre 3KB y 13KB. En cambio, desde rae.appspot, cuesta entre 0.3KB y 3KB

2.- En Chile acceder al sitio de la RAE es lentísimo, en cambio, a las máquinas de google es muy rápido. Una simple prueba con el Apache HTTP server benchmarking, usando 10 tests resultó en:

"http://rae.appspot.com/saltar"
Requests per second: 2.12 [#/sec] (mean)

"http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_BUS=3&LEMA=saltar"
Requests per second: 0.61 [#/sec] (mean)

lunes, 13 de octubre de 2008

Cómo saber y cambiar el charset de un archivo en linux

Con el comando file y la opción mime se puede saber el charset de un archivo:

[pablo@mipc admin]$ file --mime test.html
test.html: text/plain; charset=iso-8859-1

Para cambiar el charset, con el comando iconv:

[pablo@mipc admin]$ iconv --from-code=iso-8859-1 --to-code=utf-8 test.html > test_new.html

miércoles, 8 de octubre de 2008

SQL select con count-if

By embedding an IF() function within a COUNT() function, you can gather several counts on the same table at once.

If you use an IF() function to evaluate the condition, and return NULL if it's false, you can collect both totals in a single query:

SELECT COUNT(IF(something="this",1, NULL)) AS somethingcount, COUNT(*) AS total FROM mytable;

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

lunes, 6 de octubre de 2008

Tuna news: ahora se visualiza bien en chrome

Ahora se puede usar chrome, además de Firefox3, para visualizar Tuna.
Una foto:




Tuna is a SSH-Tunnel Administrator to configure port forwardings, for Linux, Windows, and Mac. It has a web GUI for local or remote (if installed on server) management, on-hot setup and description of each forwarding, loopback IP support, encrypted passwords storage.
http://tunadmin.sourceforge.net/

jueves, 2 de octubre de 2008

Requests a otros Web Services con Google App Engine

En mis primeros pasos usando Google App Engine me encontré con la sorpresa de que, desde una aplicación web creada para correr en la gapp-engine, se puede hacer requests http a otros hosts, sin embargo sólo a puertos estándares: 80 (http) y 443 (https).

http://code.google.com/appengine/docs/urlfetch/