All posts by admin

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…

PhpStorm: External resource is not registered

If you happen to get an error “External resource http://example.com/example.xsd is not registered” when validating an XML file in PphStorm, check, if the URI of your noNamespaceSchemaLocation is marked red. If so, this schema is simply not loaded.

Click in the line with your schema declaration und hit <ALT><ENTER>, choose “Fetch external resource” to load this resource. The URI of your noNamespaceSchemaLocation should be marked green now and your document can be validated.

Where is Firebug in the Popup Window?

After updating Firefox & co. on Ubuntu from the repositories, Firebug came with version 1.11.0 again with a recurring bug: Firebug was not available in Popup windows.

This bug was recently fixed (as described in fbug), but the fix is not in the release avaible from the Ubuntu repositories.

Fortunately, firebug can easily be built from source.

Get the source:

$ git clone git://github.com/firebug/firebug.git

In the extensions/ directory, check install.rdf for the source version (it worked for me with this version):

<em:version>1.11.0a4</em:version>

The fix can be identified in the extension/bootstrap.js file (around line 72), but actually covers more lines than displayed here.

// Listen for new windows, Firebug must be loaded into them too.
- Services.ww.registerNotification(windowWatcher);
+ Services.obs.addObserver(windowWatcher, "chrome-document-global-created", false);

Now build Firebug using ant:

ron@ron:~/firebug/extension$ ant
Buildfile: ~/firebug/extension/build.xml
...
deploy:
     [echo] Firebug version: 1.11.0a4 in ./release
BUILD SUCCESSFUL
Total time: 4 seconds

Finally install firebug/extension/release/firebug-1.11.0a4.xpi by opening it with Firefox, and hopefully enjoy Firebug in Popup windows.