Category Archives: Linux

Pruning the Ubuntu MRU

Imagine a situation, e.g. a kitchen review, where you don’t want your customer or colleague to see a list of you recently opened files, especially those files you opened for recreational purposes. In Ubuntu, this list is a XML file recently-used.xbel, located in the user directory under ~/.local/share.

This file consists of bookmarks:

  <bookmark href="file:///home/ron/Downloads/liferay-portal-6.1.1-ce-ga2/readme.html" added="2013-02-23T19:04:53Z" modified="2013-02-23T19:04:53Z" visited="2013-02-23T19:04:53Z">
    <info>
      <metadata owner="http://freedesktop.org">
        <mime:mime-type type="text/html"/>
        <bookmark:applications>
          <bookmark:application name="nautilus" exec="'epiphany-browser %U'" modified="2013-02-23T19:04:53Z" count="1"/>
        </bookmark:applications>
      </metadata>
    </info>
  </bookmark>

Pruning here is done by analyzing the file extension of the href attribute, let’s get rid of .flv and .mp4 entries:

<?php
/**
 * Prunes the Ubuntu MRU file.
 * 
 */
class MRUPruner
{

    /**
     * Dom object
     * @var DOMobject
     */
    private $DOM;

    /**
     * XML file name
     * @var String
     */
    private $XML;

    /**
     * Loads XML into the DOM
     *
     * @param string $XML   XML File Name
     */
    function __construct($XML) {
        $this->XML = $XML;
        $this->DOM = new DOMDocument();
        $this->DOM->load($XML);
    } // __construct()

    /**
     * Prunes MRU by applying filters
     * @uses DOM
     */
    public function prune() {

        $elements = $this->DOM->getElementsByTagName('bookmark');
        $pruned = false;

        do {
            $pruned = true;
            foreach($elements as $element) {

                $tempDocument = new DOMDocument();
                $clonedElement = $element->cloneNode(true);
                $tempDocument->appendChild($tempDocument->importNode($clonedElement, true));

                $_href = $element->getAttribute('href');
                print $_href . PHP_EOL;

                // Delete:
                $pattern = '~.*\.(flv|mp4)$~i';
                if(preg_match($pattern, $_href) == 1) {
                    print '-->delete' . PHP_EOL;
                    $element->parentNode->removeChild($element);
                    reset($elements);
                    $pruned = false;
                    break;
                } // endif

                // another pattern block here...

            } // nexteach
        } while(!$pruned);

    $this->DOM->save($this->XML);
    } // prune()

} // class

$pruner = new MRUPruner('recently-used.xbel');
$pruner->prune();

All nodes with these file extensions in the href attribute are removed from the document, the document is written back to the MRU file. The pattern block can be replaced or enhanced by another. This code does not handle the blank lines coming from deleting elements.

Remember: Use this at your own risk; Backup your data before you manipulate it.

P.S.: Being a dyed-in-the-wool data collector, I do not simply delete entries, but save them in a database for further analysis…

Unable to resolve host

If you receive an error message like ‘unable to resolve host’, check, if your /etc/hosts file contains an alias for your hostname.

127.0.0.1 localhost hostname
127.0.1.1 hostname:domain hostname

or simply:

127.0.0.1 hostname

If your /etc/hosts file does not contain such entries, become root and make the appropriate entries.

The Debian Reference (sub 10.4 Domain Name Service (DNS) as of 2010 December) says:

“/…/ Some software (e.g., GNOME) expects the system hostname to be resolvable to an IP address with a canonical fully qualified domain name. /…/ If your system has a permanent IP address then use that; otherwise use the address 127.0.1.1. /…/”.

Disclaimer