Background I upgraded from Linux 3.8 to 3.11 among with newer Mesa, X.Org and Intel driver recently and I found a small workaround was needed because of upstream changes.And since I'm using lightdm, adding the following to /etc/lightdm/lightdm.conf means the flicker only happens once during bootup:if [ "$(/usr/bin/xrandr -q --prop grep 'Broadcast RGB: Full' wc -l)" = "0" ] ; then
/usr/bin/xrandr --output HDMI3 --set "Broadcast RGB" "Full"
fi
display-setup-script=/etc/X11/Xsession.d/95fullrgb
All these components may be running on a single host or they may be distributed across different servers and workstations in a LAN. The OpenMAMA market data bus ties them together.
External data sources
These are external sources of data. These could be currency trading firms, stock brokers, bullion dealers or even Bitcoin exchanges. Some exchanges don't provide data services directly to the general public and they distribute their price data through third-party data vendors such as Reuters and Bloomberg.
Feed handlers
The feed handlers manage the connections to external data sources. These are typically daemon processes that implement the wire protocols used by the external vendors for transmitting data over the public internet or a leased line. They typically use a point-to-point topology such as TCP connections.
The feed handlers publish the data into the market data bus.
In practice, the feed handler may be a proprietary application provided by the data vendor or it may simply be a Python script that fetches exchange rates from a URL every five minutes.
OpenMAMA
The market data bus is a distributed framework that is accessible to all of the local servers and workstations in the LAN.
At the lowest level a messaging middleware solution is used to transport the data. The Avis Event Router is a free middleware. There is upcoming support for Apache QPID as well. Some commcercial middleware is supported too - here is the full list
OpenMAMA does not provide a daemon or server process of its own. It is a set of libraries that operate on top of the middleware transport.
In very general terms, the OpenMAMA libraries let applications publish messages (such as price ticks) or subscribe to receive the messages published by other applications.
Spreadsheet application (for example, LibreOffice)
LibreOffice is introducing a new data import feature for streaming time series data. This appears to provide a useful integration point for OpenMAMA and discussion is taking place in the development community.
The spreadsheet can operate in various ways. A simple application may simply poll the currency prices when the spreadsheet is opened or refreshed. A more demanding application may see the spreadsheet come alive, recalculating all cells on every tick from the data vendor (several times per second). This latter scenario is more common in dealing rooms and hedge funds.
Accounting/billing software
There are many free accounting applications today, including PostBooks and GnuCash and some more heavyweight solutions like Adempiere and OpenERP. In a world where credit cards and the world wide web have made international trade an everyday activity, many people are using this software to track expenses and accounts in more than one currency. For example, a British business may be paying some suppliers in Euros and a Canadian may be charging some customers in US dollars. A Swiss person may be keeping some of their savings in gold bullion in the vault of one of their world reknowned Swiss banks.
A common requirement for all of these users is the balance sheet. Using real-time market data sources, the balance sheet can be refreshed at any time from the live market prices. A home user may just find it convenient that they can open the balance sheet and always see their net worth immediately without having to manually cut and paste the currency prices from a web page. A business user operating in a competitive industry with low margins may be checking the balance sheet several times per day to ensure they remain solvent and profitable.
Web shops
Many web shops now offer the customers the convenience of viewing prices in their own currency. It is important to make sure these prices are accurate, especially when dealing with volatile currencies or when the products have a low profit margin.
The web application server can receive the market data price ticks just like any other application in the network. Using this data, it can insert live prices into the pages as they are generated. If the currencies are particularly volatile, the web application could stream the prices to the browser using WebSockets and a JavaScript client embedded in the page would update the price field in real time.
In fact, this web-based streaming price update mechanism is exactly how many online financial trading services offer live market prices to their customers.
Real-time valuation server
In a large organisation there may be many users looking at the same values. For example, in a trading desk, many users may need to see the desk's overall position in each market. In a busy web shop, many concurrent users may need to see the prices of common products.
Rather than recalculating these values for each user in parallel, a common solution involves setting up a server to receive raw values (such as currency prices) from the data feed, calculate values needed by local users and then broadcast those values over the market data bus.
How applications can integrate with real-time market data
Here are some steps for getting started:
All these components may be running on a single host or they may be distributed across different servers and workstations in a LAN. The OpenMAMA market data bus ties them together.
External data sources
These are external sources of data. These could be currency trading firms, stock brokers, bullion dealers or even Bitcoin exchanges. Some exchanges don't provide data services directly to the general public and they distribute their price data through third-party data vendors such as Reuters and Bloomberg.
Feed handlers
The feed handlers manage the connections to external data sources. These are typically daemon processes that implement the wire protocols used by the external vendors for transmitting data over the public internet or a leased line. They typically use a point-to-point topology such as TCP connections.
The feed handlers publish the data into the market data bus.
In practice, the feed handler may be a proprietary application provided by the data vendor or it may simply be a Python script that fetches exchange rates from a URL every five minutes.
OpenMAMA
The market data bus is a distributed framework that is accessible to all of the local servers and workstations in the LAN.
At the lowest level a messaging middleware solution is used to transport the data. The Avis Event Router is a free middleware. There is upcoming support for Apache QPID as well. Some commcercial middleware is supported too - here is the full list
OpenMAMA does not provide a daemon or server process of its own. It is a set of libraries that operate on top of the middleware transport.
In very general terms, the OpenMAMA libraries let applications publish messages (such as price ticks) or subscribe to receive the messages published by other applications.
Spreadsheet application (for example, LibreOffice)
LibreOffice is introducing a new data import feature for streaming time series data. This appears to provide a useful integration point for OpenMAMA and discussion is taking place in the development community.
The spreadsheet can operate in various ways. A simple application may simply poll the currency prices when the spreadsheet is opened or refreshed. A more demanding application may see the spreadsheet come alive, recalculating all cells on every tick from the data vendor (several times per second). This latter scenario is more common in dealing rooms and hedge funds.
Accounting/billing software
There are many free accounting applications today, including PostBooks and GnuCash and some more heavyweight solutions like Adempiere and OpenERP. In a world where credit cards and the world wide web have made international trade an everyday activity, many people are using this software to track expenses and accounts in more than one currency. For example, a British business may be paying some suppliers in Euros and a Canadian may be charging some customers in US dollars. A Swiss person may be keeping some of their savings in gold bullion in the vault of one of their world reknowned Swiss banks.
A common requirement for all of these users is the balance sheet. Using real-time market data sources, the balance sheet can be refreshed at any time from the live market prices. A home user may just find it convenient that they can open the balance sheet and always see their net worth immediately without having to manually cut and paste the currency prices from a web page. A business user operating in a competitive industry with low margins may be checking the balance sheet several times per day to ensure they remain solvent and profitable.
Web shops
Many web shops now offer the customers the convenience of viewing prices in their own currency. It is important to make sure these prices are accurate, especially when dealing with volatile currencies or when the products have a low profit margin.
The web application server can receive the market data price ticks just like any other application in the network. Using this data, it can insert live prices into the pages as they are generated. If the currencies are particularly volatile, the web application could stream the prices to the browser using WebSockets and a JavaScript client embedded in the page would update the price field in real time.
In fact, this web-based streaming price update mechanism is exactly how many online financial trading services offer live market prices to their customers.
Real-time valuation server
In a large organisation there may be many users looking at the same values. For example, in a trading desk, many users may need to see the desk's overall position in each market. In a busy web shop, many concurrent users may need to see the prices of common products.
Rather than recalculating these values for each user in parallel, a common solution involves setting up a server to receive raw values (such as currency prices) from the data feed, calculate values needed by local users and then broadcast those values over the market data bus.
How applications can integrate with real-time market data
Here are some steps for getting started:
I happens quite often that I install a manually built, newer version of
some package on a machine. Occassionally I forget to remove it or to
downgrade it to the version in the APT repo.
$ apt-show-versions fgrep newereasily finds those packages. But usually when doing such a check, I want this list of packages in my aptitude TUI to have a look at the other versions of that package and to take actions. And I don t want to manually search for each of the package manually. This can be done with the following one-liner :
# aptitude -o "Aptitude::Pkg-Display-Limit=( apt-show-versions fgrep newer awk -F '[ :]' ' printf "~n ^"$1"$ " ' sed -e 's/ *$//' )"It uses
apt-show-version s output, searches for the right
packages, takes the first column and transforms it into an aptitude
search pattern matching all packages whose name is exactly one of the
listed packages.
But this solution is quite ugly and slow. So I wondered if this is
also doable with pure
aptitude search patterns which likely would also be faster.
And after some playing around I found the following working aptitude
search term:
~i ?any-version(!~O.) !~U !~oThis matches all packages which which are installed and which have a version which has no origin, i.e. no associated APT repository. Since this also matches all hold packages as well as all packages not available in any archive, I use
!~U !~o to exclude those
packages from that list again.
Since nobody can remember that nor wants to type that everytime
needed, I added the following alias to my setup:
alias aptitude-newer-than-in-archive='aptitude -o "Aptitude::Pkg-Display-Limit=~i ?any-version(!~O.) !~U !~o"'Only caveat so far: It seems to also match packages from APT repos which haven t set an Origin . This should not happen with any Debian or Ubuntu APT repository, but seems to happen occasionally with privately run APT repositories. And using
~A instead of ~O, i.e. ~i
?any-version(!~A.), does not work for this case either, despite
it matches installed packages of which versions not in any available
archive exist. But unfortunately aptitude seems to remember in some
way if a package was in some archive in the past, so this only shows
packages installed with dpkg -i, but not packages removed
from e.g. unstable but with older versions still being available in
stable.
The first Debian meetup in Zurich last month was quite a success and
I look forward to further Debian meetups
in Zurich every first Tuesday of the month.
The next meetup will be
on Tuesday, 2013-Dec-03 starting at 18:30 CET
at St. Gallerhof,
Konradstrasse 2, 8005 Zurich
Please note that this is a different location than last month.
Everybody who is interested in Debian is welcome to join us.
Registering is not necessary.
There was also some interest in Debian meetups in other Swiss cities,
namely Bern and somewhere around Lac Leman. In case you want a Debian
meetup elsewhere in Switzerland, too, or if you re interested in any
Debian meetup in Switzerland, feel free to join the Swiss
Debian Community Mailing List and help organising other Swiss
Debian meetups.
There is big news in Europe right now, especially the UK, about the Scottish nation's manifesto for independence.
I thought this was really amazing, a country that is going to move to free software and protect its citizens from horrors like DRM. I couldn't wait to find out more, for example, will they use Linux or *BSD?
After all, how many nations today can really consider themselves independent when they are trapped in the use of complex and opaque systems that require ongoing royalty payments to a foreign corporation, much like ancient villages paying their tithes to Rome? Today it is actually worse: these independent nations are not just sacrificing their cash - the new Rome is also using those same secret, proprietary systems to raid their subjects' privacy.
So I went to the manifesto's web site to get the details. I couldn't even find the words "software" or "technology" listed in the policy index on the front page - and software doesn't even appear in the search results. A section on Culture, Communications and Digital only really looks at the issues for the media (BBC after independence). They don't even make any comment about the British Telecom (BT) pension crisis and whether Scotland will abandon BT's services, leaving only those customers south of the border to continue subsidising the deficit through higher phone bills.
There is some hope, with the dot scot (.scot) top level domain coming in 2015 regardless of the referendum outcome.
Does this mean an independent Scotland is going to be run without technology at all then? That could be an interesting way to avoid the type of infiltration of communications technology that has been taking place in Brussels. Or do the people calling the shots simply fail to realise the impact of software and communications technology on a modern day concept of independence?
Party date set
For those who just care about gatecrashing the post-independence party, start booking your leave for March 2016.
Earlier this year the blog had its tenth anniversary. I had meant to
celebrate the occassion by revamping the site and blog a little.
Having set up the
updated R/Finance site,
the Rcpp Gallery and
Rcpp sites as well as the much-needed overhaul
of the html side of the
CRANberries RSS feed (which
also integrates it with the static blog compiler I use),
I figured I just needed a little time to get this done. Well, eight months
later we're there. It still uses
Twitter Bootstrap for layout, and
a slightly modified Bootswatch theme.
Comments welcome, and please let me know if links are missing or going
nowhere in places.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
import os
os.execvp("sh", ["sh", "-c", "exit 1"])
As a UNIXy person, I d expect running the above script to return an error code of 1. And I would be perfectly right on UNIX systems.
On Windows, it returns 0.
You d think such a difference in behavior would be documented? It s not.
Thank you python.
The results are presented using the coverity connect web technology based defect management tool. Access to the coverity connect interface is controlled by a user management system which precludes publicly publishing the results within the CI system.| Publisher: | Hyperink |
| Copyright: | October 2013 |
| ASIN: | B00FXGXMPQ |
| Format: | Kindle |
| Pages: | 97 |
This year, I had slowly taken again running. It's an activity I enjoy, even though I'm far from the condition I had when I did it every day My maximum was running about 8Km four days a week (ocassionally up to 15Km, say, on weekends)... But I slowly drifted out of it over the last three years. Yes, I have taken it up now and then, but dropped out again after a few weeks.
Well, this year it felt I was getting back in the routine. Not without some gaps, but I had ran most weeks since July at least once, but usually two times. I started slowly, doing about 3Km close to home, but didn't take much to go back to my usual routes inside UNAM, doing a modest average of 4.5-5Km per run, and averaging somewhat over 8Km/h (6.5 min/Km).
But... Well, I cannot relate precisely what happened on this Exactly a month ago, after a very average run (even a short one, 3.6Km), I had a lower back ache. Didn't pay too much attention to it, but it was strange since the first day, as I often have upper back aches Never lower.
The pain came and went slowly several times. I kept cycling to work, although not every day. On October 27th, I even took the time to do the Ciclot n, a nice 38Km (including the ~5Km distance from home) around central Mexico City. I enjoyed the ride, even though every stop and re-start of the bike was a bit painful what hurts is to get off and on the bike: The posture change. But the pain has been almost constantly there. When I stand up, or when I sit down, it's about five minutes until the body gets used to the new position and stops hurting.
Another strange data point: This last weekend (together with a national holiday) we went to a small conference in Guadalajara, and then to visit our friends in Guanajuato. So, we spent 12 hours on the bus there (12 Yes, there was an accident on the road, and we could not pass... So many hours were wasted there, and going back to a junction to take an alternative, longer road), then one night in a hotel bed, and two nights in our friends' guest mattresses which are not precisely luxury-grade. And Sunday night... I had no pain at all!
Came back home, and after only one night back in our bed... I just could not move. I had the strongest pain so far. Could not even walk without some help. We went to the orthopedist a friend recommended, and I was seriously bending my posture: While that part of my posture is usually stable, my right hip was about 2cm higher than the left one, and my shoulders were almost 7cm displaced from my hips!
So... Well, I'm having a cocktail of painkillers and antiinflamatories. The doctor says next week he wants me to have a tomography taken to better understand the causes for this.
And, of course, tomorrow I'm leaving for Festival de Software Libre in Puerto Vallarta. I'm going there by plane, so no big hassle. But the way back, it will be 12 more hours on a bus. I'm... not precisely looking forward to this bus ride :(
Anyway... I sorely miss my bike+running :(
This is part 6 in a series on organizational design and growth.
The change from a business that the owner-entrepreneur can run with helpers to a business that requires management is a sweeping change. [...] One can compare the two kinds of business to two different kinds of organism: the insect, which is held together by a tough, hard skin, and the vertebrate animal, which has a skeleton. Land animals that are supported by a hard skin cannot grow beyond a few inches in size. To be larger, animals must have a skeleton. Yet the skeleton has not evolved out of the hard skin of the insect; for it is a different organ with different antecedents. Similarly, management becomes necessary when an organization reaches a certain size and complexity. But management, while it replaces the hard-skin structure of the owner-entrepreneur, is not its successor. It is, rather, its replacement. Peter DruckerWhat it means Management is the art of enabling people to cooperate in achieving shared goals. I ve written elsewhere about what management is not. Management is a multifaceted discipline which is centered on people and the environment in which they work. Why it s important In very small organizations, management can be comparatively easy, and happen somewhat automatically, especially between people who have worked together before. But as organizations grow, management becomes a first-class concern, requiring dedicated practice and a higher degree of skill. Without due attention to management, coordination becomes excessively difficult, working systems are outgrown and become strained, and much of the important work described in this series just won t happen. Management is part of the infrastructure of the organization, and specifically the part which enables it to adapt and change as it grows. Old Status Quo People generally just do stuff , meaning there is little conscious understanding of the system in which people are working. If explicit managers exist, their jobs are poorly understood. Managers themselves may be confused or uncertain about what their purpose is, particularly if they are in such a role for the first time. The organization itself has probably developed more through accretion than deliberate design. New Status Quo People work within systems which help coordinate their work. These systems are consciously designed, explicitly communicated, and changed as often as necessary. Managers guide and coordinate the development and continuous improvement of these systems. The role of managers in the organization is broadly understood, and managers receive the training, support and coaching they need to be successful. Behaviors that help
I wanted to create a Deb-o-Matic environment to testbuild packages for a different architecture. Taking inspiration on St phane s excellent blog post, I tried to replicate the creation of a cross-architecture Linux container in Debian. Here are the steps I made:
Load binfmt_misc module:# modprobe binfmt_misc
Install the required packages:# apt-get install lxc debootstrap rsync qemu-user-static binfmt-support
Mount the cgroup virtual filesystem:# mkdir /cgroup
# echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab
# mount -a
I needed a specific template to create a cross-architecture container. I used the excellent one by Laurent Vivier. Download it, rename it as lxc-cross-debian, mark it executable, and store it under /usr/share/lxc/templates.
Create the cross-architecture container, an armhf one in this case:# lxc-create -t cross-debian -n debian-armhf -- --arch armhf --suite sid --interpreter-path /usr/bin/qemu-arm-static
After a while, the container was created and I enjoyed my brand new armhf test machine
Tor is a proxy server which allows its users to
hide their IP address from the websites they connect to. In order to provide
this level of anonymity however, it introduces latency into these
connections, an unfortunate performance-privacy trade-off which means that
few users choose to do all of their browsing through Tor.
Here are a few things that I have found work quite well through Tor. If
there are any other interesting use cases I've missed, please leave a comment!
systemsettings and setting a
manual proxy of localhost on port 8008 (i.e. the local instance of
Polipo).
Similarly, I use podget to automatically
fetch podcasts through this cron job in /etc/cron.d/podget-francois:
0 12 * * 1-5 francois http_proxy=http://localhost:8008/ https_proxy=http://localhost:8008/ nocache nice ionice -n7 /usr/bin/podget -s
Prior to that, I was using
hpodder and had the following in
~/.hpodder/curlrc:
proxy=socks4a://localhost:9050
~/.gnupg/gpg.conf:
keyserver-options http-proxy=http://127.0.0.1:8008
However, that tends to makes key submission fail and so I created a key
submission alias in my ~/.bashrc which avoids sending keys through Tor:
alias gpgsendkeys='gpg --send-keys --keyserver-options http-proxy=""'
SOCKS5 (not Tor/Privacy)
proxy of localhost on port 9050.
9050.
not my most active RC bug squashing week but still, a few things
done:
| Series: | Sirantha Jax #2 |
| Publisher: | Ace |
| Copyright: | September 2008 |
| ISBN: | 0-441-01627-8 |
| Format: | Mass market |
| Pages: | 312 |
This is an essay form of a talk I have given today at the Cambridge
Mini-debconf. The talk was videoed, so will presumably show up in the
Debconf video archive eventually.
Abstract
Debian has a long and illustrious history. However, some of the things
we do perhaps no longer make as much sense as they used to do. It's a
new millennium, and we might find better ways of doing things. Things
that used to be difficult might now be easy, if we dare look at things
from a fresh perspective. I have been doing that at work, for the
Baserock project, and this talk is a compilation of observations based
on what I've learnt, concentrating on things that affect the
development workflow of package maintainers.
Introduction and background
I have been a Debian developer since August, 1996 (modulo a couple of
retirements), and have used it a little bit longer. I have done a
variety of things for Debian, from maintaining PGP 2 packages to
writing piuparts to blathering excessively on the mailing lists.
My day job is to develop the Baserock system at Codethink. Baserock is
a set of tools and workflows for developing embedded and appliance
Linux systems. If you squint, it looks a bit like a source-based Linux
distribution. I have worked on Baserock since September, 2011.
Some of Baserock's design has been influenced by my experience with
Debian. With Baserock I have the chance to fix all the things that are
wrong in Debian, and this talk is me giving back to Debian by pointing
out some the things I feel should be fixed. I don't have solutions for
these problems: this is a bug report, not a patch. It's also perhaps a
bit of a rant.
I am specifically concentrating here on technical and tooling issues
that affect the development process of Debian. I excluding social
issues.
I am also not trying to get Debian to switch to Baserock. Baserock is
targeting embedded and appliance systems, and makes simplifying
assumptions based on those targets, which Debian does not get to do. I
am pointing out problems, and I am outlining solutions as implemented
in Baserock, when I think the concept carries over well to Debian.
Build tools should be intelligent, packaging should be dumb
In Debian, the fundamental tool for compiling the upstream code and
assembling a binary package is dpkg-buildpackage. It uses
debian/rules, which is a Makefile with targets with specific names
and semantics. By executing the right targets in the right order,
dpkg-buildpackage tells the source package to build the binary
package.
On the one hand, this is a nice design, because it abstracts away the
large variety of upstream build systems into one API for
dpkg-buildpackage to use. On the other hand, it puts all the
intelligence for how packages are built into the packages.
Making packaging intelligent, rather than the build tool, means
packagers need to do more work, and there's more work to do when, say,
the Debian policy changes, or when there are other changes that affect
a large number of packages. If packaging is intelligent, then every
package needs changes. If the build tool is intelligent, then you
change the build tool and re-build everything.
In Baserock we put as much intelligence as we can into the Morph tool,
which drives the build process. It turns out that today, unlike in
1995, most upstream projects use one of a handful well-known build
systems: autotools, cpan, cmake, Python distutils, etc. With just a
little extra logic in Morph we avoid having any delta against upstream
in Baserock. This doesn't work for quite all upstream projects, of
course, but we've spent the 2% (two, not twenty) of effort that solves
80% of the problem.
In recent years, the dh approach to packaging has made a lot of
packages be able to have only a minimal, 3-line debian/rules file.
This is excellent. Wouldn't it be nice if even that wasn't needed?
It'd save thousands of files in source packages across the archive, at
least. It would be easy to: if the file is missing, have
dpkg-buildpackage assume the 3-line version by default.
Getting rid of a single file is, of course, not a particularly big
win. The big win is the change in mindset: rather than dealing with
all new issues in development by adding yet more fields to
debian/control and more optional, competing tooling outside the core
toolset, if you improve the tools everyone uses, then everyone's
packages gets better.
The goal should, in my opinion, be that for the large number of
packages where upstream uses a well-known, well-behaved build system,
and uses it in a reasonably sensible way, the Debian source package
should not require anything added to make the package build. There
will still be a need to add some stuff, such as the debian/copyright
file, to make a good Debian package, but just getting the package to
build should require nothing extra. (Side note: wouldn't it be nice if
there was a well-known, widely used way to mark up copyright
information so that debian/copyright could be constructed and
updated automatically?)
Configuration file handling on upgrades: add ucf to dpkg already
In the 1990s, dpkg had excellent handling of configuration files and
merging local changes with changes from the new package version, but
it was excellent only because it tried to do that at all, and mostly
nothing else did. It hasn't changed much, since, and it's not
excellent on any absolute scale.
We have the ucf tool, which can do a better job, but requires to be
added to each package wanting to use it. Why don't we make dpkg
smarter, instead? If ucf is not not good enough to be merged
wholesale into dpkg, let's write something better.
Making every package maintainer use ucf manually is just wasteful.
This is not the kind of thing that should be done for each package
separately: the package manager should be smart so that packaging can
be stupid.
The goal should be that dpkg is smart enough in its configuration
file handling that having the package do it is a very rare special
case.
Clean building shouldn't be hard
The basic tool for building a package is dpkg-buildpackage. It is
ever so slightly cumbersome to use, so there are some wrappers, most
importantly debuild. However, if you're making a build intended to
be uploaded to the Debian archive, you should be doing a clean build.
This means having to learn, configure, and use yet more tools.
A clean build is important: security updates, development, debugging,
quality control, porting, and user support become more difficult if we
don't know how a package was built, and can't reproduce the build. It
gets harder to keep build dependencies correct, making it harder for
everyone to build things.
Luckily, Debian has solved the clean build problem. Unluckily, it has
solved it multiple times, creating the problem of having to choose the
clean building approach you want to use. The default way of building
is not clean, so then you have to remember to use the non-standard
way. You also get to spend time maintaining the clean build
environments yourself, since that doesn't seem to be fully automated.
None of this is hard, as such, but it's extra friction in the
development workflow.
The primary approaches for clean building in Debian seem to be
pbuilder, cowbuilder, and sbuild. I happen to use pbuilder
myself, because it's what's been around the longest, but I make no
claim of having made an informed choice.
That is part of the problem here: why should I have to spend the
effort to become informed to make a choice well? Why is the default
way of building not clean? Don't say performance: Morph sets up a
clean staging area in seconds, and does not offer you a choice of not
doing so. It's a chroot, with everything but the build tree hardlinked
from cached, unpacked build dependencies, and protected using
read-only bind mounts.
What's more, this approach avoids having to maintain the pbuilder
base tarballs or sbuild chroots manually. It's all automatic, and up
to date, for every build. Furthermore, the staging area contains only
the specified build dependencies, and not anything else, meaning a
build fails if a build dependency is missing, rather than succeeding
because it happens to be in the default set of packages the build tool
installs.
Mass building shouldn't be hard
Suppose you want to try out a large-scale change in Debian. It might
be trying out a new version of GCC, or using llvm's clang as the
default C compiler, or updating glibc, or doing a large library
transition such as a new version of GTK+, or trying a new dpkg
version, or even something more exploratory such as changing the
default optimisation flags for all packages to see what breaks.
All of these will require you to at least rebuild all affected
packages. Ideally you'd test the built packages as well, but let's
concentrate on the building for now.
Here's what you do. You make the changes you want to try out, and
build those packages. You create a dedicated APT repository, and
upload your packages there. You configure your build environment to
favour that APT repository. You make a list of all reverse build
dependencies of the packages you changed. You write a script to build
all of those, preferably so that if you change A, and rebuild B, then
you also rebuild C which build depends on B. Each rebuilt package you
also upload to your APT repository. You keep track of the build log,
and success or failure, of each build.
The people in Debian who do this kind of stuff regularly presumably
have tools for doing it. It shouldn't be a rare, special thing,
though. If my package has reverse build dependencies, I should at
least consider testing building when I'm making changes. Otherwise, it
might take years until the reverse build dependencies are rebuilt, and
the problem is only found then, making it harder to fix.
To be fair, building a lot of packages takes a lot of resources. It's
not feasible to rebuild everything in Debian every time there's any
change to, say, eglibc. However, it's feasible to do it, for large
subsets of the archive, without huge hardware investments.
One VCS to rule them all
In 1995 there was really only one relevant version control system:
CVS. It was not a great tool. In 2000, another contender existed:
Subversion. It fixed some problems in CVS, but still wasn't a great
tool. In 2005, there was a great upheaval and distributed version
control systems started to become mainstream. There were a large
handful of them. In 2010, it was becoming pretty clear that git had
won. It's ugly, but it's powerful.
I'm not going to debate the relative merits of different version
control systems. Until recently, I was a Bazaar boy, and all of my
personal projects were kept in Bazaar. (I have recently switched
everything to git.)
There are, however, strong benefits from everyone using the same
system. Developers don't need to learn a dozen version control
systems. Tools that operate on many repositories are easier to write
and maintain. Workflows become simpler if one system can be assumed.
Debian has a strong historical tendency to choose every option. This
is sometimes a good thing, and sometimes a bad thing. For keeping
source packages in version control I believe it is to be a bad thing.
The status quo is that a Debian source package may not be in version
control at all, or it might be in any version control system.
This is acceptable when everyone only ever needs to maintain their own
packages. However, in a distribution the size of Debian, that is not
the case. NMUs, security support, archive wide transitions, and other
situations arise when I might need to change yours, or you might need
to change mine.
We try to work around this by having a complicated source package
format, using quilt to maintain patches to upstream semi-manually in
a debian/patches directory. This is an awkward workflow. It's a
workflow that trips up those that are not used to it. (I know quilt
is a patch management system, not a version control system. I think
git does it much better anyway.)
It would be oh so much easier if everyone kept their source packages
in the same, real version control system. I don't even care what it
is, as long as it is powerful enough to handle the use cases we have.
Imagine a world where every Debian source package is kept, for
argument's sake, git, and everyone also uses the same layout and
roughly the same workflow to maintain it. What would this mean?
It would mean that if you want to inspect the history of your package,
you know how to do that. If you want to merge in some bugfix from
upstream code, you know how to do that, without having to figure out
which of the several source package formats are in use.
It would make feasible the development of more powerful, more higher
level tooling. For example, it would allow Debian to have what we call
system branches in Baserock. In Debian we have stable, testing,
unstable, and experimental. We may get something like Ubuntu's PPAs,
or perhaps an improved version of those. These are very poor versions
of system branches, just like quilt is a poor way to manage patches
and deltas against upstream. For example, you can upload an
experimental version of gccto experimental, but then nobody else
can upload another experimental version. You can set up your own PPA
for this, but you'll still be affected by all the uploads to
unstable while you're working.
A Baserock system branch is a branch of the entire system, or the
entire distribution in the case of Debian. It is isolated from other
system branches. In branch in an individual repository is a well-known
concept. A system branch is conceptually like branching every
repository in the distribution at once. The actual implementation is
more efficient, of course.
This would be possible to implement without standardising on one
version control system, but it would be much harder to implement, and
would have to live with the lowest common denominator for features.
CVS and Subversion, for example, don't really to merges, where Bazaar,
Mercurial, and git do. Possible does not mean feasible.
Any work you do in a system branch is isolated. Your work doesn't
affect others, and theirs doesn't affect yours, until a merge happens.
This is a simple, but very powerful tool.
Cheap system branches, and powerful merging, makes it possible to do
experiments safely, with little fuss. Combine that with being able to
build everything cleanly and quickly, and get into a situation where
there's no need to have make technical decisions based on arguments on
mailing lists, and instead they can be done by choosing by looking at
working code.
I don't know how this could be implemented in Debian, but think about
it. If Debian could have this, it might many archive-scale changes
easier.
debian/rules clean: really?
One of the silliest things we require of packages is that they have a
debian/rules clean rule that cleans up after a build perfectly so
that we can do repeated builds in the same source tree.
Let's just use git clean -fdx instead.
This is a problem that is superbly well suited for automation. There
is no point whatsover making packagers do any manual work for this.
Large scale semi-mechanical changes require too much effort
About a decade ago, we decided to follow a new version of the
Filesystem Hierarchy Standard and transition from /usr/doc to
/usr/share/doc. This was an almost entirely mechanical change: in
many cases, a mere rebuild would fix it, and in almost every other
case it was just a minor tweak to the packaging. A one-line change.
It took us seven years to do this.
Seven years. Think about it.
In a recent discussion about building R binary data files from source
at package build time it was suggested that we take 2-3 release cycles
to get this done. That's four to six years. Think about it.
These are not isolated cases. Every time we need to make a change that
affects more than a small handful of packages, it becomes a major
undertaking. Most of the time all the people involved in this are
agreeable to the change, and welcome it. The change takes long because
it requires co-ordinating a large number of people. Sometimes people
are just busy. Sometimes they've left the project, but haven't
properly orphaned their packages. Waiting for a timeout for answers
about packages drags the process longer.
Mechanical changes, or semi-mechanical ones, which are very easy and
very quick to do should not take years. They should take an evening,
no more.
There's no end of changes we might want to do like this. In 2005 and
2006 I filed a few hundred bugs from failed piuparts runs. They're
still being fixed, even when the fix is simple, such as adding a
postrm script to remove, when the package is purged, a configuration
file created by postinst, or starting the service with invoke-rc.d
rather than running an init.d script directly. Mostly one-line
changes.
There's more mechanical changes that might happen. For example,
changing the value of the VCS-Browser field when the Debian version
control server changes domain names.
It's not just about simple, mechanical changes, either. Transitions of
important library packages, for example, which require changes to
reverse dependencies due to a changed API are another source of pain.
What should be a few evenings of build fixes can drag out to months of
co-ordination.
This is caused partly by technical issues, and partly due to social
issues. The main social issue is that we have quite a strong ownership
of packages, and NMUs are to be done carefully, and only in some
cases. This is both good and bad, and I won't discuss that aspect now.
The technical issues are that our tools are primarily intended for
maintaining individual packages, rather than all of them together,
making it harder to make even simple changes in large number of
packages.
In addition to easy mass building and system branches, as outlined
above, large-scale changes would require testing tools so that you
don't build the new package versions, but also test things
automatically. Essentially, CI at the distribution level.
Conclusion
I've listed above a small variety of problems I see in the Debian
development processes and tools. They're not the important part of
this talk. The important part is that it we, the Debian developers,
should look at our tools, and workflows, critically, and improve them
when we can. Even small improvements are very useful, when they affect
each of our twenty thousand source packages. The important change I
argue for here is one in mindset, rather than any specific problem in
any tool. We need a mindset of constant, incremental improvement for
our tools.
Next.