martes, 30 de marzo de 2010

[Linux] Convertir y cambiar extensión de archivos

Tengo un montón de iconos en formato .png que debo convertir a .bmp para que sean utilizables por Access. Seguro que habrá algún programita en Windows que lo haga, pero prefiero tirar de consola en Linux, y de la aplicación convert que está contenida en el paquete imagemagick. Únicamente necesitamos indicarle el archivo de entrada y el de salida, y a partir de la extensión del segundo archivo, sabe qué tipo de conversión debe realizar.

En una única línea:
El problema de esta forma de hacerlo es que un archivo imagen.png se convertiría en imagen.png.bmp. Esta forma es la buena:
for i in *png; do convert $i $i.bmp; done

De este modo, bash recorta por la derecha la primera ocurrencia que contenga la cadena .png en la variable i, y posteriormente añade la extensión que nos interesa.
for i in *png; do convert $i ${i%.png}.bmp; done

El tiempo que requiere la conversión de 1000 iconos de 32x32 pixels, en un Debian virtualizado con VirtualBox (anfitrión Windows) es de 27 segundos.

lunes, 29 de marzo de 2010

[Access] Abrir un .mdb desde otro .mdb (y vuelta)

Tengo una aplicación en Access que debe ofrecer un número único de registro y después llamar a diversos formularios de distintos departamentos para que se procesen esos expedientes. Las necesidades de esos departamentos son muchas y variadas, con distintas tablas asociadas cada una de ellas. Una aplicación así en Access me da mucho miedo, porque puede crecer hasta el infinito (y más allá) con los correspondientes problemas de accesos concurrentes en red, bloqueos y demás.

La solución es crear una pequeña aplicación desde la que genero los números de registro, y con un formulario dotado de múltiples botones que llaman a las aplicaciones de cada departamento, cada una de las cuales reside en un .mdb (o .accdb) distinto con sus propios formularios y tablas. Al cerrar esas aplicaciones, se vuelve a abrir la principal, con lo que la sensación para el usuario es la de usar un único programa.

El código que pongo en la aplicación central es el siguiente:

Private Sub Comando0_Click()
    ' Definimos la aplicación que vamos a llamar, y la rodeamos de dobles comillas
    bdllamada = Chr(34) & "c:\caminocompleto\nombreBD.accdb" & Chr(34)
    ' Llamamos a Access, le decimos la BDD que debe abrir y le pasamos el parámetro
    ' correspondiente a la aplicación padre, a la que deberá volver después
    Call Shell("msaccess.exe " & bdllamada & " /cmd " & Application.CurrentDb.Name, vbMaximizedFocus)
    ' Activamos los eventos
    DoEvents
    ' Cerramos la aplicación actual
    DoCmd.Quit
End Sub

El quid de la cuestión está en el /cmd . Lo que va a continuación es un parámetro que se le pasa a la aplicación que se abre, y se puede rescatar mediante la función Command().

En la aplicación hija se incluye el siguiente código:

Public padre As String

Private Sub Form_Open(Cancel As Integer)
    ' Recogemos el parámetro que nos indica a dónde volver
    padre = Command()
End Sub
Private Sub Form_Close()
    ' Al cerrar, volvemos a llamar al padre
    Call Shell("msaccess.exe " & Chr(34) & padre & Chr(34), vbMaximizedFocus)
End Sub

jueves, 25 de marzo de 2010

[Linux] Aplicaciones preferidas

Estudio a distancia, y muchos de los recursos que nos proporcionan nuestros tutores son flash embebidos en páginas web. Suelo guardar esos archivos .swf para verlos con calma, incluso sin conexión a Internet.

Gnome se empeñaba en abrirlos con Totem, y lógicamente éste no era capaz de reproducirlos. Hacerlo mediante botón derecho->Abrir con->  tampoco creaba la asociación correcta.

El quid está en el directorio
$HOME/.local/share/applications

En él residen unos accesos directos que (creo que) se crean cuando abrimos algún archivo mediante "Abrir con". Y además, en el archivo mimeapps.list se encuentran las correspondientes asociaciones. De modo que al editarlo, nos encontramos con la línea:
application/x-shockwave-flash=totem.desktop;firefox.desktop;avidemux-gtk.desktop;

Eliminé las entradas que no me interesaban, y dejé solo la correspondiente a firefox:

application/x-shockwave-flash=firefox.desktop;

Y se acabó el problema.

Datos personales