Ubuntu 10.4: Poner el botón de cerrar la ventana a la derecha

Ubuntu 10.4 acaba de salir. Básicamente yo vengo usando Ubuntu desde hace cosa de 4-5 años, y de momento estoy bastante contento.

El gran problema de este release de Ubuntu, a mi parecer, es que han cambiado los botones de control de ventana, y los han puesto a la izquierda, en vez de seguir manteniendolos a la derecha, que es lo que el 95% de los usuarios están acostumbrados.

En fin, que como no me gustaba, he indagado un poco, y la solución ha sido fácil e instantanea:

Hay que pulsar Alt+F2, ponemos el comando gconf-editor y le damos a Enter.

Una vez en el editor de configuraciones, en el desplegable de la izquierda buscamos la ruta app -> metacity -> general y  hacemos doble click en el campo que pone button_layout.

Símplemente hay que cambiar el campo de valor y poner lo siguiente:

menu:minimize,maximize,close

Se le da a cerrar/guardar, y ale, automaticamente las ventanas se reconfiguran.

Ya volvemos a tener los iconos a la derecha.


Recupero más de 17 mil fotos en una tarjeta SD corrupta

Pues sí. No voy a explicar los detalles, pero el caso es que por una razón u otra, estaba moviendo las fotos de una tarjeta SD al ordenador, cuando PAAAAM, reseteo del ordenador, con la consiguiente pérdida de las fotos.

Las fotos no estaban ni en el disco duro, ni en la propia tarjeta.  Putada :(

Cual fue mi asombro, cuando me propuse recuperar mis fotos, y en vez de las 69 fotos que yo quería recuperar, ¡¡recuperé 17 mil!!

Vale, para mi estaba claro que iba a recuperar del orden de 500 a 1000 fotos, pero 17 mil! La virgen santa! Mi vida entera en la tarjeta de memoria.

Para el que se encuentre en mi situación, a continuación os doy una pequeña ayuda.

Pasos para recuperar los datos de una tarjeta de memoria, tarjeta USB o disco duro.

El tema es que hay gente en el mundo que se lo ha currado bastante, y ha hecho herramientas superútiles y supersencillas para recuperar las fotos.

Me consta que existen programas para Windows, pero como yo uso Linux, pues voy a explicar lo que yo hice.

El primer paso, aunque es de sentido común, es no hacer ninguna operación con la tarjeta o el USB en cuestión. Nada de guardar nuevos archivos, porque podrías estar sobreescribiendo los que quieres recuperar. De hecho, lo mejor que puedes hacer, si tienes espacio suficiente en otro disco, es un volcado de memoria. Es decir, guardar TODA la memoria de la tarjeta, tal cual, en un archivo de tu disco duro. Hay programas especializados.

En mi caso, me descargué los paquetes  gddrescue y foremost de Debian/Ubuntu.

Lo primero, para generar la imagen, es ejecutar ddrescue sobre el dispositivo afectado, guardando el archivo en OTRO dispositivo (de no ser así, lo estaríamos sobreescribiendo y perderíamos los datos).

sudo ddrescue -r 3 /dev/<device>  /home/<user>/image.dd /home/<user>/image.dd.log

El segundo paso, una vez tenemos la imagen del disco, es usar algún programa para recuperar los archivos. En este punto hay muchas alternativas (ver enlaces de abajo para más detalles). Dado que yo quería recuperar únicamente archivos JPEG de la tarjeta, decidí usar el programa foremost.

foremost -v -q -t jpeg -i /home/<user>/image.dd -o /home/<user>/foremost/

El comando anterior busca archivos en JPG en el archivo image.dd y las imágenes encontradas se almacenan en la carpeta /home/<user>/foremost/

Tras 15-20 minutos, recuperé nada menos que 17579 archivos en JPG.  Por suerte para mi, los primeros 69 eran las fotos que yo quería ;)

Links interesantes:

Nota para los despistados y los precavidos:

Estos pasos no sólo sirven cuando te ha petado la tarjeta de memoria o el USB, también demuestran lo fácil que puede ser recuperar información de una tarjeta de memoria/USB/disco duro donde alguien se cree que borrando un archivo ya no vas a encontrar nada. Los datos siguen ahí hasta que los sobreescribas (o los borres con algún programa especializado).

, , ,

http_build_query para Python

Para quien le sirva, me he pasado un rato haciendo una función en python que fuera equivalente a http_build_query de PHP.

##
# Mimics the behaviour of http_build_query PHP function
# This method can be useful for sending data to flash applications
##################################################
def http_build_query(params, topkey = ''):
  from urllib import quote
 
  if len(params) == 0:
    return ""
 
  result = ""
 
  # is a dictionary?
  if type (params) is dict:
    for key in params.keys():
      newkey = quote (key)
      if topkey != '':
        newkey = topkey + quote('[' + key + ']')
 
      if type(params[key]) is dict:
        result += http_build_query (params[key], newkey)
 
      elif type(params[key]) is list:
        i = 0
        for val in params[key]:
          result += newkey + quote('[' + str(i) + ']') + "=" + quote(str(val)) + "&"
          i = i + 1
 
      # boolean should have special treatment as well
      elif type(params[key]) is bool:
        result += newkey + "=" + quote (str(int(params[key]))) + "&"
 
      # assume string (integers and floats work well)
      else:
        result += newkey + "=" + quote (str(params[key])) + "&"
 
  # remove the last '&'
  if (result) and (topkey == '') and (result[-1] == '&'):
    result = result[:-1]
 
  return result

, ,

Truco Manso: Detectar el sistema operativo en PHP

Los motivos pueden ser diversos, y se podría abrir un debate. En cualquier caso yo no voy a entrar en los porqués, pero a veces resulta útil saber el sistema operativo en el que corre la web, ya que dependiendo de éste, se pueden realizar algunas optimizaciones, o ejecutar algunos u otros comandos, o símplemente puede resultar interesante a nivel informativo, en cualquier caso, lo normal es que no te haga falta jamás saber el sistema operativo en el que está ejecutandose tu código PHP.

Suponiendo que te hace falta, hay dos formas de saber el sistema operativo. La primera, y más completa, es mediante la función php_uname. La función php_uname es similar al comando uname de linux, y con esta podemos saber el sistema operativo y la versión del mismo, el número de release del SO, el nombre del host y la arquitectura del ordenador. Completito completito.

Por otra parte, si no queremos calentarnos la cabeza, y sólo queremos saber el sistema operativo, se puede usar la constante PHP_OS. Más sencillo, pero en la mayoría de los casos será suficiente (el equivalente sería php_uname(‘s’)).

echo php_uname() . "\n";
echo PHP_OS . "\n";

, , ,

Continuar subiendo un fichero con scp

Si estabas subiendo/copiando un fichero, con SCP, y la conexión se ha ido a tomar viento fresco… habrás observado que si vuelves a ejecutar el mismo comando con SCP, el fichero vuelve a enviarse enterito, por lo que si el archivo ocupa un par de gigas, y tenias subido giga y medio, pues cuanto menos, te vas a cabrear.

El “truco” para seguir subiendo el archivo, y que continue con lo que le queda, es usar rsync:

rsync -rsh=ssh --partial --progress <src-path> <dest-path>

o equivalentemente:

rsync -rsh=ssh -P <src-path> <dest-path>

Espero que os sea útil, al igual que me ha sido a mi ;)

, ,

Photoshop: Content-Aware Fill

Impresionante video de una de las cosas que va a poder hacer la siguiente versión de photoshop con un click.

Para los más desesperados, podeis ir al minuto 2:50 para ver como elimina por completo el árbol de la escena, con un click.

Es sorprendente la de cosas que se pueden hacer ya…

Visto en John Nack on Adobe

,

[SOLUCIONADO] Uploadify y los problemas con las sessiones

Uploadify es un magnífico plugin para jQuery que te permite subir varios archivos a la vez mediante flash, de forma totalmente transparente (podeis ver una demo en este enlace).

Realmente, la gran ventaja que yo le veo no es la de subir varios archivos a la vez,esto ya se puede hacer con javascript a pelo, la gran ventaja es que añade una barra de progreso para que el usuario no se desespere.

Además de subir archivos, también se pueden mandar otros datos a la vez que se suben las imágenes (usando scriptData). Lo cual puede ser muy útil si se quiere por ejemplo, mandar los datos de un formulario a la vez que se sube un archivo.

El gran inconveniente de uploadify, es que manda cada archivo por separado. Es decir, si quieres subir 30 archivos, manda cada archivo en una petición HTTP distinta. El problema no es la velocidad, puesto que se pueden paralelizar las subidas, el problema son las distintas peticiones si tienes que adjuntar datos. El hecho de que sean distintas peticiones complica un poco la lógica en el servidor en según que casos…

En fin, recientemente he usado uploadify en un proyecto donde los usuarios debían estar registrados para poder subir archivos. Claro, registrados y logueados en el sistema. El tema es que tras implementar la subida de archivos, no funcionaba… y no funcionaba… y casi me vuelvo loco, hasta que me di cuenta de que uploadify no envia las cookies, y  lógicamente sin cookies el servidor no tiene forma de cargar las variables de sesión, y por tanto, de saber qué usuario está intentando subir qué, y dado que el servidor no tiene forma de saber si es o no un usuario registrado, devuelve un mensaje de error. Total, que una vez detectado el problema de las cookies la solución ha sido simple.

La solución para mantener la sesión con uploadify (y en general cuando el cliente no tiene cookies), es añadir a la URL de subida el nombre de sesión y el identificador de sesión.

En PHP añadir esto a la URL sería algo, tal que:

$url = $url . '?' . session_name() . '=' . session_id();

Una vez hecho esto, problema resuelto ;)

, , , ,

Nueva web para jugar a juegos Flash

Hace tiempo que tenía en mente hacer una web de juegos. Al final me he decantado por juegos en Flash.

La verdad es que últimamente ando bastante liado con otras cosas que no tienen nada que ver con los juegos, pero este Sábado pasado, a medio día, me puse un reto personal. Me dije: “A ver si soy capaz de hacer la web antes de que acabe el fin de semana”.

Así que, dicho y hecho. Ha nacido NextGameGen.

He hecho toda la web (incluso la parte que se encarga de subir los juegos) entre el Sábado por la tarde (unas 4 horas), el Domingo por la mañana (otras 4 horas) y el Domingo por la tarde/noche (otras 8 horas). Como no podía estar el 100% del tiempo delante del ordenador, cuando estaba era en plan superintensivo.

La verdad es que estoy bastante contento con el resultado. En 16 horas una web de juegos desde cero. Únicamente le he dedicado 45 minutos más hoy, para añadir los botones de compartir en Facebook & amigos, poner algo de publicidad, y corregir 4 bugs tontos.

Sé que hay muchas cosas mejorables (todo llegará), y que hay un par de bugs invisibles para el ojo humano, pero de momento el que quiera ya puede jugar. La web es 100% funcional.

Incluso recomienda algunos juegos relacionados, según el juego al que juegues (el algoritmo es bastante mejorable).

Pues nada más, ahora voy a ver si aumento las visitas de mi web con ShareUsers, que para los que no lo conoceis, es una web cojonuda para intercambiar enlaces de forma gratuita y automática y conseguir muchas más visitas (ya os contaré más sobre esto).

Lo dicho, podéis viciaros un rato en la web de juegos, y aquí estoy para cualquier crítica o sugerencia que querais hacer ;)

, , , ,

CocoManso: FIXME y TODO

Hola amigos, soy Coco y hoy os voy a contar la diferencia entre poner un comentario con FIXME y poner un comentario usando TODO.

  • FIXME: debe ser usado cuando es un hack, una constante hardcodeada o algo crítico, y que debe ser eliminado antes del próximo release. Normalmente los FIXME, bien usados, sirven para avanzar en el desarrollo y prototipado de la aplicación.
  • TODO: debe ser usado cuando supone una mejora, o cuando hay que realizar algún cambio mas o menos complejo, pero uno no tiene ganas de hacerlo en ese momento (hay gente que abusa mucho de esto, y mejor no miro a nadie).

Recuerda, si es algo crítico y el software no puede ser publicado sin corregir eso, usa FIXME, por el contrario, si el comentario que pones, no afecta para nada el buen funcionamiento del programa, y el programa va a seguir funcionando bien, puedes estar cómodo dejando el comentario como TODO.

, ,

Efecto de click para jQuery

Hoy he estado haciendo unos cuantos experimentos con javascript. La verdad es que no he llegado a donde quería llegar, pero voy a asumir que es debido a que mi capacidad de diseño está atrofiada (y por suerte compensada en otras habilidades).

En fin, lo que estaba intentando hacer es algo como un efecto de click. Me explico. Lo que quería que ocurriera, es que cuando el usuario hiciera click en un enlace, se produjera como una especie de linea de expansión. Pongo un ejemplo. Has visto el tipico anuncio de la Wii, donde al principio aparecen como tres o cuatro círculos concéntricos que se dispersan hasta desaparecer? Pues algo así, pero para cuando el usuario hiciera click con el ratón en una web.

Al final de trastear un rato, hacer unos cuantos experimentos con imágenes, y seguir trasteando con animaciones sencillas, creo que he llegado a una primera aproximación que mas o menos se parece a lo que yo quería.

Básicamente, el ejemplo tiene 2 fragmentos interesantes (tampoco hay más en el html):

El primer fragmento es el que asocia el evento de click a todos los elementos que tienen la clase ‘clickable-round’. Cuando hagas click dentro de un elemento de esa clase, aparecerá un círculo que se irá difuminando.

$('.clickable-round').click (function (event) {
 $(event.currentTarget).jSimulateClick (event.pageX - 1, event.pageY - 1, 'round');          
});

El segundo fragmento, asocia el evento de click a los elementos de la clase ‘clickable-square’. Cuando hagas click en cualquiera de estos elementos, el efecto será similar al anterior, pero en vez de mostrar un círculo, mostará un rectángulo que va, desde donde hayas hecho click, hasta cubrir el área del elemento en cuestión:

$('.clickable-square').click (function (event) {
  $(event.currentTarget).jSimulateClick (event.pageX - 1, event.pageY - 1);          
});

Si quieres trastear el plugin, los parámetros con los que se puede trastear son el color del borde, el tamaño inicial del borde, la duración de la animación, …

Este javascript se puede usar para aplicaciones personales, comerciales y para lo que se quiera.

Finalmente, agradecería cualquier comentario para mejorar el efecto.

, , ,

prev posts prev posts