 Alrighty then. Today's talks on LibFerris, unsurprisingly, what it is and actually why you should be interested in LibFerris, what it can do for you, which is really what I'm hoping to get across. To give you an idea of the size of the project, version 1.5 was released fairly recently. About over 200,000 lines of code. The core of the file system is about 90K, 64 for plugins and 20K to re-implement some of the POSIX commands. Basically the four areas of it are to make anything that smells like data into a virtual file system, to extract and to store metadata for anything that is a virtual file system, and then once you've got a file system and you've got metadata to LA to do index and search on anything that LibFerris can present, and then the last trend over the last few years has been to take anything that's a LibFerris virtual file system and then turn it into any other data model that might be useful. So you can get at the file system as a SQL light virtual table. How many people here have actually used LibFerris? Excellent. I aimed for people who didn't know, so I thought if there are a lot of people who are already familiar with it, then this might be boring. So starting out from the very beginning, if you have just a plain XML file and you have attribute n equals 12 from the contents of one of the XML elements, if you just fls, no need to mount, you just ls straight into an XML file and it shows you the contents of that top XML element, and if you just cat an XML element as a file, then you just get the contents of that element. Hereon, you saw that one of the elements had an attribute n equals 12. If you fls, because LibFerris is a virtual file system, the kernel's extended attributes interface, so you can have key value metadata attached to files. That's also been virtualized in the file system. So when you see EA being a Linux conference, I don't have to sort of say this is metadata. This is just extended attributes, which are virtual extended attributes. So when you're looking at an XML file, XML attributes become extended attributes in the file system. So if you ls showing the extended attribute of n, then you get all the child, all the children, all the values of the n attribute. If you don't turn around and say you'd like to sort and reverse numeric order based on the attribute n, then you get like an ls version sort of that directory, and sorting it in a virtual file system is itself implemented as a virtual file system. So you take a file system, you take a sort order, and it gives you back a resulting file system. Filtering of views is also done the same way, and reminiscent of Perl syntax, regular expression based on an extended attribute, so any extended attribute that has a one in it. And the second one, you're looking for any extended attribute with a one with a particular name. Anyone who's familiar with LDAP will sort of notice the syntax of the prefix and that was borrowed from LDAP's search syntax, which seemed like a reasonable idea at the time since directory trees with attributes and with data. Of course, just plucking information out of XML through the virtual file system is one thing, but if you want to actually redirect information into and update the XML file, since Bash doesn't know about libferus, libferus runs like known BFS or like KDE's KIO, it's all user address space. I have a fuse interface for it so you can get at it through the kernel, but if you don't want to do that and you don't want to mount things explicitly, if you just pipe them to the standard end of ferrous redirect, it's sort of like Bash's redirection, except you can redirect to any libferus file system. So in this case, I'm updating one of the XML elements just by echoing some data in and then by cutting the XML file itself, I can see that that update's been effective. Playing around with XML is a virtual file system's fun, but this also works with Berkeley DB. F create, you tell it which particular type of file you'd like to create, what name to make and where to put it, and then you can just do a recursive copy of everything from an XML file directly into a Berkeley DB ISM file, and all of the same commands unsurprisingly work exactly the same way being a virtual file system. So this is probably one of the areas of the slides which might get a little grating after a while since all data sources become virtual file systems, the interaction style for all data sources becomes the same. That's refused so that you don't have to, if your application doesn't want to know anything about libferus, you can mount libferus stuff through fuse and then just use all the ordinary commands. In this case, basically just mounting both of those URLs through fuse and using date to update one of the files in XML. Where is it? The previous slide. Yes, the previous slide I did a recursive copy from XML into the Berkeley DB file, which is kind of annoying. So instead of using CP, you can ask directly from a fuse-mounted XML file to a fuse-mounted Berkeley DB file to keep the two up to date. This is quite handy if you're using the exposure from libferus into X query, because if you're using X query on a XML file and then you're building up an index every time in your X query, that's going to be really slow. But if you copy your XML data into say, a Berkeley DB file, and then you use the same query looking for an attribute, obviously you've got an index persistent file, so your performance is going to be a lot faster. Verification that basically the update and the rsync of work using the Berkeley DB's DBDump command. Data stuff, which I mentioned being sort of one of the four main areas. I can actually see part of the slides on here. Excellent. Yeah, there we go. I don't have to get looking around. Wonderful. Yes, the metadata interface is based on the kernel's extended attribute but been virtualized. Data can either be derived from the file system itself or can be stored in many, many different ways. All metadata can have XSD schema attached, which is incredibly handy if you're presenting data and you want to know whether you should sort numerically or whether you should use a string sort. And another various metadata is itself presented through the same extended attribute interface. All right, it drives metadata. If you want to know the width or the height, or you want to know the MD5 of any file, just show that extended attribute and we first will calculate the MD5 or we first will work out what the width of the image file is. That goes for EXIF metadata, basically any metadata that you can get out in the same way. If there's no plugin for it, then that's sort of a bug and there should be a plugin for it. It's just a matter of time versus two hands. The content of the file is also available through the same metadata interface. So you can get the schema of the file, you can get the actual files by contents, you can get the MD5. The idea of having the files contents available through the metadata interfaces is that since you can run filtering and you can run sorting and the sorting can actually use the anything that's as metadata, you could potentially list the directory based on the contents of the files and how they would sort if they were actually, you could list the directory in the order of the contents of all of the files if that was a desirable thing to do, which there's no reason saying that a particular virtual file system that wouldn't be of interest. Stored metadata can either be done through RDF or through the kernel's native VA interface. So if you use the ATO command, ATO to set a particular attribute and to get an attribute through the kernel, and then if you use Ferris LS, you'll notice that the foo attribute just shows up just as any other extended attribute would do. Nothing particularly special needs to be done to tell it that. If you go through and you then use the Ferris redirect command that you've seen before, tell it minus A to instead of actually writing the contents of the file to update a particular attribute, you can then again use the native kernel add a command to grab the foo attribute and see that it's been updated. It turns out that's really wonderful in some ways, but extended attributes also in the kernel LAN can be rather slow, which the SE Linux guys sort of found out. If you're updating a large amount of extended attributes, then there's also a lot of space restrictions and also things like when you start touching file systems that are on NFS. Mysteriously, the extended attribute interface just sometimes doesn't work unless you've patched your kernel or your distribution sort of, one of those rare ones that I haven't seen that implement will have pre-patched your kernel for you. But with LibFerris, it falls back to RDF metadata if kernel extended attributes aren't available when you're writing metadata. So in this case I can redirect a particular annotation. The add a command says, you know, there is no annotation for this file. It's on NFS. Command's not supported, but then I can use FLS to actually get that RDF data back. And this is also quite useful because being a virtual file system you can mount HTTP and FTP and various other things. You can mount Emacs so you can't really store a kernel attribute for an Emacs buffer. For those people who actually like RDF, this is all using about a year ago I moved over to using Soprano from KDE4. So essentially the library under Nippo Mark that KDE4 uses for its semantic desktop is now the same library that I'm using. So you can, if you want to, go and share your RDF database between the KDE4 desktop in LibFerris or you can just not do that. And you can use Soprano command to actually get out the RDF triples. So if anyone's an RDF fan come and see me. Yes, I had been told in previous talks that I shouldn't really call it a virtual file system, that that idea is not really cool these days whereas I tend to disagree. So you could call it a data abstraction layer, a CMS, data sources, any other three-letter acronym that you like. Relational databases moving from XML, Berkeley DB. If you just have a small table called play with a bunch of messages and IDs and other stuff, you can then use FLS to actually get directly at the relational table as a file system. If you update a particular attribute for a tuple and obviously get it back again. The minus zero in FLS asks the file system, what attributes do you think are going to be interesting to the user? Because if you just do a normal LS minus L then you're going to see your M time, your size, your owner, your group and that's going to be completely irrelevant for a relational database table. So minus zero is basically behind the scenes minus zero in FLS says get me the recommended EA attribute which is a list of all the attributes that the file system thinks for that particular directory are going to be interesting to a user. So that's very handy for XML. Every XML attribute will be included there for a relational database then every column in your table is going to be offered. You can for Postgres there's special support for actually calling relational database functions through the file system interface so if you want to know the A10 of something you can directly fcat the result. This is kind of fun, there's an article on this if you want to do it. If you mount two Postgres tables as file systems through libverus you can then use rsync on that to copy one table from one Postgres database to another one. There's a few these little nasty commands I've added because if you basically have primary key and other constraints and you need to actually tell libverus about that so it doesn't try to create tuples when it doesn't have the primary key yet. Mounting applications, as I say, as I mentioned emacs before you can mount emacs, you can mount Firefox, you can mount the xlindows, you can mount your xclipboard. For Amorock if you actually want Amorock playlist is basically your current playlist and if you see those files then you get the files. So if you're sitting there listening to something and all of a sudden you want to just take your music with you you can just copy your playlist to your mobile device of preference and walk out the door. Echo, yes, you can also toggle play pause, you can do call direct functionality through the virtual file system and the emacs thing is basically a roundabout way of cutting a temp file. If you turn around and open the temp file in emacs and then you can fcat basically mount emacs as a file system and cap the contents of one of the emacs buffers directly and that works by directionally. You can echo stuff directly into an emacs buffer if you like. xlindows stuff, you can, yes I do have the window example, you can move xlindows around, the xy coordinates change their size by updating files in the virtual file system. The clipboard thing is far more useful where basically you can grab the last 10 clipboard entries as virtual files or you can echo something directly into the current clipboard contents. Gstreamer and gphoto both have support so you can grab webcams, you can grab video streams off webcams as virtual mpegs, grab webcam snapshots as virtual jpeg files. gphoto, obviously you can just slap all of your stuff off your cameras and upnp support, so misscv, any other upnp device. upnp is incredibly handy because devices that you buy that are really cheap that offer upnp often have search interfaces that really suck and if you can mount these as virtual file systems in libferis you can index them and then you can search using libferis. Setting up virtual jpegs and stuff in gstreamer currently revolves around an xml file because it's just incredibly hard to abstract this in the virtual file system in an automated way. So libjpeg basically for this particular laptop will grab a single snapshot through the webcam, jpeg encoded and the last element there is the that actual block for anyone who's played with gstreamer. Well obviously notice it's a block you could pass the gst launch except the last block is an app sync which basically hands the data to libferis and then libferis says hey I've got this virtual file here, cat it if you like and then I'll run that and I'll get the data for you. Virtual soft links, yes everything becomes virtual and everything becomes overlayable at some point. I've been doing this for about ten years so a lot of this stuff if things seem to be strange and crack smoking there are reasons and they have cropped up over that time. Virtual soft links for gphoto and for upnp, a lot of upnp servers will offer you saying hey I'm a upnp server and here is my ID and if you're at a bash shell and you see you know a 50 character ID with backspaces and weird characters in them it just doesn't make it fun so it's virtual soft links you can say to match against these horrifically long strings and say yes that is actually just you know box one make a virtual link whenever I read that directory box one equals this horrendously long string. Editing if you use the f-edit command it does some funky stuff without using fuse or without using anything else and anything that you can get a trulip for us you can use f-edit and it'll pop up a VI session which is kind of cool and then you can edit it and if you do when you do shift to z it all goes back through the strange 5.0 stuff that's in the background and goes back to the file system so no need for mounting no need for fuse no need for anything just directly f-editing things. I have support in the last 12 months for Emacs Tramp which is the notewarning about it being alpha I have been doing stuff over the network it uses basically interloped on Tramp's SSH support and I've implemented a few extra POSIX commands in libferis so that libferis is sort of seems like a little POSIX system of its own and Tramp happily edits remote files that happen to be you know part of a Berkeley DB4 file or something like that Web 2.0 becoming file system 1.0 so Flickr, Vimeo, YouTube, Facebook, Google Spreadsheets and Google Docs just becoming other virtual file systems Web Spreadsheets is a file system I've tried to make the URL seem obvious so Google Spreadsheets whatever the Spreadsheet name is and then if you echo 5 and 23 into two different cells in a formula into a third cell and then when you fcat that formula cell back you Google translate Google gives you the result of that calculation things like Vimeo, 23 HQ and other things if you copy a JPEG file or in the last week I basically implemented support for Canon CR2 files so if you have a raw CR2 file you can directly see it to Flickr using libferis and the same sort of thing with videos you can drop them up on the YouTube and for people who love Twitter and Facebook you can echo stuff directly into your status from the file system interaction with Flickr stuff you can directly fcat an image straight off Flickr and pipe it into ocular or something else that will accept an image data on standard in you can create new comments you can edit comments, list things and to actually give more power back to the user social networks like Facebook and Flickr etc most people don't think a Flickr is a social network but when you start friending people and getting feeds of their photos I've tried to make things in well Facebook is a really really bad example they seem to think if you give Facebook your phone number your friends can't get that phone number but other well whatever data I can get at legally I try to put in the V cards so under Flickr basically if you have a friend called Barry and you fcat your contacts slash Barry you just get a V card file and in the end I'd like to be able to just take a V card from one site and drop it into the contacts on another site and sort of have live for us say hey you know I know this person I'll send a friend request the third section being index and search check how horrible I'm going for time not too bad yes if you if you have large virtual file systems you end up needing to search for things and it seemed to be sort of popular Katie for having index and search tracker being out there beagle being out there so yes yet another desktop slash network index and search I support for full text of documents for metadata it's all implemented through plugins so there's no particular you know I use SQL for index and search there's a I have ten different ways that that can be done whatever device it is you can choose which is going to be better and if you have three or four indexes you can federate them together so if you have a server with a bunch of PDFs on there you can create one index and everyone on your network can federate to that one index so all of your documentation doesn't have to be indexed by you know 20 people who are in your office one index gets maintained on the file server and everyone gets to use it seemed like a good idea at the time first find operates like posix find except it operates on an index rather than directly polling or directly trawling the file system looking for your predicate so you can do things like instead of doing find and then trying to limit what URL you're finding in you can just do first fine slash and then whatever your predicates are and it'll come back if the predicates selective enough like if you're looking for something with one MD5 it'll obviously just come back within a second the plugins I have support for Java Lucene C Lucene Postgres Zappian I can actually federate to Beagle and Strigi so if you have a Beagle index and you have something else you want to index you can search both of those really for us obviously web searches are hanging fruit I also have a specialized memory map index and search so the N810 with a 500 may God arm chip of indexed audio that's 10 times larger than can possibly fit on flash that you can attach to that device indexed it on the device over NFS and then reg X searches looking for you know music by Willie Nelson basically the search is almost instant so there are alternatives if you have memo devices to whatever index and searches coming with them how to go about doing this I have these bunches of commands up the top basically if you want to use I would recommend if you have a largest store like you know somewhere one million to one billion files that you want to index the Postgres modules a great great thing for that drop the database just to make sure it's clean again the F create command I've taken a leaf out of plan 9's book when you create an index you give it a file system directory and say shoveling method other there and that will be my index so if you want to refer to one particular index you just give it a directory if you want to refer to another index you give it another directory and if you want to federate directories together you say here are five directories make a new index here that refer to these five directories using directories as a name space is really quite handy but then again I'm a file systems guy so then if you just run find on slash audio I have I've left it out of loop for us explicitly there's no sort of you know you create an index and it'll keep polling at home directory and updating things as quickly as it can and look in bar that doesn't happen if you want to update an index you do it so you run fine first is smart enough if you if it's you see the file that hasn't been modified it won't go and reindex the whole file so you can pipe it you know a million files and if three of them have been updated three files get updated in the index so you just run find on all your audio files pipe that into index add and running a compact is kind of a nice thing to do for the index but everyone who's played with databases here will will know that the vacuums and compacts are quite useful and again you see the same regular expression pretty good stuff prefix and commands prefix or if you want to or or your predicates together so you can look for Willie Nelson songs about whiskey if you'd like actually to get your search results back as a virtual file system strangely enough you can run that's the eaq which is an extended attribute query so the fls command gives you back a virtual file system if you'd like you can then mount that as fuse so you have a fuse file system that shows you the results of a search whenever you read the directory recent stuff on the in the indexing stuff is mutation so for postgres indexes you can then turn around and add new columns and basically tell it to update the index with that and explicitly re-index specific files for that column I've also started an ex support expressly for subtitles so you can then do full text index search on subtitles for video files that you've indexed and there were little gotchas there where subtitles can be surprisingly humongous for certain files speed tips for this if anyone's an nfs guru I'd love to speak with you but running find over nfs or running find true ssh on the other server I've found that there's significant differences in speed if you've got like you know the directory has a million files in it so sshing the other end running find and popping the results back to where you want to index it can be really quite a huge speed up and if you only want to index five attributes yes it's a hack but using an environment variable and saying these are the five attributes I want then my first one even bother sort of thinking oh but I can generate this really funky foo-to attribute but it'll take time so if you do that this is how I did it on the the 500 meg arm chip basically I just said you know for audio files these are the things you know one ID three tags I want the URL I want the size I want the modification time and just put those expressly in that environment variable and you can sort of on even on a slow arm chip you can bang through at about 10 to 20 milliseconds per file special support in the index and search for geotagging for so if you have something that's tagged with a geospatial tag you can then say find the things that are tagged with other geospatial tags that are within 50 kilometers in a square box from this particular tag which makes it kind of cool for sort of bouncing around places in index and search whenever you modify an annotation for a file a diva signal submitted so then you can monitor that file monitor that if you like and immediately update your indexes when people make new annotations Postgres has special support for binary tags so whether again things like your geospatial tagging being just binary it doesn't have this tag does it not and in Postgres it uses GIST stuff so if you are looking for something that's got two or three tags is foo is bar as soon as you've got three the GIST stuff will make that search incredibly fast and my PhD was actually on index and search stuff using formal concept analysis which is a unsupervised machine learning and natural clustering algorithm so then yes if anyone's interested in that sort of stuff come and see me Ways to Get Out Lib Ferris it's native API is C++ standard IO streams and you can get attributes as strings you can set attributes and get and set as standard strings and you can also get attributes as standard IO streams QT GTK2 model you can get at the whole thing as virtual tables in SQLite to refuse as a virtual document in an X query from KDE4's plasma I can mount plasma and I can be mounted as plasma once again sort of everything being and everything going the other way and the entire virtual file system can be got as a XSCC document object model so if you want you can start at slash and you can go anywhere you like you can get an Emax you can get a running Emax's buffer session through an Emax XSCC dom and I'll free implement a whole bunch of POSIX commands so you don't have to use foo's if you don't want to and there are a whole bunch of POSIX commands that you'll find generally there's a Ferris or an F prefix and if it's a GTK2 client there's a GF index prefix sorry and probably soon there'll be QT4 re-implementations or QML re-implementations so that if you have you know little mobile device you see things then you can get it live first with your thumb. Ferris LS also lets you get at anything that's a file system using ASXML or ASRDFXML if either of those are going to be handy. Getting stuff ASXML is kind of quite useful I've found through PHP or through other server-side stuff because once you get your data as XML you can easily sort of truff that off to users. The GTK2 data tree model I use in the Ego file manager and the QML one obviously it's not actually a file manager shot. One thing that I'm particularly happy with there which I don't know why it's not that I'm well you know why I'm gloating about it but also the fact that other applications could do the same thing fairly easily and I don't know why other applications don't where you can do cascaded sort like why in a file manager you want to sort by the mime type of a file and then you don't want to sort by the size of the file as well. It's just strange it's such a useful feature. Getting out of the first file system through XQuery instead of using this is the parts in bold have been slightly modified. The top two are actually modified from XQuery that would run natively on XML. So instead of running on XML you run on a db.db Berkeley db4 file and instead of using doc to actually get at it like the standard doc function you use Ferris doc and Ferris doc will take any URL to a that libferris couldn't mount as a file system through Ferris LS etc and we'll give that back to you as something that XQuery can evaluate. So in this case if customers XML had a million customers and you were looking up someone by their family name that's going to be incredibly slow if the XML file is huge but if it's a Berkeley db4 file it's going to be well anything that if it's a hash actually it's going to be a single seek. SQLite which is kind of useful for anyone who likes SQL. A small XML file and you get back a result of 51.3 if you do this which is to load the VTable file create a virtual table in SQLite using libferris tell it you want the top element of that XML file and you want these attributes and these are the types of those attributes that SQLite should use and then I've just selected the average age from the virtual table if you have a whole bunch of image files and you want to get a graph of relative to group by aperture size or group by exposure time I found this to be kind of a handy way to actually do that and of course you can do other wonderful any SQL sort of thing that you like once you've got the data available through SQLite. Plasma which theoretically seemed like a good idea at the time yeah okay excellent stuff so Katie affords plasma this is the stuff that's used for the desktop widgets etc and in this particular little video basically you update part of the Google spreadsheet in the browser which calculates the result and that particular field is just showing a virtual file and then when you paste the contents of something else into another virtual file you find the Google spreadsheet gets updated which updates the formula which then updates the data on your desktop so stuff that's on the web and stuff that's on your desktop equals the same it's all just a virtual file system more information just in the January edition actually that should be January 2011 yes in the current January edition of the next magazine there's stuff on doing federated indexing with Lib Ferris so if you want to maintain a single index and do desktop search and have the index maintained once on your file server this is an interesting article to read there's a bunch of stuff in Linux journals and stuff in Linux format and if you want to do our sync on Postgres mounted see a few years ago in Linux magazine if you want to do SQLite stuff with Lib Ferris and Linux.com the introductory article on LWN and if you're really keen you can come and ask me yes I love this particular shot which I don't know whether you can see in Europe they decided to sell a toilet fishing bowl which is not quite what it first seems but yes I don't know why you'd want to fish on the toilet Lib Ferris is GPO version 3 I've changed it from version 2 plus in the last year to version 3 if your pleasure and selective capitalism yes I only mentioned that because people seem to think that yes I'm very close to the end people seem to think that GPO is against capitalism and I think much the opposite that it's not that it endorses capitalism because it empowers people to actually make choose who they're going to pay to improve software which I think is a great thing in the future more and faster more manning of web services more updating web services perlio all which I've been mentioning for me six months or so but that will happen and yes patches from the crowd are accepted or you know if anyone has an old jucati that they no longer need that's accepted as well and yes the toilet fishing cam is my last slide so now I have time for questions everyone gets a microphone how does it handle authentication against you know remote services that require username and password yeah if you're doing that with htdp and stuff like that I maintain a special file like a secure Berkeley DB in your dot ferris directory I find it to be better to actually keep username passwords out of band so instead of having in the htdp URL you know this is banned this is my password expressly as part of the URL I really don't like that because the opportunity to copy and paste it's just too it's too easy so we're actually authenticating to one or two sites one off then you need to actually set that up well tell it first few username password for that for Google for web services stuff I try to actually do stuff that's not evil for Google at the moment I just say what's your Google username and password so I really need to do a lot and stuff like that it is sort of better for Facebook there's actually an evil hack that floats around where you can instead of saying you know this is lip first you want to authenticate this lip first application and allow it to use it and then Facebook would normally sort of drop you after a month you can actually tell them through nasty little rest API's and get a permanent authentication which I don't know how long that'll last for but yes it shows that Facebook's code is good quality and there's no back-end yes so hopefully that answers it if it's stuff like the Google thing I know is horrible but again I sort of use Google for fun if anyone wants to use it for profit then I can do a warth and better you know better management there rather than what's your password expressly and I'll keep that here for you I guess what I want to know is if you just you know say a cat on Google is it going to prompt you each and every time what does it remember you you know the command one before if you cut on Google for authentication it just it look ferris will have known you're using their password the same thing for Flickr like you know when any of those web service basically I try to opt for the authenticate you will allow the application lip ferris access and then any subsequent IO that you do to that web service it'll try and use the same or token right so yeah yeah it's being prompted for passwords really sucks so how's the introspection done for the applications like Mozilla or for the for the X server itself how do you introspect the data there that you're going to share later yeah for emacs I basically have a bunch of ellipse that elisp stuff and for Mozilla it's the same sort of thing like it all sort of you have to install a little plug-in into your Firefox and then lip ferris sort of says to the plug-in hey you know what's your what's your document object model give me that back but the converse part is if you have an image on a web page and you know roughly where it is in the DOM you can just cat that image so I think it's actually kind of handy to be able to see you know we have this this browser which is incredibly good at breaking down document object models but people seem to think it's a silo that you have to click forward and back and click on links but just being all the harvest there's a jpeg I'll just cat that jpeg so but yes any applications Amarok's actually quite easy anything that's got a d-bus interface makes it easy you can mount the bus as a file system so that you should really put my attention there with mounting d-bus is a file system one thing I really missed that they took away in KDE 3 was decop and being able to use the command line to control aspects of KDE does this allow you to put that back in easily with with decop with the bus or depending of the main thing I hate about the bus is the way it handles structures and I've been told this is the fact that QT because I actually moved to mounting d-bus for QT and I've been told that QT 4 sort of sucks in mounting in getting a D-bus because if you have composite data that's offered as a structure on D-bus then it's really it's difficult to pluck things out but yeah I mean the same sort of scripting like you know if you cat into pause play it'll do toggle that state in the application or change the volume and things like that but just raw mounting d-bus yeah that should actually give you a whole bunch of power it's similar to when you've mounted postgres you can just call a function with data and get the result back so just catting files you should be able to do some scripting um I see all this stuff and I think hey this is really cool I want to go and play with this how does it scale in terms of I've got like 200 gig of XML files sitting on a server somewhere is that a scary amount of data for it to process or is it just a case of indexing it correctly and then you can go 200 gig of single XML file that would be kind of hefty it does use DOM to actually pass XML so you need to everything that implies but if you have reasonable bite sized XML files and as I say you know it will actually remember the M time of the file and it won't chug over the whole XML file the subsequent times so yes it should handle that can it decompress some of the play if it can't I can make it okay but yeah it has support for doing chunk-based compression with LZ and with gzip and other well lib-z other sort of stuff so that was that was kind of fun but yes I haven't actually well as I say if you want to do something that it doesn't do it's not that hard to make it do it and in that particular case I think you know if it doesn't do it then I'll fix it it's a bug more questions questions anyone okay if there are no more questions let's put our hands together for our speaker now on behalf of lca to show our appreciation for the efforts of putting together his presentation I'd like to give this to our speaker thank you