I have created many prototypes for advanced package manager features. Erich Schubert also made a tag cloud prototype.
Recently, I wrote:
We have lots of interesting, usable metadata; we have algorithms; we have prototypes; we have ideas for lots of cool, implementable features. The question is, are we able to write applications that just combines what is needed from all this treasure to provide the right interface(s) for our base(s) of users?
Most of the back-end code is already implemented in Python, and I'm thinking of putting it together into a working prototype for a new concept of a file manager.
This could be even implemented quickly, if someone joins me who is good at:
- Python;
- a Python GUI toolkit like pyGTK, wxPython or pyQT;
- Debian.
What follows is a sketch description of what I have in mind.
The user
Debora is 34, working as a web designer in a small enterprise. She has a laptop running Debian which she uses both for work and at home. She likes Debian for the wide range of software, that allows her to be always able to access the best tools for the job, even in a highly changing environment like the one of web design. At home she enjoys the various tools for photo editing and management, and of course, having a husband and a 6 years old son, the selection of games.
The tasks
- Looking for new software
- "Is there an application that can do X?"
- Looking at what is installed
- "Let's see if this package does what I need"
- "What was that nice package I installed yesterday?"
- Removing things that are not needed anymore
- "Let's get rid of the cruft"
Looking for new software
Use the smart tag search for searching: it allows a Google-like search interface, which afterwards allows categories to be used to semantically refine the results. This last step is conceptually very simple, as it maps to a sequence of "more like this" and "less like this".
The search results can be sorted using popcon suggestions, that are very effective at showing software not in the system that many other people use.
Looking at what is installed
Let's see if this package does what I need
Given an installed pacakge, show the contents of its bin/ directories and
showing manpages as the details for the bin/ file: thanks to the Debian Policy,
executables are all in /(usr/)?s?bin/
and they must have manpages.
For packages that are tagged as interface::3d
, interface::text-mode
or
interface::x11
, allow to run them directly from the interface.
Also show the contents of /usr/share/doc/pkgname
and
/usr/share/doc/suggested-and-recommended-pkgnames
and allow to open
documentation with the appropriate software. If there is an html directory
which contains an index.html
, only show that and not all the other
HTML files.
Find info documentation and allow to open it into a proper info browser.
If there are manpages that don't have a corresponding executable, show them as extra documentation.
What was that nice package I installed yesterday?
List installed packages sorted by when was the last time they have been installed.
Let's get rid of the cruft
- Of course, track auto-installed packages like aptitude and debfoster are doing.
- Also allow to list packages that have been auto-installed satisfying Recommends: lines.
There are also some "unusefulness" scores one can compute, but I haven't yet been playing with them yet:
- Popcon scores (show less popular installed packages first)
- List packages marked as
<OLD>
in the local popcon scan (and then, by increasing atimes): those are the packages that are installed but are not being used. - Use negative popcon suggestions, that is, find out a way to compute the opposite as what is found here.
Task filter
Have a look at the popcon suggestion page: there is a "Suggestion type" box.
Of course the same idea can be used in a package manager to restrict it to a significant subset of the packages. More filters, as you can imagine, can be easily created.
This is how it is implemented:
case "any": $filter = "'!role::shared-lib'"; break;
case "gui": $filter = "'!role::shared-lib && role::program && (interface::x11 || interface::3d)'"; break;
case "devel": $filter = "'!role::shared-lib && devel::*'"; break;
case "game": $filter = "'!role::shared-lib && role::program && game::*'"; break;
default: $filter = ""; break;
The same filter can be gived to Debtags:
debtags search '!role::shared-lib'
debtags search '!role::shared-lib && role::program && (interface::x11 || interface::3d)'
debtags search '!role::shared-lib && devel::*'
debtags search '!role::shared-lib && role::program && game::*'
Conclusion
There is so much really cool stuff to be written, just within reach.
So?