Clint Adams: Said the goose to the jailer
Wouter Verhelst kindly replied to my comments on his calculation of Steve's net pay :
"The point wasn't getting a "correct" number; only Steve could produce those, if he wanted to. The point was proving that if you get 6000 for one month of work as a business, then those 6000 aren't what you can spend on your personal life. Whether the exact number is 2400 or 3400 is, thus, totally besides the point." "But, yeah, thanks for the clarification :-)"I agree that 6000 gross works out as a lower net figure. So what? That's obvious to anyone who works and has noticed their gross pay isn't what they actually get to use, even if these "people have never had to run a business". (And I think running a business is a choice, not something anyone ever "had to" do.) If whether it's 2400 or 3400 net wasn't the point, why use inflated figures to advocate paying 6000 gross? My main point was: Dunc-Tank is not buying in a free market, so how can we tell what the fair rate is? Brian M. Carlson explained the lack of VAT:
"States in the US have either an income tax, a sales tax, or both. In the general case, non-profit corporations are exempt from taxation, as long as they have the proper paperwork. Also, certain essentials, such as necessary foods (cheese, but not soda) are exempt from sales tax where it exists." "Since Steve is almost certainly not a non-profit, he will have to pay income tax to both the state and federal governments; the rate depends on his annual income. He will have to pay FICA (social security) taxes, which are approximately 7% of the income. Any amount over $90,000 is not taxable under FICA."Thanks for the explanation. I hope it'll help other non-US people. Of course, the actual payment rate is minor to me, compared to the problems of dunc-tank being designed as a market for lemons and being driven through by brinkmanship.
"Y-" < "Y'" < "-Y-" < "Y-"
:0fw
/usr/bin/dspam --user=enrico --stdout --deliver=innocent,spam
:0
* ^X-DSPAM-Result: spam
.spam/
--client. I thus disabled the dspam server
in /etc/default/dspam. This is a shame, but luckily I don't have many
users and the server load won't suffer much.drwxrwxr-x dspam dspam /var/spool/dspam/
drwxrwxr-x dspam dspam /var/spool/dspam/data
drwxrwxr-x dspam dspam /var/spool/dspam/data/local
drwxrwx--- enrico dspam /var/spool/dspam/data/local/enrico
drwxrwx--- enrico dspam /var/spool/dspam/data/local/enrico/enrico.sig
-rw-rw---- enrico dspam /var/spool/dspam/data/local/enrico/enrico.*
drwxrwx--- pippo dspam /var/spool/dspam/data/local/pippo [...]
drwxrwx--- pluto dspam /var/spool/dspam/data/local/pluto [...]
drwxrwxr-x dspam dspam /var/spool/dspam/opt-in
drwxrwxr-x dspam dspam /var/spool/dspam/opt-in/local
-rw-rw-r-- dspam dspam /var/spool/dspam/opt-in/local/enrico.dspam
-rw-rw-r-- dspam dspam /var/spool/dspam/opt-in/local/pippo.dspam
-rw-rw-r-- dspam dspam /var/spool/dspam/opt-in/local/pluto.dspam
-rw-rw---- dspam dspam /var/spool/dspam/system.log
the opt-in files are actually empty files and dspam seems to only stat()
them, so they are probably ok even if they're not readable by users.
This setup of permissions should allow dspam to run as the various users
while fully preserving their privacy towards each others./etc/dspam/dspam.conf I commented out the Delivery options, since I let
procmail take care of the delivery. I'm also not using ParseToHeaders
anymore. The rest of the dspam configuration did not change.ParseToHeaders, I set up postfix aliases properly running
dspam as the dspam user. The trick is to create an alias file owned by the
dspam user and the dspam group, and tell postfix to use it:
alias_maps = hash:/etc/aliases, hash:/etc/postfix/aliases-dspam
alias_database = hash:/etc/aliases, hash:/etc/postfix/aliases-dspam
/etc/postfix/aliases-dspam in turn contains:
spam-enrico:" /usr/bin/dspam --user enrico --class=spam --source=error"
notspam-enrico:" /usr/bin/dspam --user enrico --class=innocent --source=error"
spam-pippo:" /usr/bin/dspam --user pippo --class=spam --source=error"
notspam-pippo:" /usr/bin/dspam --user pippo --class=innocent --source=error"
spam-pluto:" /usr/bin/dspam --user pluto --class=spam --source=error"
notspam-pluto:" /usr/bin/dspam --user pluto --class=innocent --source=error"
since I took care of leaving everything in /var/spool/dspam writable by
the dspam group, this works perfectly.
It also allows me to bounce a mail to the report address instead of
forwarding it. With ParseToHeaders I had to forward because the bounced
messages would not have the report address in their headers, and so dspam
could not identify them.
By the way, here's the mutt macro I use to report spam:
macro index,pager <F12> "bspam-enrico@xxx.xx\n\ns=.spam\n" 'Report as spam'
Debian unstable packages are available in incoming and tonight on your favorite mirror.
--default-key and append an exclamation mark at the end of the key
ID.
This was in the gpg manpage, but nowhere near the documentation of
--default-key:
Note that you can append an exclamation mark (!) to key IDs or fingerprints.
This flag tells GnuPG to use the specified primary or secondary key and not
to try and calculate which primary or secondary key to use.
So, now I'm happy:
$ gpg --sign --default-key '797ebfab!'
You need a passphrase to unlock the secret key for
user: [...]
$ gpg --sign
gpg: signatures created so far: xx
Please enter the PIN
[sigs done: xx]
And now I will spend the next week sleeping I think.
sysvinit. It separates jobs into different “run levels” and can either run a job when particular run levels are entered (e.g. /etc/init.d/rc 2) or continually during a particular run level (e.g. /sbin/getty).
The /etc/init.d/rc script is also based on the System V one (and is in the sysv-rc package), it simply executes the stop then start scripts found in /etc/rcN.d (where N is the run level) in numerical order.
Why change it?
Running a fixed set of scripts, one after the other, in a particular order has served us reasonably well until now. However as Linux has got better and better at dealing with modern computing (arguably Linux’s removable device support is better than Windows’ now) this approach has begun to have problems.
The old approach works as long as you can guarantee when in the boot sequence things are available, so you can place your init script after that point and know that it will work. Typical ordering requirements are:
/etc/fstab./etc/fstab may require tools in /usr which is a network filesystem that cannot be mounted until after networking has been brought up.
The two states shown in red (“waiting” and “running”) are rest states, normally we expect the job to remain in these states until an event comes in, at which point we need to take actual to get the job into the next state.
The other states are temporary states; these allow a job to run shell script to prepare for the job itself to be run (“starting”) and clean up afterwards (“stopping”). For services that should be respawned if they terminate before an event that stops them is received, they may run shell script before the process is started again (“respawning”).
Jobs leave a state because the process associated with them terminates (or gets killed) and move to the next appropriate state, following the green arrow if the job is to be started or the red arrow if it is to be stopped. When a script returns a non-zero exit status, or is killed, the job will always be stoped. When the main process terminates and the job should not be respawned, the job will also always be stopped.
As already covered, events generated by the init daemon or received from other processes cause jobs to be started or stopped; also manual requests to start or stop a job may be received.
The communication between the init daemon and other processes is bi-directional, so the status of jobs may be queries and even changes of state to all jobs be received.
How does it differ from launchd?
launchd is the replacement init system used in MacOS X developed as an “Open Source” project by Apple. For much of its life so far, the licence has actually been entirely non-free and thus it has only become recently interesting with the licence change.
Much of the goal of both systems appears initially to be the same; they both start jobs based on system events, however the launchd system severly limits the events to only the following:
/etc/fstab) is available and writable.
The launchd model expects the job to “sit and wait” if it is unable to start, rather than provide a mechanism for the job to only be started when it doesn’t need to wait. Jobs that need /usr to be mounted would need to spin in a loop waiting for /usr to be available before continuing (or use a file in a tmpfs to indicate it’s available, and use that modification as the event).
This is not especially surprising given that Apple have a high degree of control over both their hardware and the actual underlying operating system; they don’t need to deal with the wide array of different configurations that we have in the Linux world.
Had the licence been sufficiently free at the point we began development of our own system, we would probably have extended launchd rather than implement our own. At the point Apple changed the licence, our own system was already more suitable for our purposes.
How does it differ from initng?
Initng by Jimmy Wennlund is another replacement init daemon intended to replace the sysvinit system used by Linux. It is a dependency-based system, where upstart is an event-based system.
The notion of a dependency-based system is interesting to talk about at this point. Jobs declare dependencies on other jobs that need to happen before the job itself can be started. Starting the job causes its dependencies to be started first, and their dependencies, and so on. When jobs are stopped, if running jobs have no dependencies, they themselves can be stopped.
It’s a neat solution to the problem of ordering a fixed boot sequence and the problem of keeping the number of running processes to a minimum needed.
However this means that you need to have goals in mind when you boot the system, you need to have decided that you want gdm to be started in order for it, and its dependencies, to be started. Initng uses run levels to ensure this happens, where a run level is a list of goal jobs that should be running in that run level.
It’s also not clear how the dependencies interact with the different types of job, a dependency on Apache would need the daemon to be running where a dependency on “checkroot” would need the script to have finished running. Upstart handles this by using different events (“apache running” vs. “checkroot stopping”).
Again while interesting, Initng does not solve the problems that we wanted to solve. It can reorder a fixed set of jobs, but cannot dynamically determine the set of jobs needed for that particular boot.
A typical example would be that if the only dependency on the job that configures networking is the mount network filesystems job, then should that job fail or notbe a goal (e.g. because there are no network filesystems to be mounted) the result is that network devices themselves will not be configured. You could make everything a goal, and just use the dependencies to determine the order, however this is less efficient than just ordering the existing sysv-rc scripts (which
can be done at install time).
Another example is that often you simply don’t know whether something is a dependency or not without reading other configuration, for example the mount network filesystems may be a dependency of everything under /usr or may just be a dependency of anything allowing the user to login if it just mounts /home.
The difference in model can be summed up as “initng starts with a list of goals and works out how to get there, upstart starts with nothing and finds out where it gets to.”
How does it differ from Solaris SMF?
SMF is another approach to replacing init developed by Sun for the Solaris operating system. Like initng it’s a dependency-based system, so see above for the differences between those systems and upstart.
SMF’s main focus is serive management; making sure that once services are running, they stay running, and allowing the system administrator to query and modify the states of jobs on the system.
Upstart provides the same set of functionality in this regard, services are respawned when they fail and system administrators can at any time query the state of running services and adjust the state to their liking.
Will it replace cron, inetd, etc?
The goal of upstart is to replace those daemons, so that there is only one place (/etc/event.d) where system administrators need to configure when and how jobs should be run.
In fact, the goal is that upstart should also replace the “run event scripts” functionality of any daemon on the system. Daemons such as acpid, apmd and Network Manager would send events to init instead of running scripts themselves with their own perculiar configuration and semantics.
A system administrator who only wanted a particular daemon to be run while the computer was on AC power would simply need to edit /etc/event.d/daemon and change “on startup” to “on ac power”.
What about compatibility?
There’s a lot of systems administrators out there who have learned how Linux works already and will not want to learn again immediately, there’s also a large number of books that cover the existing software and won’t cover upstart for at least a couple of years.
For this reason, compatibility is very important. upstart will continue to run the existing scripts for the forseeable future so that packages will not need to be updated until the author wants.
Compatibility command-line tools that behave like their existing equivalents will also be implemented, a system administrator would never need to know that crontab -e is actually changing upstart jobs.
Does it use D-BUS?
“To D-BUS people, every problem seems like a D-BUS problem.” —Erik TroanThe UNIX philosophy is that something should do just one job, and do it very well. upstart’s one job is starting, supervising and stopping other jobs; D-BUS’s one job is passing messages between other jobs. D-BUS does provide a mechanism for services to be activated when the first message is sent to them, thereby starting other jobs. Some people have taken this idea and extended it to suggest that all a replacement init system need do is register jobs with D-BUS and turn booting into a simple matter of message parsing. This seems wrong to me, D-BUS would need to be extended to supervise these services, provide means for them to be restarted and stopped; as well as deal with being process #1 which means cleaning up after children whose parent’s have died, etc. It seems far simpler to arrange for D-BUS to send an event to init when it needs a service to be started, and focus on being a very good message passing system. The IPC mechanism used by upstart is not currently D-BUS because of various problems, however it’s always been expected that even if init itself doesn’t communicate with D-BUS directly, there would be a D-BUS proxy that would ensure messages about all init jobs and events would be given to D-BUS and D-BUS clients could send messages to init to query and change the state of jobs. What is the implementation plan? Because this is process #1 we are changing, we want to make sure that we get it right. Therefore instead of releasing a fully-featured daemon and configuration to the world, we’re developing it in the following stages:
/sbin/init while running the existing sysv-rc scripts. This is the shake-down test of the daemon, can it perform the same job as the existing sysvinit daemon without any regressions?/etc/rcS.d scripts replaced by upstart jobs. These consitute the majority of tasks for booting the system into at least single-user mode, and contain many of the current ordering problems and race conditions. If the daemon solves the problems here, it will be a success.upstart package for testing before it becomes the init daemon.
We welcome any experienced users who want to help test this; install the package and follow the instructions in /usr/share/doc/upstart/README.Debian to add a boot option that will use upstart instead of init. If your system boots and shut downs normally (other than a slightly more verbose boot without usplash running) then it is working correctly.
Other types of events will be added as required during development and testing. Currently only a basic client tool (initctl) has been written, compatibility tools such as shutdown will be written over the next week or two before it replaces our sysvinit package.
I understand that Ubuntu is based upon Debian. Is that the same or different than the IceWeasel browser that Debian is shipping with their latest release?Let’s check out what it is about. And as I don’t want people to doubt my words, I’ll give you, readers, the ability to check for yourself what it is all about. First, please download the latest currently available patch for Firefox 2.0 beta 2 in Debian. It has been in experimental for some weeks now. It is a bit different from the patch I described earlier, so I’ll also tell you what has been changed since this 2.0b2 patch:
It’s different. The patches that Debian applied to the Mozilla source code (which then resulted in their IceWeasel product) are more significant in scope than those in what Ubuntu is shipping (and branding as an official Mozilla Firefox release). Firefox in Ubuntu represents a somewhat more modest set of divergences from original Mozilla source code.
$ filterdiff --strip=1 firefox_2.0+0dfsg-0ubuntu3.diff > ubuntu.diff
$ filterdiff --strip=1 firefox_1.99+2.0b2+dfsg-1.diff > deb.diff
$ cd ubuntudiff
$ splitdiff -d -a ../ubuntu.diff
$ cd ../debdiff
$ splitdiff -d -a ../deb.diff
If you don’t have the splitdiff and filterdiff utilities, you can get them from the patchutils tools (you will also need another of these tools later).
Now, let’s have fun with these split patches…
Files that are only patched in Debian: (excluding any file that would be in the debian subdirectory, that contains maintainer scripts for build and installation)
$ LANG=C diff -ru debdiff/ ubuntudiff/ grep "^Only in deb" grep -v debian wc -l
6
So, that’s 6 files that Debian patches that Ubuntu doesn’t. Let’s check what they are:
$ LANG=C diff -ru debdiff/ ubuntudiff/ grep "^Only in deb" grep -v debian
Only in debdiff/: browser_base_content_aboutDialog.xul
Only in debdiff/: content_html_content_src_nsGenericHTMLElement.cpp
Only in debdiff/: content_html_content_src_nsHTMLInputElement.cpp
Only in debdiff/: dom_src_base_nsGlobalWindow.cpp
Only in debdiff/: extensions_reporter_Makefile.in
Only in debdiff/: security_coreconf_rules.mk
$ LANG=C diff -ru debdiff/ ubuntudiff/ grep "^Only in ubuntu" grep -v debian wc -l
45
Yes, that’s right, that’s 45 files that Ubuntu patches that Debian doesn’t. Most are windows sizes and similar things that upstream can’t get right because they are values adapted to Windows, but that also includes some changes to the code and some other things.
Let’s now check differences in files that are patched in both. It’s a bit of shell black magic, but you can check by hand that it does nothing wrong :
$ LANG=C diff -ru debdiff/ ubuntudiff/ filterdiff -p1 -x configure -x debian"*" lsdiff --strip=1 while read f; do diff -u debdiff/$f ubuntudiff/ awk "! /^--- ^\+\+\+ ^ ^[-+]*\@\@/ print \"$f\"; exit "; done
What’s different in the shipping Ubuntu version of Firefox than the proposed Debian version of Firefox (that didn’t ultimately ship)?Reading between the lines, that means Debian is not working with Mozilla. It’s not like we’re submitting patches. No. Never. Ever. I’m also glad to hear from Asa Dotzler, in comments to Mr Beard’s article, that this great collaboration with Ubuntu will lead to patches applied to Firefox (I guess the paid Canonical employees having more time to deal with Mozilla than the volunteer Debian maintainers may have helped, especially considering they didn’t have to do all what we already prepared). Anyways, it’s not like some of the patches we sent got applied. So, while I’m at it, here is an exhaustive list of the bugs where we took or sent the patches that are applied to Iceweasel: #51429, #161826, #252033, #258429, #273524, #287150, #289394, #294879, #307168, #307418, #314927, #319012, #322806, #323114, #325148, #326245, #330628, #331781, #331785, #331818, #333289, #333308, #343953, #345077, #345079, #345080, #345413. These don’t cover the following patches (see the rationale for these in my previous article):
Technically, changes include fixes to the User Agent string and the feed preview, a well as addressing issues of coherent branding. More significant than any specific difference in code, however, is Ubuntu’s commitment to work together with Mozilla and our community on releases going forward to insure product quality and integrity.
Why are you working with Ubuntu when you wouldn’t work with Debian?
We did try to work with Debian and would prefer a situation in which we work together. Ultimately, Debian took a position that was consistent with their own policies, and not compatible with some of the exceptions to Mozilla trademark policies that we offered. While we understand and respect their decision not to work with us under our branding guidelines, Mozilla believes that brands like Firefox are important for consumer protection. In any event, Ubuntu developers are working closely with Mozilla developers to insure product quality and features that are what users expect when they use Mozilla Firefox, which means that they’ll ship (and will continue to ship) a fully branded version.
#!/bin/bash
testname="tuxpaint"
root_geometry= xprop -root _NET_DESKTOP_GEOMETRY cut -d= -f2
root_x= echo $root_geometry cut -d, -f1
root_y= echo $root_geometry cut -d, -f2
xc=$((root_x/2-1))
yc=$((root_y/2-1))
capture_tuxpaint ()
tuxpaint --startblank --nolockfile --lang $1 --640x480 --windowed --nosound &
sleep 1
xte "mousemove $xc $yc"
xte "mouseclick 1"
sleep 1
xte "key Escape"
sleep 2
import -silent -window "Tux Paint" $testname-$1.png
xte "mousermove -120 -40"
xte "mouseclick 1"
for lang in tuxpaint --lang help awk '$1~/^[[:lower:]]/ print $1 ' ; do
capture_tuxpaint $lang
done
I’m not entirely happy with it, but it’s at least a starting point. Ideally, I’d make .pat files to use with visgrep to find coordinates for the button images instead of hardwiring the approximate button positions. Also, the script needs a companion script to configure the system for testing (i.e. perform the locales configuration and install all fonts).
Here are the resulting screenshots which show up a few problems with the translations. It looks like the quit dialog strings have been updated since they were first translated, so now we need retranslation for several languages. Also, there are some languages, like Swahili and Klingon, for which there are no locales in glibc in Debian. I’ll have to talk to the glibc maintainers about that. And for that matter, I don’t even know if a DFSG-free Klingon font exists.
In any event, I’m delighted with the results, and look forward to using xautomation more for GUI testing.
1 For one thing, several languages require special fonts. For another, there is no way to get tuxpaint to tell you what locales it supports. Granted, there is --lang help, but this is a crude approximation, as the mapping between language and locale is arbitrarily hardwired (which hmh on #debian-devel irc pointed out to me is just plain wrong). It doesn’t help me at all in the arduous task of configuring glibc locales so I can test them. For that, I need to look at i18n.c.
2 I tried using xmacro at first, but xmacrorec just made my pointer jiggle back and forth. It seemed like it was updating the position for a short distance, and then X was resetting it back to the former position of the pointer. Some strange interaction with my window manager, perhaps? But ultimately I am happier with the xautomation approach anyway.
Next.