Petter Reinholdtsen: Free e-book kiosk for the public libraries?
- Copy e-books into a USB stick, reading tablets, cell phones and other relevant equipment.
- Show the books for reading on the the screen in the library.
It's become kind of a clich for me to claim that the reason I'm happy working on ACPI and UEFI and similarly arcane pieces of convoluted functionality is that no matter how bad things are there's at least some form of documentation and there's a well-understood language at the heart of them. My PhD was in biology, working on fruitflies. They're a poorly documented set of layering violations which only work because of side-effects at the quantum level, and they tend to die at inconvenient times. They're made up of 165 million bases of a byte code language that's almost impossible to bootstrap[1] and which passes through an intermediate representations before it does anything useful[2]. It's an awful field to try to do rigorous work in because your attempts to impose any kind of meaningful order on what you're looking at are pretty much guaranteed to be sufficiently naive that your results bear a resemblance to reality more by accident than design.
This is my monthly summary of my Debian related activities. If you re among the people who made a donation to support my work (144.3 , thanks everybody!), then you can learn how I spent your money. Otherwise it s just an interesting status update on my various projects.
Dpkg work
While taking care of the last details for the hardening feature in dpkg 1.16.1, I have mailed debian-devel to find volunteers to handle a hardening release goal. The objective is to ensure a large number of packages have been converted/rebuilt to actually use the new hardening build flags.
Then I prepared the draft of the announce of the dpkg 1.16.1 upload (aka Bits of dpkg maintainers sent to debian-devel-announce) which got expanded by Guillem to also cover new features since dpkg 1.15.7.
update-alternatives got some refactoring by Guillem which resulted in a regression that has been fortunately discovered by Sven Joachim. I fixed that regression and did some further cleanup inspired by the root cause of this regression (see top 4 commits here).
Note that Sven is one of the few persons who are running the git version of dpkg. Hopefully the number of tester will increase since I recently documented the APT repositories with autobuilt versions of dpkg in the wiki.
At the end of the month, I started working on a bugfix release (what s going to be 1.16.1.1) by fixing some of the unavoidable problems discovered after an upload that accumulated more than 4 months worth of work (see top 4 commits here).
The Debian Administrator s Handbook
I spent countless hours finalizing the launch of the crowdfunding campaign for the Debian Administrator s Handbook and it went live on September 27th.
So far it s on good track with more than 63% of the base funding already secured. But we still have a long way to go to reach the liberation goal (we re at 21%). It s still worth nothing that more than 55% of the money raised has been put in the liberation fund so there are many persons who care about getting the book freed.
More than 250 persons are supporting the project currently with an average contribution of 38 EUR. I would have expected much less for the average contribution but many more supporters. I still hope we can get more people on board with the perspective of a good DFSG-free Debian ebook.
Did you order your copy? If not, click here and fix this! One comment Liked this article? Click here. My blog is Flattr-enabled.
Today I was wondering that I had almost no new mail in my inbox in the morning. After a while I decided to have a look into the server logfiles . so I learned that postfix wasn t able to deliver mails via lmtp cause of:
Oct 7 07:45:56 post cyrus/lmtpunix[307]: DBERROR db4: Logging region out of memory; you may need to increase its size
Oct 7 07:45:56 post cyrus/lmtpunix[307]: DBERROR: opening /var/lib/cyrus/deliver.db: Cannot allocate memory
Oct 7 07:45:56 post cyrus/lmtpunix[307]: DBERROR: opening /var/lib/cyrus/deliver.db: cyrusdb error
Oct 7 07:45:56 post cyrus/lmtpunix[307]: FATAL: lmtpd: unable to init duplicate delivery database
Oct 7 07:45:56 post cyrus/master[754]: service lmtpunix pid 307 in READY state: terminated abnormally
Seems like this can be fixed with:
/etc/init.d/cyrus2.2 stop
cat< /var/lib/cyrus/db/DB_CONFIG
set_cachesize 0 2097152 1
set_lg_regionmax 1048576
EOM
/etc/init.d/cyrus2.2 start
Looking more closer into the logs, it turned out that this trouble started last night when I connected with a client running the soon to be released Ubuntu Oneiric Ocelot using the new kmail2.
So it looks like the KDE/Ubuntu folks broke again kmail (or any KDE subsystem), as it also has troubles when migrating over from kmail(1) and it looks like it s not able to access most of the imap subfolders. Well done!
Full stats are here
Status for D-I level 1 (core D-I files):
Would MTAs please stop sending hi-bit7 messages
to other MTAs which do not advertise 8BITMIME! Recode it
to QP or BASE64, damnit! The receiving MTA is entitled to strip the
set bit7, which kinda makes things hard to read (while I know how
to deal with blvde Stra_e, the advent of UTF-8 makes that
blC6de StraC?e, introduces C0 control characters and makes
typographic quotation marks into NUL-containing octet sequences (as
their UTF-8 representation contains 0x80 octets) which let every
sensible MDA terminate the line there). I even filed in the Debian
BTS against the BTS (might be Drexim's fault, though).
Would MUAs please default to Quoted-Printable!
And mail hosters should use the same server when retrying delivery,
to benefit greylisting. Or at least publish a list of outgoing IPv4
addresses they use for sending. Or use IPv6. Oh, and STARTTLS,
while we are on my wishlist.
It's a sad day when the percentage of correctly encoded eMail
messages in my INBOX is smaller than that of my Spambox...
The Ubuntu Technical Board conducts a regular review of the most popular Ubuntu Brainstorm ideas (previous reviews conducted by Matt Zimmerman and Martin Pitt). This time it was my turn. Apologies for the late arrival of this review.
Contact lens in the Unity Dash (#27584)
Unity supports Lenses, which provide a consistent way for users to quickly search for information via the Dash. Current lenses include Applications, Files, and Music, but a number of people have asked for contacts to be accessible using the same interface.
While Canonical's DX team isn't currently working on this for Ubuntu 11.10 or 12.04, we'd love somebody who's interested in this to get involved. Allison Randal explains how to get started, including some skeleton example code and several useful links.
Displaying Ubuntu version information (#27460)
Several people have asked for it to be more obvious what Ubuntu version they're running, as well as other general information about their system.
John Lea, user experience architect on the Unity team, responds that in Ubuntu 11.10 the new LightDM greeter shows the Ubuntu version number, making that basic information very easily visible. For more detail, System Settings -> System Info provides a simple summary.
Volume adjustments for headphone use (#27275)
People often find that they need to adjust their sound volume when plugging in or removing headphones. It seems as though the computer ought to be able to remember this kind of thing and do it automatically; after all, a major goal of Ubuntu is to make the desktop Just Work.
David Henningson, a member of Canonical's OEM Services group and an Ubuntu audio developer, responds on his blog with a summary of how PulseAudio jack detection has improved matters in Ubuntu 11.10, and what's left to do:
The good news: in the upcoming Ubuntu Oneiric (11.10), this is actually working. The bad news: it isn't working for everyone.Making it easier to find software to handle a file (#28148) Ubuntu is not always as helpful as it could be when you don't have the right software installed to handle a particular file. Michael Vogt, one of the developers of the Ubuntu Software Center, responded to this. It seems that most of the pieces to make this work nicely are in place, but there are a few more bits of glue required:
Thanks a lot for this suggestion. I like the idea and it's something that software-center itself supports now. In the coming version 5.0 we will offer to "sort by top-rated" (based on the ratings&reviews data). It's also possible to search for an application based on its mime data. To search for a mime-type, you can enter "mime:text/html" or "mime:audio/ogg" into the search field. What is needed however is better integration into the file manager nautilus. I will make sure this gets attention at the next developer meeting and filed bug #860536 about it. In nautilus, there is now a button called "Find applications online" available as an option when opening an unknown file or when the user selects "open with...other application" in the context menu. But that will not use the data from software-center.Show pop-up alert on low battery (#28037) Some users have reported on Brainstorm that they are not alerted frequently enough when their laptop's battery is low, as they clearly ought to be. This is an odd one, because there are already several power alert levels and this has been working well for us for some time. Nevertheless, enough people have voted for this idea that there must be something behind it, perhaps a bug that only affects certain systems. Martin Pitt, technical lead of the Ubuntu desktop team, has responded directly to the Brainstorm idea with a description of the current system and how to file a bug when it does not work as intended.
$ ls -al laboratory/binary/eclipse/.*-*
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.ar-info-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.bin-pkg-control-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.changelog-file-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.copyright-file-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.debian-readme-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.doc-base-files-1
-rw-r--r-- 1 user group 45 Jul 18 01:21 laboratory/binary/eclipse/.fields-1
[...]
This example shows that a bunch of collections scripts have been run for the eclipse binary package. Each of these files contain the version of Lintian that created them (or last wrote them) and a timestamp.
Why the interest in these files? Let us go a bit back in time to the 15th of June 2011. That was the day where Lintian 2.5.1 was uploaded to unstable. That version of Lintian had 17 collection scripts[1] for binary packages. So every binary package would have 17 files and there are over 35 000 binary packages in the Debian archive.
Ouch, so that makes about 595 000 files if we use this on all binary packages on the archive. The size of each of those files are about 45 bytes, so that is a total of 25.5 MB for all of these files[2]. So other than the inode abuse , this is not too bad. A little du -h should confirm this
$ du -h laboratory/binary/eclipse/.*-*
4.0K laboratory/binary/eclipse/.ar-info-1
4.0K laboratory/binary/eclipse/.bin-pkg-control-1
4.0K laboratory/binary/eclipse/.changelog-file-1
4.0K laboratory/binary/eclipse/.copyright-file-1
4.0K laboratory/binary/eclipse/.debian-readme-1
4.0K laboratory/binary/eclipse/.doc-base-files-1
4.0K laboratory/binary/eclipse/.fields-1
[...]
Whaaa oh the file system uses a block-size of 4K bytes, so I guess we have to pay a full block for these files. Let s see what that gives, 595 000 times 4 kB is 2.27 GB
Oops!
That was in the (not too distant) past. About a month later (12th of July), the code creating these files are refactored into:
sub _mark_coll_finished
my ($self, $collname, $collver) = @_;
# In the "old days" we would also write the Lintian version and the time
# stamp in these files, but since we never read them it seems like overkill.
# - for the timestamp we could use the mtime of the file anyway
return touch_file "$self-> base_dir /.$collname-$collver";
This turns out to be a very space-saving change if we ask du -h:
$ du -h laboratory/binary/lintian/.*-*
0 laboratory/binary/lintian/.ar-info-1
0 laboratory/binary/lintian/.bin-pkg-control-1
0 laboratory/binary/lintian/.changelog-file-1
0 laboratory/binary/lintian/.copyright-file-1
0 laboratory/binary/lintian/.debian-readme-1
0 laboratory/binary/lintian/.doc-base-files-1
[...]
Existing files are not emptied, so we still have some old non-empty files left on lintian.d.o. Nevertheless that was the "nice story" about "the side effect of being lazy sometimes reduces space waste"[3].
But we have another "number" problem. If you grep for "Too many links" in the lintian.log from lintian.d.o you should see:
$ grep -i "too many links" logs/lintian.log
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/aces3': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/boinc-cgi-stripchart': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/libbrailleutils-java': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/libbrailleutils-java-doc': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/libclippoly0': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/libclippoly-dev': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/xul-ext-cookie-monster': Too many links
mkdir: cannot create directory /srv/lintian.debian.org/laboratory/binary/cucumber': Too many links
[...]
$ grep -i "too many links" logs/lintian.log wc -l
3274
In the Lintian Laboratory every package is unpacked in a directory based on its type and name (as hinted in the output above). The problem is that ext3 has a limit of the amount sub-directories a directory can have[4]. This limit is just shy of 32 000 and (as a reminder) Debian has over 35 000 binary packages. So a lot of packages are currently not checked on lintian.d.o (#641468).
The current feature branch for #641468 already solves the directory limit issue (by using a "mirror-like" pool layout). It also removes the need for "1 file per completed collection" by writing this information in the existing "per entry" status file.
Dear Lazyweb,
Having broke my elbow last week, I m experiencing serious trouble typing with only one hand on the computer. I know that there is speech to text software, but I was never really interested in that until now of course. Is there any good software available on Linux you can recommend?
We use SugarCRM at work and I've complained about its not-very-RESTy
REST interface. John Mertic a (the?) SugarCRM Community Manager asked
me about what problems I'd had (apart from its lack of RESTfulness)
and I said I'd write a blog post about it.
In our case, the REST interface is used to integrate Sugar and RT so
we get a link in both interfaces to jump from opportunities to the
corresponding RT ticket (and back again). This should be a fairly
trivial exercise or so you would think.
The problems, as I see it are:
https://sugar/service/v2/rest.php. Usually a POST,
but sometimes a GET. It's not documented what to use where.
The POST parameters we send when logging in are:
method=>"login"
input_type=>"JSON"
response_type=>"JSON"
rest_data=>json($params)
$params is a hash as follows:
user_auth =>
user_name => $USERNAME,
password => $PW,
version => "1.2",
,
application => "foo",
Nothing seems to actually care about the value of application, nor
about the user_auth.version value. The password is the md5 of the
actual password, hex encoded. I'm not sure why it is, as this adds
absolutely no security, but it is. This is also not properly
documented.
This gives us a JSON object back with a somewhat haphazard selection
of attributes (reformatted here for readability):
"id":"<hex session id>,
"module_name":"Users",
"name_value_list":
"user_id":
"name":"user_id",
"value":"1"
,
"user_name":
"name":"user_name",
"value":"<username>"
,
"user_language":
"name":"user_language",
"value":"en_us"
,
"user_currency_id":
"name":"user_currency_id",
"value":"-99"
,
"user_currency_name":
"name":"user_currency_name",
"value":"Euro"
What is the module_name? No real idea. In general, when you get
back an id and a module_name field, it tells you that the id
exists is an object that exists in the context of the given module.
Not here, since the session id is not a user.
The worst here is the name_value_list concept which is used all over
the REST interface. First, it's not a list, it's a hash. Secondly, I
have no idea what would be wrong by just using keys directly in the
top level object, so the object would have looked somewhat like:
"id":"<hex session id>,
"user_id": 1,
"user_name": "<username>,
"user_language":"en_us",
"user_currency_id": "-99",
"user_currency_name": "Euro"
Some people might argue that since you can have custom field names
this can cause clashes. Except, it can't, since they're all suffixed
with _c.
So we're now logged in and can fetch all opportunities. This we do by
posting:
method=>"get_entry_list",
input_type=>"JSON",
response_type=>"JSON",
rest_data=>to_json([
$sid,
$module,
$where,
"",
$next,
$fields,
$links,
1000
])
$sid is our session id from the login$module is "Opportunities"$where is opportunities_cstm.rt_id_c IS NOT NULL. Yes, that's
right. An SQL fragment right there and you have to know that you'll
join the opportunities_cstm and opportunities tables because we
are using a custom field. I find this completely crazy.$next starts out at 0 and we're limited to 1000 entries at a time.
There is, apparently, no way to say "just give me all you have".$fields is an array, in our case consisting of id, name,
description, rt_id_c and rt_status_c. To find out the field
names, look at the database schema or poke around in the SugarCRM
studio.$links is to link records together. I still haven't been able to
make this work properly and just do multiple queries.
"result_count" : 16,
"relationship_list" : [],
"entry_list" : [
"name_value_list" :
"rt_status_c" :
"value" : "resolved",
"name" : "rt_status_c"
,
[ ]
,
"module_name" : "Opportunities",
"id" : "<entry_uuid>"
,
[ ]
],
"next_offset" : 16
Now, entry_list actually is a list here, which is good and all, but
there's still the annoying name_value_list concept.
Last, we want to update the record in Sugar, to do this we do:
method=>"set_entry",
input_type=>"JSON",
response_type=>"JSON",
rest_data=>to_json([
$sid,
"Opportunities",
$fields
])
$fields is not a name_value_list, but instead is:
"rt_status_c" : "resolved",
"id" : "<status text>"
Why this works and my attempts at using a proper name_value_list
didn't work? I have no idea.
I think that pretty much sums it up. I'm sure there are other
problems in there (such as the over 100 lines of support code for the
about 20 lines of actual code that does useful work), though.
I was due for another Google interview mail it seems. I have to say I wasn't expecting it, but this week I had a follow up to my polite mail from 6 months ago that said "No thanks, I'm not looking" asking if it was still the case.
Normally I welcome this little bit of ego stroking; it's always nice to be wanted. Except that's not really the case, is it? It's an invitation to interview for something, not any indication that you've done more than tick some initial boxes. Google mails inevitably ask me if I'd like to work in SRE. It's always SRE. No one ever emails and asks if I want to work on self-replicating nanobots that will roam Mars searching for the perfect spot to build a beach house.
And that's where things fall down. If someone currently has a job, then emailing them out of the blue to ask if they want to come and interview for something vague is hoping that they're either looking, and just haven't come to you yet, or not looking but unhappy enough with their current role that all they needed to start was an email asking them to submit a recent CV.
For the former, if you're Google, do you really think that person doesn't know where to find you? For the latter, you're being quite presumptuous, aren't you? The act of updating my CV my be some effort (actually it's usually not, because the stuff that's not on it is the stuff I can't talk about because it's not released yet, or stuff that's specific and thus wouldn't go on a CV for a vague job spec). Even if it's not the act of interviewing is potentially a waste of time for both of us, if the role isn't clear.
One argument used is that people will be placed according to the skills they show during the interview process. That's fine from the employers point of view, but if you're actively trying to get some interest from people who are gainfully employed you really need to grab their attention somehow. I can't remember the last time I had an unsolicited email interview offer that actually wowed me, or indeed even showed more than a passing sign of tailoring a spec to my profile.
When I was running Black Cat I made a point of always replying to unsolicited CVs. How polite I was depended on how the covering emails were worded (a Word document with nothing else was likely to get short shrift, something well targeted in a Linux friendly format would normally get some comment about how we weren't hiring and were unlikely to be, but if that changed it would be mentioned on the website), but I felt people deserved a reply - I have been disappointed by not receiving responses myself to what I considered well targeted job inquiries.
So far I've so far taken the same approach with mails from corporate recruiters (less so with recruiters that are associated with recruitment firms, rather than directly with the companies they are hiring for), but I'm starting to feel like changing that stance. Candidates are told to tailor CVs to the role being applied for, provide a decent cover letter, and in general make companies want to talk to them. Companies who are sending out recruitment emails should be held to the same standard. Even assuming you do a basic phone screen first, I can probably expect to need to take a day off work assuming that goes well. You need to convince me I can justify that before I'm going to feel like engaging at all.
(And if I'm honest, based on what I've seen so far, it's unlikely to happen. All of the things I've considered have come from conversations with people I know directly about companies they own or work for, never some random contact via email. I try hard not to think of recruitment mail as spam, but I can how that line of thought follows through.)
I should apologize to Google here. They got mentioned as an example, but I don't think they're particularly bad. I did interview with them at one point, and made the decision not to continue that process after deciding a different, more certain, path was better for me. So I've displayed interest. And in response to my reply today of "I know where to find you, so please assume I'll do so if I change my mind." they've said they'll make a note on their records.
Woodchuck and FrOSCon
There's a new call for testing for the next point release of Debian Squeeze. Please test the packages in squeeze-proposed-updates on some stable machines if possible, so that we don't screw up your production machines with bad updates in a week. The point release is scheduled for October 8th, i.e. next Saturday. Don't forget to copy the debian-release mailing list when you encounter regressions. Thanks for your efforts.
eysler.debian.org is now DSAed, online and building packages (including
autosigning). I will shutdown monteverdi.ayous.org which is still at my
place in the next days, reinstall the system and send it to Darmstadt as
another buildd for data center hosting there. After that happens all mipsel
buildds are DSAed as it should be, and are running in a data center and not
via some DSL line.
(In case you're looking for hardware at your place, there are a couple of
loongson 2f-systems available to buy. 2f is the successor cpu of 2e. Some
2f systems get delivered with Debian installed on it, see e.g.
http://www.aliexpress.com/product-gs/290632002-Yeeloong-8101-Laptop-10-inch-Debian-EU-Adaptor-version--wholesalers.html.
However, for buildd usage, the 2e are fine as well, and we got them
sponsored some time ago.)
Periodic Calendar, a GPL ed GUI application, coded in Java that helps keeping track of women menstrual cycles and predict fertility periods, has just entered Debian. This information can be used as supportive either for conception or contraception planning.
This program (pcalendar in Debian) is by far more complete than mencal (a simple menstruation calendar that can be run in the console) or cycle (a windowed calendar that can calculate stuff based on the length of the cycle or on statistics of previous periods), and provides support for BBT and sympto-thermal methods, which have the highest reliability in fertility periods prediction. User can thus choose any subset of the features to be used or even fall to the generic calendar method (which if used alone is very unreliable).
Keep in mind, though, that -as the authors of the program insist on- Periodic Calendar is NOT an equal substitute to the fertility planning consultants or doctors, and methods used are not 100% effective. It s a useful program, anyway.
I ve also translated the program into Spanish, made some cute icons and added MIME support so that data files can be easily open from the desktop.
Traditionally, when you start a program to view a document, for instance
xpdf resume.pdf, it stays in foreground, and only returns when it
finishes, when you are done with the document. Of course you can still run it in
background if you want.
Nowadays, several programs behave in a different way, for instance Evince. When you first start it, it stays in
foreground as usual. However, if you launch it a second time while the first
instance it still running, it will reuse this existing instance, asking it to
open your document in a new window, and immediately return. Other examples are
Firefox and LibreOffice.This behaviour is certainly more efficient in terms of memory usage and
speed, but it is non-standard and causes subtle problems. When you open the
attachment of an email message, or when you open a document from the Web
without saving it permanently, the mailer or the browser saves the document to a
temporary file, and then run a viewer with that file. As this is a temporary
file, so they cannot leave it forever in /tmp; in fact
they should delete it when you are done viewing it. I think the usual way to
implement that is to delete it when the viewer returns: with a program that
returns immediately, this means deleting it even before it has had a chance to
load it.
So, if you can no longer directly open a PDF attachment from Mutt, or if you are unable to view the compressed
documentation of the LaTeX class Beamer with texdoc (which uncompresses it to a temporary
file and calls a PDF viewer on it), you can blame your modern PDF viewer
that returns before you are finished and start hacking your mailcap file.
And if you are the author of such a
program, please consider implementing a way to keep a lightweight process that
does not return before the main process has closed the document or to disable
process reuse.
Next.