Development
The libferris virtual filesystem
The Unix mantra "everything is a file" gives you great flexibility over where you store your data and how information is manipulated and replicated. Unfortunately, many things in Unix and Linux are not files, or ones that you might want to interact with anyway. For example, a PostgreSQL database is ultimately stored in a collection of binary files though you probably wouldn't want to interact with those files directly. Instead of storing settings in a collection of tiny files, many applications use XML to store settings in a single file but then have to deal with parsing XML instead of just reading little files. libferris lets you mount both PostgreSQL and XML and provides you with a useful way to interact with the data contained in both as a virtual filesystem.
Other operating systems like Plan 9 pushed the envelope further than Unix, making more things "just a file". Unfortunately, to use Plan 9 you had to abandon your trusty old Unix roots and jump to an entirely new operating system.
I started the libferris virtual filesystem project back in 2001 to push the "everything is a file" concept further, it was all implemented on a Linux base. Libferris is a virtual filesystem implemented as a shared library with FUSE bindings. Because FUSE is already in the Linux kernel you don't have to do any kernel patching to use libferris. Because libferris is a shared library and not in the kernel, it can use other libraries to help it mount data sources like XML, relational databases and Emacs to name a few. And as an upshot of being out of kernel, I can work on letting libferris mount anything I like no matter how strange it might be without any third party approval.
There are actually two ways to use libferris -- through a native C++ interface and using the normal Unix APIs with FUSE. The FUSE interface is very useful if you want to rsync(1) some structured information from an XML file into a PostgreSQL database. Just mount them both with FUSE and rsync away. Another few interesting things you can do with the FUSE interface is expose data as a virtual office document using XSLT stylesheets that libferris processes for you as well as geotagging with Google Earth.
The design of libferris revolves around two primitives: exposing file contents as C++ std::iostreams, and rich metadata support through an interface similar to Extended Attributes (EA) attr_get(3). Since then libferris has gained sophisticated support for indexing both the full text contents of files as well as their metadata. Libferris is written in C++ and aims to take full advantage of the language. Interfaces are designed to be as easy to pickup for C++ programmers as possible, for example, displaying a directory can be done using iterators, find(), begin() to end() etc.
Both the types of things that libferris can provide as virtual filesystems and the metadata handling are done through a plugin interface. The handling of metadata is done through the Extended Attributes (EA) interface. This EA interface is also virtualized -- if you write an attribute to file:///foo/bar and the kernel filesystem supports extended attributes, then the value will be saved in a kernel level EA using attr_set(3). On the other hand if file:///foo/bar happens to exist on a network filesystem that does not support EA, then your value is saved in RDF by libferris. In both cases the value can be read again using an identical interface.
Looking at filesystems in an abstract way -- a hierarchy of files, file contents, and metadata associated with files and directories as key-value pairs -- there is somewhat of a resemblance to the data model of XML. Although there are obvious differences: XML elements can have multiple text nodes as contents, an XML element does not need to have specific unique names for each child XML element and so on. In many cases it can be advantageous to smooth over the differences and view a filesystem as XML and vice versa. Over the years libferris has gained the ability to interact with it's virtual filesystems as virtual Document Object Models (DOM)s. The reverse is also true, you can take an xerces-c DOM and interact with it as a virtual filesystem. Using virtual DOMs makes it easy to create a view of a filesystem using a browser and XSLT. See xml.com for information on using XQuery against a libferris virtual filesystem.
The ability to mount XML and Berkeley db4 data as filesystems has long been a part of libferris. If you want to store a filesystem inside a platform independent format, then using XML is great, whereas the speed of individual file look up in a Berkeley db4 database of many many file records can come in handy. Each format has its advantages, but they are all just virtual filesystems as far as libferris is concerned.
When a filesystem can offer what it likes through key-value pairs (EA) associated with files, relational databases can also be viewed as a virtual filesystem. Databases, views, tables and result sets become directories, tuples become files named by the value of their primary key, and the individual values of tuples are exposed as Extended Attributes on their tuple file. Again, PostgreSQL appears just like another virtual filesystem. For relational data there are a few caveats, for example, to create a new "file" in a table you must supply at least the primary key EA as well as any EA which are explicitly marked "not null" in the database.
Libferris will automatically mount many filesystems for the user. For example, if you try to read an XML file as though it is a directory then libferris will implicitly mount it as one for you. This does blur the lines between what is a directory and what is a file in the system. There is some additional metadata that libferris makes available if you would like to avoid the automatic mounting. For example, if you wish not to descend into XML files then read the is-file metadata and if it is true do not attempt to descend into the file.
One of the motivations for creating libferris as a project of its own was to be able to expose anything that I felt could be interacted with in an interesting manner as a filesystem as one. So libferris can mount some things that folks might not think of as filesystems -- including Firefox, Emacs, DBus, LDAP, Evolution, Amarok, klipper, xmms, X Window System and gphoto2.
The metadata plugins for libferris currently support extracting information from file formats automatically, for example, EXIF, XMP and ID3 tags. Metadata overlays are also supported, so you can see what tags you have associated with an image in f-spot through extended attributes in libferris. I use the term overlays because a central repository of tag data (in this case from f-spot) is scattered over an entire filesystem in libferris. The lower level metadata plugins handle more standard extended attributes usage, for example using attr_set(3) to store values or saving them in RDF.
Many of the standard utilities have been rewritten to use the native libferris API and take advantage of extra features it offers. Things like ls, cp, mv, rm, cat, io-redirection, touch, head and tail all have native libferris versions which are shipped with the main tarball. These all also serve as code samples for how to use the libferris API. Extensions to the normal clients include the ability to output directory listings in XML for ferrisls, ferriscp has the ability to use memory mapped IO as well as the more standard open(), read() and write() calls to perform the copy. Using memory mapped IO this way also uses the madvise(2) MADV_SEQUENTIAL call to let the kernel correctly select caching policy.
The indexing support in libferris is also handled using plugins. Two different indexing plugin types exist; full text and metadata. There are two types of plugin, because the strategy for how to create an index can be quite different depending on if you are performing a search for some words in a document text or if you wish to find files with certain metadata values. Using inverted files can be great for resolving a ranked full text query for "alice wonderland" but finding all files in either my home directory or /pictures that have been modified in December 2008 can be solved in a number of ways.
There are currently indexing plugins for CLucene, Lucene, LDAP, Federations of other libferris indexes, ODBC, PostgreSQL, Redland (RDF), Xapian, Beagle, Strigi and some custom designs. There are likely to be more index plugins explicitly designed to work on NAND Flash in the future. Those interested in indexing and libferris should see this article.
A major advantage of closely combining the index and search operations into the virtual filesystem is that anything the virtual filesystem can see can be indexed. When searches are performed you should also be able to interact with any of the results as a virtual filesystem. This avoids the issue where a discrete search library might return a URL that the client can not do anything with.
So, what does it look like to code using libferris? Most objects in ferris are smart pointers, many using intrusive reference counting. The type for such objects is prefixed with "fh_" to indicate a ferris handle. The notion of files and directories is amalgamated into a single "Context" abstraction. To get a smart pointer to a filesystem path the Resolve() function is used. So without further ado, to get a file and its metadata with libferris:
fh_context c = Resolve( "~/myfile" ); { // let the scope close it for me fh_istream ss = c->getIOStream( ios::trunc ); ss << "Bah!" << endl; } // std::string getStrAttr( fh_context, eaname, default-value, ... ) string filename = getStrAttr( c, "name", "" ); string md5sum = getStrAttr( c, "md5", "" ); cout << "the filename should be myfile:" << filename << endl; cout << "the md5 checksum is:" << md5sum << endl; setStrAttr( c, "foo", "bar" ); fh_attribute a = c->getAttribute("foo"); fh_istream ass = a->getIStream(); cout << "Getting the metadata again:"; copy( istreambuf_iterator<char>(ass), istreambuf_iterator<char>(), ostreambuf_iterator<char>(cout)); cout << endl;
Libferris is steadily gaining commercial interest. Currently I provide things like custom builds of libferris, explicit support for new test cases in the core regression test suite that are important to clients and of course extensions to libferris to perform a specific task that might be desired.
There are packages available for both 32 and 64-bit Fedora 8, 9 and Ubuntu 7.10 gusty as well as 32bit packages for openSUSE 10.3. Unfortunately there is currently a bug in building 64bit stldb4 on openSUSE. Install the libferris-suite package to pull in all the dependencies.
Feel free to email the witme-feris mailing list or add comments to this article suggesting any weird and wonderful (and obscure) filesystems you have experienced in the past. Though my libferris.TODO file always grows more than it shrinks, I'm always happy to add new and exciting suggestions near the top of it.
System Applications
Database Software
Firebird 2.0.5 Release Candidate 1 is out
Version 2.0.5 Release Candidate 1 of the Firebird DBMS has been announced. "This sub-release introduces some more bug fixes and vulnerability closures backported from V.2.1.2 development. It does not add any new functionality to the database engine. One fix of note is that DummyPacketInterval behaviour, broken since v.2.0, has been fixed."
PostgreSQL Weekly News
The November 16, 2008 edition of the PostgreSQL Weekly News is online with the latest PostgreSQL DBMS articles and resources.
Device Drivers
DeviceKit 002 announced
Version 002 of DeviceKit has been announced. "DeviceKit is an abstraction for enumerating devices and listening to device events. Any application on the system can access the org.freedesktop.DeviceKit service via the system message bus. On GNU/Linux, DeviceKit can be considered a simple D-Bus frontend to udev(7)."
Filesystem Utilities
Clonezila live: 1.2.1-17 (stable) released. (SourceForge)
Stable version 1.2.1-17 of Clonezila, a live-disk partition management and disk cloning utility, has been announced. "This release is based on Debian Lenny with Kernel 2.6.26-8. A Simplified Chinese interface was added. An option to reboot or shutdown after clone is finished was added. Hardware and software info will be saved in a clonezilla image. An option to generate MD5 or SHA1 checksums after an image was saved was added. Running on serial console ttyS0 is supported. Some more info will be saved in image dir. Some bugs were fixed."
Networking Tools
Announcing Monkeysphere - a mechanism to use PGP keys with SSH
The Monkeysphere project has been launched. "The Monkeysphere enables you to use the OpenPGP web of trust to verify ssh connections. SSH key-based authentication is tried-and-true, but it lacks a true Public Key Infrastructure for key certification, revocation and expiration. Monkeysphere is a framework that uses the OpenPGP web of trust for these PKI functions. It can be used in both directions: for users to get validated host keys, and for hosts to authenticate users."
Security
Metasploit Framework 3.2 released
Version 3.2 of Metasploit Framework has been announced, it adds some new capabilities. "The Metasploit Project announced today the free, world-wide availability of version 3.2 of their exploit development and attack framework. The latest version is provided under a true open source software license (BSD) and is backed by a community-based development team."
Telecom
Patent hassles for OpenMoko
On November 12, the OpenMoko project announced that all of its system images had been removed from the download server. When users asked about what was going on, the answer that came back was: "The short story is that we are in a protracted battle with some patent trolls. Google for Sisvel. In order to get ourselves in a stronger position, we want to make sure no copies/instances/whatever of patent-infested technologies like MP2 and MP3 exist on our servers. Our phones never shipped with end-user MP3 playback features, but we want to use this opportunity to make sure it's not even in some remote place somewhere." The OpenMoko project did not need to run into this particular hassle.
Web Site Development
Django 1.0.1 released
Version 1.0.1 of the Django web development platform has been announced. "Following the previously-announced schedule, today the Django team has released Django 1.0.1. This is a bugfix-only release containing fixes and improvements to the Django 1.0 codebase, and is a recommended upgrade for anyone using or targeting Django 1.0."
Miscellaneous
Hatta 1.0.0 wiki engine released
Version 1.0.0 of Hatta has been announced. "Hatta is a small wiki engine designed to run locally or via WSGI inside a directory in a Mercurial repository. All the pages are normal text or binary (for images and such) files, also editable from outside of the wiki -- the page history is taken from the repository."
systemtap 0.8 release
Version 0.8 of systemtap has been announced, it includes new features and bug fixes. "SystemTap provides free software (GPL) infrastructure to simplify the gathering of information about the running Linux system. This assists diagnosis of a performance or functional problem. SystemTap eliminates the need for the developer to go through the tedious and disruptive instrument, recompile, install, and reboot sequence that may be otherwise required to collect data."
Zenoss: 2.3 Now Available (SourceForge)
Version 2.3 of Zenoss, an enterprise network and systems management application written in Python/Zope, has been announced. "Zenoss 2.3 includes improvements in Windows and Java application monitoring as well as native VMware management for Zenoss Enterprise Edition. We are also taking the opportunity to highlight over 30 new ZenPacks developed by the Zenoss community for expert monitoring of Asterisk PBX, Brocade Switches, Cisco Security Appliance, and many more."
Desktop Applications
Audio Applications
LV2 Revision 3 announced
Revision 3 of LV2 has been announced. "LV2 is a standard for plugins and matching host applications, mainly targeted at audio processing and generation. LV2 is a simple but extensible successor of LADSPA, intended to address the limitations of LADSPA which many applications have outgrown. This revision changes the data portion of the specification only (i.e. lv2.h is unchanged)."
SLV2 0.6.1 announced
Version 0.6.1 of SLV2 has been announced. "SLV2 is a library to make the use of LV2 plugins as simple as possible for applications. Changes this release: - I18N support, courtesy Lars Luthman - New functions: slv2_port_get_value, slv2_instance_get_extension_data - Fix slv2_plugin_get_supported_features - Fancy new build system - Some Mac portability stuff I think? Probably some other stuff too".
Business Applications
YaMA 1.5 released
Version 1.5 of Yet Another Meeting Assistant (YaMA) has been announced. "Whats New in version 1.5 : 1. Evaluate suitability of Action Items for Export 2. Ability to specify custom meeting type 3. Ability to Parse Actions from previous Minutes 4. Display TimeZone"
Desktop Environments
GNOME Software Announcements
The following new GNOME software has been announced this week:- GNOME Power Manager 2.24.2 (bug fixes and translation work)
- gnome-speech 0.4.22 (bug fix)
- gnoMint 0.6.0 (new features and bug fixes)
- GTask 0.1.2 (initial release)
KDE Commit-Digest (KDE.News)
The October 12, 2008 edition of the KDE Commit-Digest has been announced. The content summary says: "More improvements in KBruch as part of a Brazilian student projects initiative. Ability to search by "HD Catalog Number" in KStars. Initial Kross support in the Rocs educational tool. Multiple projection support in the Marble Plasmoid. Preliminary support for editors in Klotz (formerly KLDraw). Ability to change the alignment of the window title in the Oxygen window decoration..."
KDE Software Announcements
The following new KDE software has been announced this week:- cpdu 0.3.3b (new feature and bug fixes)
- cpdu 0.3.31b (new feature and bug fixes)
- Hyper Video Converter 0.4.1 (mostly cosmetic changes)
- kdesvn 1.2.2 (kde4 port release)
- K Menu Gnome 0.8.1 (new features and translation work)
- KRadioRipper 0.4.5 (new features, bug fixes and code cleanup)
- ktikz 0.7 (new features and bug fixes)
- KTorrent 3.1.5 (bug fixes)
- KTorrent 3.2beta1 (new features and code cleanup)
- MadWin 0.04 SE (unspecified)
- Opeke 0.3 (new features and code cleanup)
- pacsermen 1.0 (initial release)
- Simple Root Actions Menu 1.4.1 (new feature and translation work)
- Simple Root Actions Menu 1.4.2 (bug fix and translation work)
- SMILE 0.8.8 (bug fix and translation work)
- SMPlayer 0.6.5 (new features)
- Soitin 1.0 (unspecified)
- Soitin 1.1 (new features and bug fixes)
- Soitin 1.1.1 (new features and bug fixes)
Xfce 4.6 Beta 2 released
Version 4.6 Beta 2 of Xfce, a light weight desktop environment, has been announced. "The second Beta was delayed for 2 weeks, but it was worth it. every feature we made a freeze-exception for has made it into this release. This means a lot of bugs have been fixed this time as well".
X server 1.6 release schedule announced
The release schedule for X server version 1.6 has been announced by Keith Packard. "I volunteered to manage an X server 1.6 release, tentatively scheduled for the end of the year (yes, this year, 2008). This release will include DRI2 and RandR 1.3 support. I'd like to know how much of the new Xinput stuff will be ready in time."
Xorg Software Announcements
The following new Xorg software has been announced this week:- libXi 1.1.4 (bug fixes and code cleanup)
- xf86-input-evdev 2.0.8 (bug fix)
- xf86-input-evdev 2.1.0 (bug fixes)
- xf86-input-synaptics 0.99.1 (new features, bug fixes and documentation work)
- xf86-input-vmmouse 12.6.2 (code cleanup)
- xf86-video-intel 2.4.3 (bug fixes and code cleanup)
- xf86-video-intel 2.5.1 (new features, bug fixes and code cleanup)
Desktop Publishing
LyX 1.5.7 is released
Version 1.5.7 of LyX, a GUI front-end to the TeX typesetter, has been announced. "This is the sixth maintenance release in the 1.5.x cycle and it is expected to be the final release in this series, since a new series of stable releases has just been introduced by our new major release, LyX 1.6.0. Besides the obligatory bug fixes, the main feature of this release is the ability to read files created by LyX 1.6.0 (this feature requires python 2.3.4 or newer). All users who intend to stick with the 1.5.x series for the time being are encouraged to upgrade to this version."
Financial Applications
Tryton ERP 1.0 released
Version 1.0 of Tryton ERP has been announced. "This is the first release of Tryton, a fork of OpenERP (formally known as TinyERP). This release is the result of 8 months of intensive work which consist of the rewrite of all modules (including contact, sale, purchase, invoice, analytic and general account and inventory management) and some parts of the core features. It is available in four languages (English, French, German and Spanish)."
Games
Shoot Out: Linux source demo released (SourceForge)
A demo release of Shoot Out has been announced. "Shoot out is a arcade shooter similar to galaga or space invaders using SDL. The demo for ShootOut is finally release. The download is the linux tarball at the moment."
WFMath 0.3.8 released
Version 0.3.8 of WFMath has been announced. "WFMath, or the WorldForge Math librarys main focus is geometric objects, and it has classes for several shapes as well as the basic math objects, points, vectors, matrices and quaternions. It is required by all WorldForge components. This release is aimed at all developers. Changes in this version: * The source has been updated to build cleanly on modern compilers. * The build files have been updated to work better with modern tools."
Interoperability
odf-converter-integrator: version 0.2.0 released (SourceForge)
Version 0.2.0 of odf-converter-integrator has been announced. "odf-converter-integrator is an easy way to open Microsoft Office 2007 files (also called Office Open XML, .docx, .xlsx, and .pptx) with a high-quality conversion on any Linux or Windows system in any OpenOffice.org. The odf-converter-integrator releases 0.2.0. Highlights in this release are OdfConverter 2.0 which improves the performance and accuracy of file conversions. Also changes in the integration improve the compatibility with Linux distributions."
Mail Clients
Sylph-Searcher 1.1.0 released
Version 1.1.0 of Sylph-Searcher has been announced. "Sylph-Searcher is a program that enables fast full-text search of messages stored in mailboxes of Sylpheed, or normal MH folders."
Medical Applications
Open Source Ultrasound System from South of France (LinuxMedNews)
LinuxMedNews reports on an open-source ultrasound system. "As Vincent reported in his post "Medical GNOME", the French company Supersonic Imagine (founded in 2005) just announced its next-generation ultrasound system for breast lesion imaging that will come with mostly Open Source software components. The new system is called Aixplorer."
Multimedia
Elisa Media Center 0.5.18 released
Version 0.5.18 of Elisa Media Center has been announced. "The release cycle for this version was exceptionally two weeks instead of one to fit a lot of important changes (some of which are visible, some not but nonetheless important). This release brings its usual lot of bug fixes and exciting new features.."
Music Applications
Tapeutape 0.1.1 and Tranches 0.1.1 announced
Versions 0.1.1 of Tapeutape and Tranches has been announced. "I've released new versions of Tapeutape (virtual sampler) and Tranches (beatrepeat/redirect/rearrange). There are also tutorials for both of them."
Office Applications
pyspread 0.0.10 released
Version 0.0.10 of pyspread has been announced, it features a code rewrite and bug fixes. "Pyspread is a 3D spreadsheet application. Each cell accepts a Python expression and returns an accessible object. Python modules are usable from the spreadsheet table without external scripts."
Web Browsers
Firefox 3.0.4 and 2.0.0.18 now available for download
Versions 3.0.4 and 2.0.0.18 of the Firefox browser have been announced. "As part of Mozilla Corporation's ongoing stability and security update process, Firefox 3.0.4 and Firefox 2.0.0.18 are now available for Windows, Mac, and Linux as free downloads".
Languages and Tools
C
GCC 4.4.0 Status Report
The November 17, 2008 edition of the GCC 4.4.0 Status Report has been published. "We are now in regression and documentation fixes only mode. When the number of P1 bugs drops to zero and the number of P1, P2 and P3 bugs reaches 100, we'll branch 4.4.0 and open 4.5 stage 1."
pcc seeks contributions to reach 1.0 milestone
pcc, the portable C compiler, has teamed up with the BSD Fund to try to attract donations to fund the completion of a "usable" 1.0 release. The BSD folks have long been dissatisfied with GCC, but Linux developers have eyed pcc (and others) as well. LWN looked at pcc a little over a year ago. (Thanks to Brian Plummer).
Caml
Caml Weekly News
The November 18, 2008 edition of the Caml Weekly News is out with new articles about the Caml language.
Java
OpenSwing: 1.8.3 released (SourceForge)
Version of OpenSwing has been announced, it features a number of new capabilities. "OpenSwing is a component library that provides a rich set of advanced graphics components and a framework for developing java applications based on Swing front-end. It can be applied both to rich client applications and Rich Internet Applications."
OpenXava: 3.1beta3 released (SourceForge)
Version 3.1beta3 of OpenXava has been announced. "OpenXava is a framework to develop AJAX Java Enterprise/J2EE applications rapidly and easily. Allows you to define applications just with POJOs, JPA and Java 5 annotations. Feature rich and flexible since it's used for years to create business applications with Java. OpenXava 3.1beta3 has all functionality of 3.0.3 but it generates an AJAX application. Just update to OX3.1 and your OX (3.x, 2.x, or 1.x) application will be AJAX without touching a single line of code. In this new 3.1beta3 we have rounded the edges a lot, so it's near to a production ready version."
Perl
Parrot 0.8.1 released
Version 0.8.1 of Parrot, a virtual machine for running dynamic languages, has been announced.This Week on perl5-porters (use Perl)
The October 27 - November 2, 2008 edition of This Week on perl5-porters is out with the latest Perl 5 news.
PHP
TCPDF: 4.2.009 was released. (SourceForge)
Version 4.2.009 of TCPDF has been announced. "TCPDF is a Free Libre Open Source PHP class for generating PDF documents without requiring external extensions.TCPDF Supports UTF-8, Unicode, RTL languages and (x)HTML. TCPDF project was started in 2002 and now it is freely used all over the world by millions of people."
Python
Python-URL! - weekly Python news and links
The November 17, 2008 edition of the Python-URL! is online with a new collection of Python article links.
Tcl/Tk
Tcl-URL! - weekly Tcl news and links
The November 19, 2008 edition of the Tcl-URL! is online with new Tcl/Tk articles and resources.
Debuggers
gdb/python integration
Tom Tromey blogs about a gdb/python integration effort. "Im hoping we can ship a Python-enabled gdb in F11. Hopefully that will boost adoption. Im also planning to ship a suite of libstdc++ pretty-printers in F11, so even if you dont write any Python yourself, you can still benefit. (For those not following the progress, we have a feature that lets you write custom visualizers based on type; this makes printing a std::vector, or whatever, much simpler.)" (Thanks to Mark Wielaard).
Libraries
cairo release 1.8.4 now available
Version 1.8.4 of the Cairo graphics library has been announced. "This is the second update to cairo's stable 1.8 series and contains a small number of bug fixes, (in particular a few fixes for build failures of cairo 1.8.2 on various systems). This is being released just over two weeks after cairo 1.8.2."
PyTables 2.1rc2 is ready for testing
Version 2.1rc2 of PyTables has been announced. "PyTables is a library for managing hierarchical datasets and designed to efficiently cope with extremely large amounts of data with support for full 64-bit file addressing. PyTables runs on top of the HDF5 library and NumPy package for achieving maximum throughput and convenient use. This is the second release candidate for 2.1, and I have decided to release it because many bugs have been fixed and some enhancements have been added since 2.1rc1."
Page editor: Forrest Cook
Next page:
Linux in the news>>