martes, 15 de abril de 2014

My first ubuntu indicator

I was reading about Unity indicators and how to create one here and here and decided that I will give it a try, but and indicator of what? it must be something useful but not too complicated to implement because I want to keep things simple so I ended up create a touch pad indicator that will allow me to turn on and off the mouse pad of my laptop.

If you need to disable your touch pad of any reason take a look at this post

Requirements

Make sure that you have the package python-appindicator installed, you can install it using this command:
sudo aptitude install python-appindicator

We will also use pygtk and pynotify libraries.

The source code

My source is divided in two main sections the indicator menu items and the event handlers all defined inside one single class called TouchPadIndicator. You can find this indicator source code here: https://bitbucket.org/emont01/py-touchpad-indicator
The touch pad indicator constructor (__init__) is responsible for creating an appindicator.Indicator instance and setup the menu. This constructor also setup the indicator icon, I was not able to find a list of all possible icons but in some forums I found references to the Gtk Stock and to the folder /usr/share/icons/CURRENT_THEME where CURRENT_THEME is the name of theme actually in use, listing files on some folders under /usr/share/icons allows me to find this file name gpm-mouse-060.svg so figured that using "gpm-mouse-060" should work and it did at least in my computer, so if you can't see the indicator logo you can check that.
Setup the indicator menu is quite simple, you need to:
  • Create a gtk.MenuItem instance
  • Bind your instance to the correct event handler
  • Show the menu (make it visible), and
  • Add the menu item to the main menu
My indicator have two options, namely: "Quit" and  "Toogle touch pad".
Quit just call to sys.exit to terminate the execution
Toogle touch pad is the interesting part it uses a class called TouchPadDevice to detect the current touch pad status and also calls the notify function to show a nice information message.
The part that deals with the device status is inspired by this ask ubuntu answer

martes, 25 de marzo de 2014

Instalando ubuntu en una HP Envy 15-j003la

Recientemente tuve la oportunidad de installar Ubuntu en una HP Envy 15-j003la (especificaciones) en lo personal me gustaron mucho esos 12GB de memoria DDR3, el procesador Intel Core i7-4700MQ y la tarjeta de vídeo NVIDIA GeForce GT 740M... :-D

La verdad lo único malo que le pude ver es el SO que trae pre-instalado, el sistema operativo MS Win8 no me gusta pero para nada, así que me di a la tarea de instalar Ubuntu 14.10 ¡con el permiso del propietario claro!.

Todo este asunto me trajo recuerdos por que me tocó bajar la iso más reciente de Ubuntu, lo cual no hacía desde hace rato porque acostumbro actualizar el SO directamente; bueno suficiente charla empecemos con esto.

Primero lo primero
Hay que descargar la versión más reciente de Ubuntu al momento de redactar este post es la 14.10 Saucy Salamander
Ya que el procesador mencionado (i7-4700MQ) es de 64bits descargué: 64-bit PC (AMD64) desktop image

Mientras esperaba vi algunos capítulos de una serie...

Una vez terminó la descarga usé UNetBootin para crear un USB booteable, la mayoría de las portátiles modernas soportan arrancar desde un USB pero en este caso en particular es la única opción ya que la laptop no trae lector de CD/DVD/Blueray.

Use una utilidad llamada Disk2vhd  para hacer una imagen de la instalación actual, solo en caso de haga falta y esperando que funcione en una maquina virtual, pero eso es material para otro post.

La instalación
Todo parecía ir bien luego de que encontré la forma de seleccionar desde cual dispositivo deseaba arrancar la laptop, pero cualquier opción que seleccionaba me daba una pantalla negra sin texto, imágenes o errores así que supuse que alguna cosa no estaba cargando correctamente y leyendo algunas preguntas sobre modelos similares me dió la idea de que podría ser el acpi así que usé esta guía para apagar el acpi y pude iniciar ubuntu desde la USB y empezar a probar, el tema del acpi lo revisaré luego con calma.

En las configuraciones de sonido verifiqué que el microfono y las bocinas funcionaban bien, habilité los repositorios "universe" para installar cheese y probar la webcam... ¡todo bien!

Inicié la instalación y seleccioné que se instalaran los paquetes de terceros, ya saben para poder reproducir formatos como mp3.

Como ya se había intentado antes instalar ubuntu en la mencionada laptop las opciones del instalador fueron algo así como "reinstalar ubuntu", "borrar ubuntu" e "instalar al lado de la instalación anterior", me parecía que había una de usar todo el disco pero no salió entre las opciones así que opté por borrar manualmente, no puedo negar que sentí cierta satisfacción al eliminar todo rastro del anterior SO para hacer espacio para Ubuntu aunque luego el instalador esperaba que configurar manualmente el swap, la carpeta home y todo lo demás así que cancelé la instalación abrí gparted y borré todo el disco :D

Reinicié la instalación y esta vez si estaba la opción de usar todo el disco :D.

El resto es la usual selección de la zona horario, el teclado, el primer usuario y su contraseña.

Primer inicio de sesión
Después de esperar a que la instalación terminara reinicié la computadora y todo funcionó a la perfección.

sábado, 5 de octubre de 2013

Restaurar archivos desde el cache de un navegador

Este post está inspirado en How to recover a file in Google Chrome cache (gzipped or not) una guía que me salvó la vida, espero que esto le sirva a cualquier que pase por la misma situación en el futuro.

 

Contexto

Estaba trabajando en un web site con wordpress y necesitaba modificar un archivo php del tema que se estaba usando en ese momento, pero estaba realmente distraído con mi mente en otro lugar y aunque acostumbro hacer una copia del archivo antes de editarlo para poder dejarlo como estaba en caso de algo salga mal, esta vez no lo hice ¡GRAVE ERROR!

 

El problema

Reemplace el contenido del archivo de estilos principal (style.css) del tema con código php, para cuando me di cuenta de mi terrible error ya había guardado el archivo y no podía usar el historial de deshacer para restaurar el archivo a su forma anterior y entonces me doy cuenta de que no saqué la acostumbrada copia de respaldo. El problema era serio por que destruí un archivo importante y no tengo una forma obvia de restaurarlo y reescribirlo tomaría horas si es que era posible dejar todo como estaba...

 

La solución

Primero lo primero ¡No hay que entrar en pánico! se piensa mejor calmado.

Busqué en google por alguna forma de restaurar mi archivo y encontré que había una forma de recuperar lo usando la cache del navegador, como había estado revisando los cambios al sitio en varios navegadores a saber: chrome, firefox y opera tenía al menos una copia en la cache de alguno de esos, por supuesto no podía volver a abrir el sitio en uno de esos navegadores porque corría el riesgo de actualizar la cache y perder mi ultima esperanza de no tener que reescribir el contenido perdido por mi error.

Encontré en esta guía que existe un script mencionado aquí que te permite recuperar archivos de texto plano a partir del cache de firefox o chrome sin embargo en la primera guía dan una versión que permite recuperar archivos comprimidos usando gzip.

Para entrar al cache de firefox, chrome u opera debemos poner "about:cache" sin las comillas en el campo de dirección del navegador respectivo, a continuación algunos ejemplos de lo que muestran dichos navegadores:
  • firefox Version 24.0:
  • Chromium Versión 28.0.1500.71 Ubuntu 13.04 (28.0.1500.71-0ubuntu1.13.04.1):
  • Opera Version 12.16:
Los archivos disponibles se presentan (al menos en chrome) de la siguiente forma:

Lo que tenemos que hacer es escribir el siguiente script en un archivo php en nuestro disco duro y llamarlo por ejemplo restore.php:
<?php
// cache.log is a copy of chrome cache page with only the file content section
$cacheString = file_get_contents("cache.log");
$matches = array();
preg_match_all('/\s[0-9a-f]{2}\s/', $cacheString, $matches);
$f = fopen("t.bin","wb");
foreach ($matches[0] as $match)
{
  fwrite($f,chr(hexdec($match)));
}
fclose($f);

ob_start();
readgzfile("t.bin");
$decoded_data=ob_get_clean();
echo $decoded_data;

Luego escribimos el texto hexadecimal tomado del cache de nuestro navegador en un archivo llamado cache.log ubicado junto a restore.php, si deciden usar un nombre de archivo diferente al indicado deben ajustar el script restore.php.

Finalmente ejecutamos restore.php para obtener el archivo original (en la consola) a partir del archivo cache.log:
php restore.php

En mi caso particular usé el siguiente comando, para almacenar el texto en un archivo css:
php restore.php > style.css

 

Extra

Nunca se sabe cuando un script como este puede ser útil así que cree un proyecto en github y subí ambas versiones, a saber: la que recupera texto plano y la que recupera archivos comprimidos con gzip en un solo archivo que puede ser ejecutado de la siguiente forma:

php restore_from_cache.php > restored_file

 

Conclusión

  1. Siempre mira dos veces lo que estas editando para estar seguro que es el archivo correcto
  2. Aunque estés seguro de que es el archivo correcto siempre guarda un respaldo antes de hacer tus cambios
  3. En caso de desastre y si tienes la suerte de que tu o alguien más tenga el archivo en su cache puedes usar los scripts mencionados antes para recuperar el texto original
Al momento de escribir este post, veo que Opera 12.06 te muestra el contenido de los archivos en cache como texto legible en lugar de la versión en hexadecimal, así que si tienes el archivo en el cache de opera ¡que buena suerte! pero de todos modos quizás quieras extraer las versiones de los otros navegadores y compararla a antes de decidir cual usar.


Saludos y hasta la próxima.