jueves, 11 de agosto de 2011

[MySQL] intercambiar valores entre columnas

Tengo una tabla de usuarios en la que por error, determinados registros tienen intercambiados los valores correspondientes en las columnas de nombres y apellidos. Tras buscar por ahí, la solución que me ha parecido más comprensible, y que no utiliza variables temporales, es esta. En ella se utiliza la misma tabla con dos alias distintos, lo cual permite trabajar como si se tuvieran dos tablas distintas:

UPDATE usuario u1, usuario u2

SET u1.nombre=u1.apellidos, u1.apellidos=u2.nombre

WHERE u1.idUsuario=u2.idUsuario AND u1.departamento='Contabilidad'

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.

miércoles, 25 de noviembre de 2009

[Linux] ssh sin contraseña

Cuando hay que hacer muchas conexiones ssh a un servidor remoto, para ejecutar comandos o copiar archivos, es una lata tener que introducir la contraseña en cada ocasión. Podemos crear una relación de confianza en el servidor, hacia nuestro usuario desde nuestra máquina.

Llamaremos cliente a la máquina desde la que nos conectamos, y servidor a la que nos queremos conectar. Nuestro usuario también debe existir en el servidor, y si no deberemos usar el formato usuarioqueexiste@servidor en nuestras llamadas ssh. Todas estas operaciones las haremos desde el cliente, y en todas ellas nos pedirá nuestro password. Allá vamos:

Generamos un par de claves (con una sería suficiente, pero nos aseguramos de tenerlas para futuras necesidades), y reunimos sus partes públicas en un único archivo para enviarlas juntas al servidor:
ssh-keygen -t rsa
ssh-keygen -t dsa
cat .ssh/*pub >> claves
Si no existe, debemos crear un directorio .ssh (y lo podemos hacer por ssh):
ssh servidor "mkdir .ssh"
Nos pedirá la contraseña y ejecutará el comando. Después copiamos al servidor las claves que generamos al principio:
scp claves fulanito@servidor:.ssh/
y después volcamos las dos claves públicas al archivo donde realmente se nos otorga la confianza:
ssh servidor "cd .ssh; cat claves >> authorized_keys; rm claves"
Y esta será la última vez que nos habrá pedido la contraseña. Lo comprobamos:
ssh servidor
Et voilà, entramos sin que nos pida nada más.

Datos personales