Ali's Hive Mind |
![]() |
Create Your Own Graphical Web of Trust [Aaron Toponce]
I created my GnuPG key back in 2004, and I’ve been very active with it since (thank you Glen). I have also seen graphical representations of the Web of Trust for a specific public keyring, and I’ve always been curious how I could create my own. Well, last night I finally buckled down and figured it out. So, hopefully, this will be of interest for some. In case you’re curious, this is what I’m talking about.
First, make sure you have the gnupg, sig2dot, graphviz and imagemagick packages installed. You will need various tools from each of these. Of course, you’ll also need access to your public keyring. This is generally found in the ~/.gnupg/pubring.gpg file.
First, the sig2dot package just provides a single Perl script that reads signatures in an OpenPGP/GPG keyring, and creates a “dot” file. This dot file is just an ASCII file that describes the relationships between the signatures in the file, and their distance to/from each other. However, the dot file by itself isn’t very interesting. So, we can covert that dot file to a PostScript file or an image directly. Personally, I have found that creating the PostScript file, then converting to an image from that to produce better results than going directly from the dot file to an image. Of course, one you have your image, you’re done.
So, here’s the commands in order that are needed to create your graphical web of trust. I do everything in my ~/.gnupg/ directory, as you can see. Feel free to do this wherever you wish:
$ gpg --list-sigs --keyring ~/.gnupg./pubring.gpg | sig2dot > ~/.gnupg/pubring.dot 2> ~/.gnupg/pubring.error.txt $ neato -Tps ~/.gnupg/pubring.dot > ~/.gnupg/pubring.ps $ convert ~/.gnupg/pubring.ps ~/.gnupg/pubring.gif
This should take a bit, depending on the size of your pubring.gpg file. On my dual core, with 4GB RAM, it takes about 45 seconds from start to finish, which is a bit longer than you initially would expect. Also, some have reported that the “neato” command doesn’t work for them. So, the graphviz package also provides the “dot” binary for working on dot file. So, instead, you could run:
$ gpg --list-sigs --keyring ~/.gnupg./pubring.gpg | sig2dot > ~/.gnupg/pubring.dot 2> ~/.gnupg/pubring.error.txt $ dot -Tps ~/.gnupg/pubring.dot > ~/.gnupg/pubring.ps $ convert ~/.gnupg/pubring.ps ~/.gnupg/pubring.gif
You’ll notice that I’m saving the STDERR output to “~/.gnupg/pubring.error.txt”. I’m only doing this for logging purposes. Also, feel free to experiment with the options for both neato/dot and convert. I like the GIF format, as it’s 1/10 the size of the equivalent PNG, so it’s great to put up on web pages to save bandwidth. I believe neato/dot supports SVG, so you could try that as well.
At any event, you might want to save the above in a script in your ~/.gnupg/ directory, in case you want to update your web of trust image. Here’s mine: http://aarontoponce.org/pubring.gif.
Happy hacking!
FSF responds to Oracle v. Google and the threat of software patents [News]
As you likely heard on any number of news sites, Oracle has filed suit against Google, claiming that Android infringes some of its Java-related copyrights and patents. Too little information is available about the copyright infringement claim to say much about it yet; we expect we'll learn more as the case proceeds. But nobody deserves to be the victim of software patent aggression, and Oracle is wrong to use its patents to attack Android.
Back in 2005, before JavaScript was required for everything on the web, I created a toy language called webscript, to let you script automatic web interactions. I wanted to use webscript to replace some clunky wget-based shell scripts we were using to do things like track packages and reboot computers. Two real webscript programs illustrate the language.
This used to work for tracking UPS packages:
#!./webscript
load "http://www.ups.com/WebTracking/track?loc=en_US"
find textbox "InquiryNumber1"
input "1z30557w0340175623"
find next checkbox
input "yes"
find prev form
submit
if(find "Delivery Information"){
find outer table
print
}else if(find "One or more"){
print
}else{
print "Unexpected results."
find page
print
}
And this used to work to connect to a APC power strip and reboot the computer named yoshimi:
#!./webscript load "http://apc-reset/outlets.htm" print print "\n=============\n" find "yoshimi" find outer row find next select input "Immediate Reboot" submit print
I say that the scripts used to work because I haven't run them in a few years.
One of the goals of webscript was to let the programmer describe the
interactions with the web page instead of working with the raw form
parameters, so that scripts would even as the hidden plumbing behind
the web page changed. Even so the UPS script mentions InquiryNumber1.
Every few years I go looking for a replacement for webscript, but I never find anything. As more web sites require JavaScript to do anything useful, the job of implementing something like webscript gets harder. I think you'd essentially have to link against a browser to make it work.
Do you know of a tool like webscript that works with today's web pages? Do you know an easy way to make one? (I know about AppleScript and Chickenfoot, but I'd prefer something that can run and produce output as a command line program, without even displaying a web browser on my screen, so that it can be used in shell scripts and cron jobs.)
An Open Letter To Pastor Terry Jones [Aaron Toponce]
Dear Pastor Terry Jones-
I understand that on September 11th, you plan on carrying out the act of burning Qur’ans with your local church. Do you seriously realize the significance of the act you’re about to carry out? This will create all sorts of complications and security concerns for our troops in Afghanistan. This will cause and fuel much emotion throughout our own country as well. You say that you and your church plan on carrying firearms to the event, in the case your lives are threatened. Do you realize that there could be a shootout at your event? You could die, as well as members of your congregation, for burning Qur’ans. Is this something you’re willing to do? Put your own congregation’s lives on the line for your personal hatred towards Islam?
I would ask if this is the Christian thing to do, but I already saw an interview of you on ABC News, and know what your response would be. Except, what does it mean when Jesus Christ said:
12 Therefore all things whatsoever ye would that men should do to you, do ye even so to them: for this is the law and the prophets.
Or again, in Luke:
31 And as ye would that men should do to you, do ye also to them likewise
Even a lawyer asked Jesus what he should do to obtain eternal life:
25 ¶ And, behold, a certain lawyer stood up, and tempted him, saying, Master, what shall I do to inherit eternal life?
26 He said unto him, What is written in the law? how readest thou?
27 And he answering said, Thou shalt love the Lord thy God with all thy heart, and with all thy soul, and with all thy strength, and with all thy mind; and thy neighbour as thyself.
28 And he said unto him, Thou hast answered right: this do, and thou shalt live.
Most people, Christians and non-Christians alike, are familiar with this law knows as the “Golden Rule“. Even Islam, the religion you hate so much, teaches that a true Muslim must do good to others, and treat them as they would want to be treated. To be a Christian, that is, to follow the teachings of Jesus, means to actually follow the teachings of Jesus. Jesus never advocated war. He never advocated hate. He taught that you should
44. … Love your enemies, bless them that curse you, do good to them that hate you, and pray for them which despitefully use you, and persecute you.
29. … unto him that smiteth thee on the one cheek offer also the other; and him that taketh away thy cloke forbid not to take thy coat also.
Do you understand what Christianity is about? Do you really?
It’s unfortunate that the attacks on the World Trade Center and the Pentagon happened on September 11th, 2001. Not only did America mourn, but the world. The Council for American Islamic Relations, and other Islamic organizations, raised money and provided countless acts of service to help provide relief for those families that lost loved ones in the attacks. World leaders, including including those of Islamic faith, expressed their sincere condolences to our country. It’s been 9 years since the attacks, all of the rebuilding, all of the love and charity from others, all of the support from so many, you are willing to put on the line, for your own personal gratification and hate.
Even putting religion aside, I’m a member of the Ubuntu community. Ubuntu was chosen because of the philosophy it stands for and the meaning it conveys. It’s a philosophy everyone should stand for, and I’m proud to be a member of a community where such a high regard for human dignity and respect is held.
One of the sayings in our country is Ubuntu – the essence of being human. Ubuntu speaks particularly about the fact that you can’t exist as a human being in isolation. It speaks about our interconnectedness. You can’t be human all by yourself, and when you have this quality – Ubuntu – you are known for your generosity. We think of ourselves far too frequently as just individuals, separated from one another, whereas you are connected and what you do affects the whole world. When you do well, it spreads out; it is for the whole of humanity.
– Archbishop Desmod Tutu
This past month, as a Christian, I’ve been fasting with Islam the entire month of Ramadan, from dawn to sunset. It’s been a difficult task, but I did it primarily to raise awareness that Islam is not a religion of terror. I’m fasting, because of prejudiced people like you and the radical, extreme actions they take and the views they hold. I’ve read the Qur’an, now four times. I know what it teaches. I know the basic tenets and beliefs of Islam. I have many, many Muslim friends. I understand what Islam stands for, and it’s not the message you are trying to convey. I hope, somehow, that my actions have an effect on others, and it would mean the world to me if they somehow changed your mind.
I know you’re upset. I know you have a lot of fiery emotions that have boiled over. You want to make a stand against terrorism, and you want to be heard. Well, you have been heard. You have had the spotlight. You have the world listening. Our own government is urging you to stop, and think what ramifications your act of burning Qur’ans could have on the American public, and the world stage at large. Don’t go through with it. Don’t put lives in danger, because of your feeling towards Islam. Your act of burning Qur’ans is no different than the terrorist act of those who flew planes into the World Trade Center and Pentagon. Stand on higher ground.
If you do decide to continue with your act of terror, then I hope it rains in Gainesville, Florida, hard enough to prevent you from building your bonfire. Further, I hope that no one’s lives are taken by your decision to burn the Qur’an, both at your church, and around the world. Step down Pastor Jones, step down.
Sincerely, a loving Christian, praying for you,
Aaron Toponce
Stop Lying On Your Resume [SymKat]
Believe it or not, most interviews aren’t actually about finding out if you’re good at what you do or not. They’re mostly about finding out if you’re a good person. Weird, isn’t it?
Before you’re ever notified that a potential employer wants to talk to you they have sifted through many resumes and whittled the number of potential-employees down to 5 or 10 people.
You may meet with any of the following people during your interview:
* HR Person / Recruit
* Hiring Manager
* Director
* Project Manager
* Technical Interviewer
The Recruiter or HR Person is the first person you will talk to on your path to being hired. His or her job is to look at your resume and talk with you to discover if you’re someone who might work well for the position. Typically a phone interview to determine if what you say matches what the company is looking for. They will set up the interviews and talk to the hiring manager.
The Director or Manager of the department is the person you will most likely spend the most time interviewing with. This person is here to determine more than anything if you’re a good person. A good person for their department. How will you get along with your co-workers? Do you have major personality flaws? Are you easy to talk to? For most jobs it’s not terribly simple to determine how you are going to do before getting the job. Having the right personality for it is their number one indicator.
If you do well during this part of your interview, chances are you’re going to get hired in most companies.
However, if you’re applying for a very technical job, this might not be the case. This is where the technical interviewer comes into play.
Who exactly is this “Technical Interviewer”? It’s someone who already knows what you’re claiming to know and has demonstrated that at the company. If you put on your resume that you can program in C, Perl, Scheme, LISP, Haskell and x86 ASM you’re likely to find yourself face to face with a programmer who is already known at the company as a person who can code.
If you know these languages, it’s great. If you can explain what strncpy does, that HTML::TreeBuilder is your preferred method of parsing HTML in Perl and how the mov opcode works differently when used against control registers you’ll probably do great!
If you’re stumbling around questions about the differences between a strictly-typed language and a dynamically-typed language then you don’t really know C and Haskell do you?
The Technical Interviewer has one goal: find out if you know what you claim to know and how well you know it.
Most typically this is done by asking questions, beginning with questions that would be most commonly-known and escalating to questions whose answers are typically only known by rather bright programmers.
Let’s take a look at some real-world examples. These are questions that were prepared to ask an interviewee who had said they knew Perl:
1. What are the data types you use the most in Perl?
2. What does \Q and \E do in a regular expression?
3. What modules from CPAN do you use the most?
4. What will the following code print when run?
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub _parse {
my $string = shift;
my $res = {};
for(split /[;&] ?/, $string) {
my($n, $v) = split /=/, $_, 2;
if ( exists $res->{$n} ) {
if ( ! ref $res->{$n} ) {
$res->{$n} = [ $res->{$n}, $v ];
} else {
push @{$res->{n}}, $v;
}
} else {
$res->{$n} = $v;
}
}
return $res;
}
print Dumper _parse("foo=5&l=1;foo=10&key=r bar=world");
5. What is a recent project you did in Perl?
The first question is fairly obvious. If you’ve worked in perl at all you will at least know scalar, hash and array. You might get bonus points for glob and for explaining way blessed refs and refs don’t count as unique data types since they’re just glorified scalars.
The second question is somewhat esoteric, but it tests how much you know of regular expressions. If you simply say /$foo/ the contents of $foo will be used as the regular expression so if it contains (\s+) the regular expression is treated as a capture of 1 or more whitespaces. If you say /\Q$foo\E/ it’s treated literally to match (\s+) itself. This can gauge if someone knows regular expressions somewhat well.
Any good Perl programmer uses modules from CPAN. Personal favorites may include Data::Dumper, DBI, LWP, all the big ones. More than finding out what your favorite modules are, this question aims to ask, “Do you know CPAN at all? Do you use it?”
The 4th question aims to see if you’re mind can act as a compiler and if you know advanced data structures. Being able to correctly answer this question suggests you’re a good programmer and have been doing this for some time.
The 5th question prompts how you work on projects. Most projects run into bumps along the way, spec changes, any number of horrible events. How an individual recalls and explains these events, how they found solutions, and the overall project itself gives you a peak into their past. Stock and Bonds people say that past performance is not a guarantee for future success. I disagree.
Getting through these types of questions is extremely difficult if you don’t actually know the language. There is nothing more embarrassing than being called out on what you don’t know during an interview. Both you and the person interviewing you become uncomfortable and it’s just a horrible experience.
Your resume is your very first impression on a company. Don’t have that impression be a lie as soon they meet you.
September 08, 2010 [Saturday Morning Breakfast Cereal (updated daily)]

Whee! Kelly's blogging again!.
Also, some awesome things are afoot at reddit.
End of the second day in the off-grid house. Three things strike me about being here: quiet, rhythm, and awareness.
In the city, I am constantly annoyed by noise. Here, there's a empty, echoing feeling to the quiet. It's not lack of noise exactly -- I can hear cicadas and birds right now -- but it's still quiet. At first I wanted to fill it, but now I can feel my hearing instead expanding outward. Catching a faint engine noise, or a dog barking in the distance.
Here there's a rhythm to the day driven by the sun. Get up, connect the batteries to the solar panels. (Only necessary because the charge controller is broken.) Check and record the battery levels, make sure the panels are producing well. Think about adjusting them at solar noon. Check the cooler to see how the ice is holding out. Do weekly chores: Refilling the kerosine lanterns and replacing the rock salt used to control the humidity, which is the downside to a earth-sheltered house that stays 70 degrees cool on a 90 degree day. In the evening, watch the sun go down, disconnect the solar panels, record battery levels, and light lanterns. That's the shape of the day.
Besides being aware of distant sounds and time time of day, being here brings to the fore awareness of consumables. Until I get a fridge sorted out, I have a cooler full of ice that I have to monitor. There's propane for the stove, and kerosine for the lanterns. And of course always the state of the batteries. So far, the first battery bank seems likely to last longer than the ice. I'll know better tomorrow.
Unfortunatly I burned out the 5v power suppzly I was using to run my NSLU2 in a wiring mishap, so I have to run that on an inverter for now, and the batteries, though not low, can barely power both the inverter and my laptop. This has made staying online tricky. But I'm finding dialup psurpisingly tolerable, and it helps to generally slow down, too. Despite all the above, I got about as much real work done today as I normally would.
?tag lay offgrid
systemd for Administrators, Part II [TBFKAYIBYNYAAYB]
Here's the second installment of my ongoing series about systemd for administrators.
On most Linux systems the number of processes that are running by default is substantial. Knowing which process does what and where it belongs to becomes increasingly difficult. Some services even maintain a couple of worker processes which clutter the "ps" output with many additional processes that are often not easy to recognize. This is further complicated if daemons spawn arbitrary 3rd-party processes, as Apache does with CGI processes, or cron does with user jobs.
A slight remedy for this is often the process inheritance tree, as shown by "ps xaf". However this is usually not reliable, as processes whose parents die get reparented to PID 1, and hence all information about inheritance gets lost. If a process "double forks" it hence loses its relationships to the processes that started it. (This actually is supposed to be a feature and is relied on for the traditional Unix daemonizing logic.) Furthermore processes can freely change their names with PR_SETNAME or by patching argv[0], thus making it harder to recognize them. In fact they can play hide-and-seek with the administrator pretty nicely this way.
In systemd we place every process that is spawned in a control group named after its service. Control groups (or cgroups) at their most basic are simply groups of processes that can be arranged in a hierarchy and labelled individually. When processes spawn other processes these children are automatically made members of the parents cgroup. Leaving a cgroup is not possible for unprivileged processes. Thus, cgroups can be used as an effective way to label processes after the service they belong to and be sure that the service cannot escape from the label, regardless how often it forks or renames itself. Furthermore this can be used to safely kill a service and all processes it created, again with no chance of escaping.
In today's installment I want to introduce you to two commands you may use to relate systemd services and processes. The first one, is the well known ps command which has been updated to show cgroup information along the other process details. And this is how it looks:
$ ps xawf -eo pid,user,cgroup,args
PID USER CGROUP COMMAND
2 root - [kthreadd]
3 root - \_ [ksoftirqd/0]
[...]
4281 root - \_ [flush-8:0]
1 root name=systemd:/systemd-1 /sbin/init
455 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d
28188 root name=systemd:/systemd-1/sysinit.service \_ /sbin/udevd -d
28191 root name=systemd:/systemd-1/sysinit.service \_ /sbin/udevd -d
1096 dbus name=systemd:/systemd-1/dbus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
1131 root name=systemd:/systemd-1/auditd.service auditd
1133 root name=systemd:/systemd-1/auditd.service \_ /sbin/audispd
1135 root name=systemd:/systemd-1/auditd.service \_ /usr/sbin/sedispatch
1171 root name=systemd:/systemd-1/NetworkManager.service /usr/sbin/NetworkManager --no-daemon
4028 root name=systemd:/systemd-1/NetworkManager.service \_ /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-wlan0.pid -lf /var/lib/dhclient/dhclient-7d32a784-ede9-4cf6-9ee3-60edc0bce5ff-wlan0.lease -
1175 avahi name=systemd:/systemd-1/avahi-daemon.service avahi-daemon: running [epsilon.local]
1194 avahi name=systemd:/systemd-1/avahi-daemon.service \_ avahi-daemon: chroot helper
1193 root name=systemd:/systemd-1/rsyslog.service /sbin/rsyslogd -c 4
1195 root name=systemd:/systemd-1/cups.service cupsd -C /etc/cups/cupsd.conf
1207 root name=systemd:/systemd-1/mdmonitor.service mdadm --monitor --scan -f --pid-file=/var/run/mdadm/mdadm.pid
1210 root name=systemd:/systemd-1/irqbalance.service irqbalance
1216 root name=systemd:/systemd-1/dbus.service /usr/sbin/modem-manager
1219 root name=systemd:/systemd-1/dbus.service /usr/libexec/polkit-1/polkitd
1242 root name=systemd:/systemd-1/dbus.service /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
1249 68 name=systemd:/systemd-1/haldaemon.service hald
1250 root name=systemd:/systemd-1/haldaemon.service \_ hald-runner
1273 root name=systemd:/systemd-1/haldaemon.service \_ hald-addon-input: Listening on /dev/input/event3 /dev/input/event9 /dev/input/event1 /dev/input/event7 /dev/input/event2 /dev/input/event0 /dev/input/event8
1275 root name=systemd:/systemd-1/haldaemon.service \_ /usr/libexec/hald-addon-rfkill-killswitch
1284 root name=systemd:/systemd-1/haldaemon.service \_ /usr/libexec/hald-addon-leds
1285 root name=systemd:/systemd-1/haldaemon.service \_ /usr/libexec/hald-addon-generic-backlight
1287 68 name=systemd:/systemd-1/haldaemon.service \_ /usr/libexec/hald-addon-acpi
1317 root name=systemd:/systemd-1/abrtd.service /usr/sbin/abrtd -d -s
1332 root name=systemd:/systemd-1/getty@.service/tty2 /sbin/mingetty tty2
1339 root name=systemd:/systemd-1/getty@.service/tty3 /sbin/mingetty tty3
1342 root name=systemd:/systemd-1/getty@.service/tty5 /sbin/mingetty tty5
1343 root name=systemd:/systemd-1/getty@.service/tty4 /sbin/mingetty tty4
1344 root name=systemd:/systemd-1/crond.service crond
1346 root name=systemd:/systemd-1/getty@.service/tty6 /sbin/mingetty tty6
1362 root name=systemd:/systemd-1/sshd.service /usr/sbin/sshd
1376 root name=systemd:/systemd-1/prefdm.service /usr/sbin/gdm-binary -nodaemon
1391 root name=systemd:/systemd-1/prefdm.service \_ /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1 --force-active-vt
1394 root name=systemd:/systemd-1/prefdm.service \_ /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-f2KUOh/database -nolisten tcp vt1
1495 root name=systemd:/user/lennart/1 \_ pam: gdm-password
1521 lennart name=systemd:/user/lennart/1 \_ gnome-session
1621 lennart name=systemd:/user/lennart/1 \_ metacity
1635 lennart name=systemd:/user/lennart/1 \_ gnome-panel
1638 lennart name=systemd:/user/lennart/1 \_ nautilus
1640 lennart name=systemd:/user/lennart/1 \_ /usr/libexec/polkit-gnome-authentication-agent-1
1641 lennart name=systemd:/user/lennart/1 \_ /usr/bin/seapplet
1644 lennart name=systemd:/user/lennart/1 \_ gnome-volume-control-applet
1646 lennart name=systemd:/user/lennart/1 \_ /usr/sbin/restorecond -u
1652 lennart name=systemd:/user/lennart/1 \_ /usr/bin/devilspie
1662 lennart name=systemd:/user/lennart/1 \_ nm-applet --sm-disable
1664 lennart name=systemd:/user/lennart/1 \_ gnome-power-manager
1665 lennart name=systemd:/user/lennart/1 \_ /usr/libexec/gdu-notification-daemon
1670 lennart name=systemd:/user/lennart/1 \_ /usr/libexec/evolution/2.32/evolution-alarm-notify
1672 lennart name=systemd:/user/lennart/1 \_ /usr/bin/python /usr/share/system-config-printer/applet.py
1674 lennart name=systemd:/user/lennart/1 \_ /usr/lib64/deja-dup/deja-dup-monitor
1675 lennart name=systemd:/user/lennart/1 \_ abrt-applet
1677 lennart name=systemd:/user/lennart/1 \_ bluetooth-applet
1678 lennart name=systemd:/user/lennart/1 \_ gpk-update-icon
1408 root name=systemd:/systemd-1/console-kit-daemon.service /usr/sbin/console-kit-daemon --no-daemon
1419 gdm name=systemd:/systemd-1/prefdm.service /usr/bin/dbus-launch --exit-with-session
1453 root name=systemd:/systemd-1/dbus.service /usr/libexec/upowerd
1473 rtkit name=systemd:/systemd-1/rtkit-daemon.service /usr/libexec/rtkit-daemon
1496 root name=systemd:/systemd-1/accounts-daemon.service /usr/libexec/accounts-daemon
1499 root name=systemd:/systemd-1/systemd-logger.service /lib/systemd/systemd-logger
1511 lennart name=systemd:/systemd-1/prefdm.service /usr/bin/gnome-keyring-daemon --daemonize --login
1534 lennart name=systemd:/user/lennart/1 dbus-launch --sh-syntax --exit-with-session
1535 lennart name=systemd:/user/lennart/1 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
1603 lennart name=systemd:/user/lennart/1 /usr/libexec/gconfd-2
1612 lennart name=systemd:/user/lennart/1 /usr/libexec/gnome-settings-daemon
1615 lennart name=systemd:/user/lennart/1 /usr/libexec/gvfsd
1626 lennart name=systemd:/user/lennart/1 /usr/libexec//gvfs-fuse-daemon /home/lennart/.gvfs
1634 lennart name=systemd:/user/lennart/1 /usr/bin/pulseaudio --start --log-target=syslog
1649 lennart name=systemd:/user/lennart/1 \_ /usr/libexec/pulse/gconf-helper
1645 lennart name=systemd:/user/lennart/1 /usr/libexec/bonobo-activation-server --ac-activate --ior-output-fd=24
1668 lennart name=systemd:/user/lennart/1 /usr/libexec/im-settings-daemon
1701 lennart name=systemd:/user/lennart/1 /usr/libexec/gvfs-gdu-volume-monitor
1707 lennart name=systemd:/user/lennart/1 /usr/bin/gnote --panel-applet --oaf-activate-iid=OAFIID:GnoteApplet_Factory --oaf-ior-fd=22
1725 lennart name=systemd:/user/lennart/1 /usr/libexec/clock-applet
1727 lennart name=systemd:/user/lennart/1 /usr/libexec/wnck-applet
1729 lennart name=systemd:/user/lennart/1 /usr/libexec/notification-area-applet
1733 root name=systemd:/systemd-1/dbus.service /usr/libexec/udisks-daemon
1747 root name=systemd:/systemd-1/dbus.service \_ udisks-daemon: polling /dev/sr0
1759 lennart name=systemd:/user/lennart/1 gnome-screensaver
1780 lennart name=systemd:/user/lennart/1 /usr/libexec/gvfsd-trash --spawner :1.9 /org/gtk/gvfs/exec_spaw/0
1864 lennart name=systemd:/user/lennart/1 /usr/libexec/gvfs-afc-volume-monitor
1874 lennart name=systemd:/user/lennart/1 /usr/libexec/gconf-im-settings-daemon
1903 lennart name=systemd:/user/lennart/1 /usr/libexec/gvfsd-burn --spawner :1.9 /org/gtk/gvfs/exec_spaw/1
1909 lennart name=systemd:/user/lennart/1 gnome-terminal
1913 lennart name=systemd:/user/lennart/1 \_ gnome-pty-helper
1914 lennart name=systemd:/user/lennart/1 \_ bash
29231 lennart name=systemd:/user/lennart/1 | \_ ssh tango
2221 lennart name=systemd:/user/lennart/1 \_ bash
4193 lennart name=systemd:/user/lennart/1 | \_ ssh tango
2461 lennart name=systemd:/user/lennart/1 \_ bash
29219 lennart name=systemd:/user/lennart/1 | \_ emacs systemd-for-admins-1.txt
15113 lennart name=systemd:/user/lennart/1 \_ bash
27251 lennart name=systemd:/user/lennart/1 \_ empathy
29504 lennart name=systemd:/user/lennart/1 \_ ps xawf -eo pid,user,cgroup,args
1968 lennart name=systemd:/user/lennart/1 ssh-agent
1994 lennart name=systemd:/user/lennart/1 gpg-agent --daemon --write-env-file
18679 lennart name=systemd:/user/lennart/1 /bin/sh /usr/lib64/firefox-3.6/run-mozilla.sh /usr/lib64/firefox-3.6/firefox
18741 lennart name=systemd:/user/lennart/1 \_ /usr/lib64/firefox-3.6/firefox
28900 lennart name=systemd:/user/lennart/1 \_ /usr/lib64/nspluginwrapper/npviewer.bin --plugin /usr/lib64/mozilla/plugins/libflashplayer.so --connection /org/wrapper/NSPlugins/libflashplayer.so/18741-6
4016 root name=systemd:/systemd-1/sysinit.service /usr/sbin/bluetoothd --udev
4094 smmsp name=systemd:/systemd-1/sendmail.service sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
4096 root name=systemd:/systemd-1/sendmail.service sendmail: accepting connections
4112 ntp name=systemd:/systemd-1/ntpd.service /usr/sbin/ntpd -n -u ntp:ntp -g
27262 lennart name=systemd:/user/lennart/1 /usr/libexec/mission-control-5
27265 lennart name=systemd:/user/lennart/1 /usr/libexec/telepathy-haze
27268 lennart name=systemd:/user/lennart/1 /usr/libexec/telepathy-logger
27270 lennart name=systemd:/user/lennart/1 /usr/libexec/dconf-service
27280 lennart name=systemd:/user/lennart/1 /usr/libexec/notification-daemon
27284 lennart name=systemd:/user/lennart/1 /usr/libexec/telepathy-gabble
27285 lennart name=systemd:/user/lennart/1 /usr/libexec/telepathy-salut
27297 lennart name=systemd:/user/lennart/1 /usr/libexec/geoclue-yahoo
(Note that this output is shortened, I have removed most of the kernel threads here, since they are not relevant in the context of this blog story)
In the third column you see the cgroup systemd assigned to each process. You'll find that the udev processes are in the name=systemd:/systemd-1/sysinit.service cgroup, which is where systemd places all processes started by the sysinit.service service, which covers early boot.
My personal recommendation is to set the shell alias psc to the ps command line shown above:
alias psc='ps xawf -eo pid,user,cgroup,args'
With this service information of processes is just four keypresses away!
A different way to present the same information is the systemd-cgls tool we ship with systemd. It shows the cgroup hierarchy in a pretty tree. Its output looks like this:
$ systemd-cgls
+ 2 [kthreadd]
[...]
+ 4281 [flush-8:0]
+ user
| \ lennart
| \ 1
| + 1495 pam: gdm-password
| + 1521 gnome-session
| + 1534 dbus-launch --sh-syntax --exit-with-session
| + 1535 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
| + 1603 /usr/libexec/gconfd-2
| + 1612 /usr/libexec/gnome-settings-daemon
| + 1615 /ushr/libexec/gvfsd
| + 1621 metacity
| + 1626 /usr/libexec//gvfs-fuse-daemon /home/lennart/.gvfs
| + 1634 /usr/bin/pulseaudio --start --log-target=syslog
| + 1635 gnome-panel
| + 1638 nautilus
| + 1640 /usr/libexec/polkit-gnome-authentication-agent-1
| + 1641 /usr/bin/seapplet
| + 1644 gnome-volume-control-applet
| + 1645 /usr/libexec/bonobo-activation-server --ac-activate --ior-output-fd=24
| + 1646 /usr/sbin/restorecond -u
| + 1649 /usr/libexec/pulse/gconf-helper
| + 1652 /usr/bin/devilspie
| + 1662 nm-applet --sm-disable
| + 1664 gnome-power-manager
| + 1665 /usr/libexec/gdu-notification-daemon
| + 1668 /usr/libexec/im-settings-daemon
| + 1670 /usr/libexec/evolution/2.32/evolution-alarm-notify
| + 1672 /usr/bin/python /usr/share/system-config-printer/applet.py
| + 1674 /usr/lib64/deja-dup/deja-dup-monitor
| + 1675 abrt-applet
| + 1677 bluetooth-applet
| + 1678 gpk-update-icon
| + 1701 /usr/libexec/gvfs-gdu-volume-monitor
| + 1707 /usr/bin/gnote --panel-applet --oaf-activate-iid=OAFIID:GnoteApplet_Factory --oaf-ior-fd=22
| + 1725 /usr/libexec/clock-applet
| + 1727 /usr/libexec/wnck-applet
| + 1729 /usr/libexec/notification-area-applet
| + 1759 gnome-screensaver
| + 1780 /usr/libexec/gvfsd-trash --spawner :1.9 /org/gtk/gvfs/exec_spaw/0
| + 1864 /usr/libexec/gvfs-afc-volume-monitor
| + 1874 /usr/libexec/gconf-im-settings-daemon
| + 1882 /usr/libexec/gvfs-gphoto2-volume-monitor
| + 1903 /usr/libexec/gvfsd-burn --spawner :1.9 /org/gtk/gvfs/exec_spaw/1
| + 1909 gnome-terminal
| + 1913 gnome-pty-helper
| + 1914 bash
| + 1968 ssh-agent
| + 1994 gpg-agent --daemon --write-env-file
| + 2221 bash
| + 2461 bash
| + 4193 ssh tango
| + 15113 bash
| + 18679 /bin/sh /usr/lib64/firefox-3.6/run-mozilla.sh /usr/lib64/firefox-3.6/firefox
| + 18741 /usr/lib64/firefox-3.6/firefox
| + 27251 empathy
| + 27262 /usr/libexec/mission-control-5
| + 27265 /usr/libexec/telepathy-haze
| + 27268 /usr/libexec/telepathy-logger
| + 27270 /usr/libexec/dconf-service
| + 27280 /usr/libexec/notification-daemon
| + 27284 /usr/libexec/telepathy-gabble
| + 27285 /usr/libexec/telepathy-salut
| + 27297 /usr/libexec/geoclue-yahoo
| + 28900 /usr/lib64/nspluginwrapper/npviewer.bin --plugin /usr/lib64/mozilla/plugins/libflashplayer.so --connection /org/wrapper/NSPlugins/libflashplayer.so/18741-6
| + 29219 emacs systemd-for-admins-1.txt
| + 29231 ssh tango
| \ 29519 systemd-cgls
\ systemd-1
+ 1 /sbin/init
+ ntpd.service
| \ 4112 /usr/sbin/ntpd -n -u ntp:ntp -g
+ systemd-logger.service
| \ 1499 /lib/systemd/systemd-logger
+ accounts-daemon.service
| \ 1496 /usr/libexec/accounts-daemon
+ rtkit-daemon.service
| \ 1473 /usr/libexec/rtkit-daemon
+ console-kit-daemon.service
| \ 1408 /usr/sbin/console-kit-daemon --no-daemon
+ prefdm.service
| + 1376 /usr/sbin/gdm-binary -nodaemon
| + 1391 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1 --force-active-vt
| + 1394 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-f2KUOh/database -nolisten tcp vt1
| + 1419 /usr/bin/dbus-launch --exit-with-session
| \ 1511 /usr/bin/gnome-keyring-daemon --daemonize --login
+ getty@.service
| + tty6
| | \ 1346 /sbin/mingetty tty6
| + tty4
| | \ 1343 /sbin/mingetty tty4
| + tty5
| | \ 1342 /sbin/mingetty tty5
| + tty3
| | \ 1339 /sbin/mingetty tty3
| \ tty2
| \ 1332 /sbin/mingetty tty2
+ abrtd.service
| \ 1317 /usr/sbin/abrtd -d -s
+ crond.service
| \ 1344 crond
+ sshd.service
| \ 1362 /usr/sbin/sshd
+ sendmail.service
| + 4094 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
| \ 4096 sendmail: accepting connections
+ haldaemon.service
| + 1249 hald
| + 1250 hald-runner
| + 1273 hald-addon-input: Listening on /dev/input/event3 /dev/input/event9 /dev/input/event1 /dev/input/event7 /dev/input/event2 /dev/input/event0 /dev/input/event8
| + 1275 /usr/libexec/hald-addon-rfkill-killswitch
| + 1284 /usr/libexec/hald-addon-leds
| + 1285 /usr/libexec/hald-addon-generic-backlight
| \ 1287 /usr/libexec/hald-addon-acpi
+ irqbalance.service
| \ 1210 irqbalance
+ avahi-daemon.service
| + 1175 avahi-daemon: running [epsilon.local]
+ NetworkManager.service
| + 1171 /usr/sbin/NetworkManager --no-daemon
| \ 4028 /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-wlan0.pid -lf /var/lib/dhclient/dhclient-7d32a784-ede9-4cf6-9ee3-60edc0bce5ff-wlan0.lease -cf /var/run/nm-dhclient-wlan0.conf wlan0
+ rsyslog.service
| \ 1193 /sbin/rsyslogd -c 4
+ mdmonitor.service
| \ 1207 mdadm --monitor --scan -f --pid-file=/var/run/mdadm/mdadm.pid
+ cups.service
| \ 1195 cupsd -C /etc/cups/cupsd.conf
+ auditd.service
| + 1131 auditd
| + 1133 /sbin/audispd
| \ 1135 /usr/sbin/sedispatch
+ dbus.service
| + 1096 /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
| + 1216 /usr/sbin/modem-manager
| + 1219 /usr/libexec/polkit-1/polkitd
| + 1242 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
| + 1453 /usr/libexec/upowerd
| + 1733 /usr/libexec/udisks-daemon
| + 1747 udisks-daemon: polling /dev/sr0
| \ 29509 /usr/libexec/packagekitd
+ dev-mqueue.mount
+ dev-hugepages.mount
\ sysinit.service
+ 455 /sbin/udevd -d
+ 4016 /usr/sbin/bluetoothd --udev
+ 28188 /sbin/udevd -d
\ 28191 /sbin/udevd -d
(This too is shortened, the same way)
As you can see, this command shows the processes by their cgroup and hence service, as systemd labels the cgroups after the services. For example, you can easily see that the auditing service auditd.service spawns three individual processes, auditd, audisp and sedispatch.
If you look closely you will notice that a number of processes have been assigned to the cgroup /user/1. At this point let's simply leave it at that systemd not only maintains services in cgroups, but user session processes as well. In a later installment we'll discuss in more detail what this about.
So much for now, come back soon for the next installment!
Why You Might Want A WYSIWYG Layout Editor for Android [The Radioactive Yak]
When I read "Why You Don't Really Want A WYSIWYG Layout Editor for Android" by my friend and colleague Roman Nurik and my initial reaction was - hmm, actually you know, I really think I might. We discussed it via email briefly, but figured you guys might enjoy reading both sides of our discussion.
Roman makes a lot of really good points - particularly on the importance of designing a coherent model for user interaction. This must not be underestimated. His ideas for UX templates sound awesome, and I totally agree that there is no silver bullet to solve the difficulties around creating great UIs.
Where we disagree is on the effect that visual layout editor could have on the quality of Android app UIs. My experience tells me that a good visual editor would have a positive effect on the quality of Android UIs, while also making it easier for beginners to get started.
Fine tuning by hand is always going to be a necessity - but getting started visually can make life a lot easier.
Visual layout editors for native platforms can make assumptions that HTML editors can't
Before joining the world of Android, I spent 10 years writing winforms apps - 5 years of Delphi followed by nearly the same of C# .NET. I've spent a lot of time with the UI tools from Borland and Microsoft.
Using web / HTML design tools to evaluate the usefulness of native layout editors is a little misleading - the reason you don't use Frontpage or Word to build webpages is because the HTML they produce is a thing born of hate - there's no reason an Android layout editor can't produce beautiful XML.
It's also worth noting that the disappearance of WYSIWYG web-dev tools coincided with the rise of Web 2.0 - when HTML made way for Javascript and CSS. I haven't seen anyone who hates themselves enough to try and create a WYSIWYG Javascript layout editor.
If we're going to compare the success and potential of visual layout editors we should be looking at native tools like Microsoft's Visual Studio and Expression Blend.
Whenever I design a new UI I start with pen and paper
Like Roman, I always start by sketching. It's the easiest way to get a feel for the the user experience workflow I'm after. This works because brain-pen-paper is the shortest path to visualizing my ideas.
Moving from pen to PC creates a barrier, but it's a price worth paying to see how my design actually works in right context.
I'm not so attuned to the Matrix that looking at XML lets me see UI, so having to turn my sketches into XML requires an additional context switch: from visual design to writing code and then back to visual layout. By using a layout designer I can continue to think visually and adapt my design without having to translate back and forth from code to images.
Witness the popularity of AppInventor
If you're not familiar with the classes and UI metaphors of a development language this context switch is brutal. You're constantly interrupting yourself by searching the docs for the name (and attributes) of the class you need.
With a visual designer you can browse the available controls and glance at their properties. The barrier to getting started and creating your first UI is significantly reduced, and your ability to experiment, test, and discover are enhanced.
It's important to remember that the built in controls are just a first step. I think of them as stencils, many of which will be replaced with better, customized solutions as the app develops. At my first job they remarked that I was "not just building the car from scratch, but engineering every nut and bolt." They seemed surprised that I took this as a compliment.
What you've missed if you don't read SundayMagazine.org [Ironic Sans]
My analytics tell me that the majority of Ironic Sans readers don't follow my side project SundayMagazine.org so I thought I'd do a little roundup here of some of the articles you're missing out on if you're not a SundayMagazine.org reader:
[Reminder: SundayMagazine.org is where I reprint the most interesting articles from the New York Times Sunday Magazine from 100 years ago each weekend with some notes for historic context or commentary]
• The night Abraham Lincoln was assassinated at Ford's Theatre, there was another couple in the private box with Abe and his wife. They were young and in love, invited guests of the Lincolns. Imagine how that night affected them, and guess how their story ends. It is perhaps even more tragic and gruesome than the Lincolns' story. Read it here.
• There was an international conference in 1910 to consider revising the calendar so that it doesn't change from year to year. One of the proposals actually makes pretty good sense to me. Read it here.
• A look at 1910s state-of-the-art motion picture special effects and how they were done. Read it here.
• A fascinating description, complete with illustrations, of how to fly an airplane. Read it here.
• The details of a murder that was overshadowed by a more prominent murder. To this day, the case remains unsolved. Read it here.
• An anecdote about a case of mistaken identity at the theater that tells us something about class differences in 1910. Read it here.
• Leonid Andreyev was considered Russia's answer to Edgar Allen Poe. The Sunday Magazine serialized one of his stories, The Man Who Found The Truth over four weeks. I posted the entire story complete with illustrations as a PDF, and also linked to the free ebook edition. Read it here.
• As an aside during an otherwise slow week, I published an 1890 article about telegraph operators. They got to know each other so well that they could identify each other based on Morse code tapping style, and could even determine the gender of an operator by how he or she taps. Plus, they used abbreviations that share a lot in common with today's text-messaging. Read it here.
• As air travel became popular, people came up with all sorts of related patents. This article is about some of the more absurd patents, including illustrations. I'm a fan of the airship powered by eagles. Read it here.
• A study sought to determine whether or not you can predict a person's musicality based on the shape of the ear. Read it here.
• One man had a license to hunt in Central Park. In fact, it was his job. And he tried to get his work done without bothering tourists. Read it here.
• I had no idea that the first ascent of Mt. McKinley was filled with such drama. The first person to claim victory turned out to be a liar. And the first party to really reach the top had no climbing experience. So how could they have done it? Were they lying, too? Read it here.
• Circus clowns are serious people out of the ring, but nobody treats them with any humanity. This article tells a clown's sad tale, and I follow up by describing the tragic turn his life took after the article was written. Read it here.
• A 14-year-old kid was the president of the first amateur radio club in America. When Congress was considering regulating the airwaves, he went and testified before Congress. He had a lot of smart things to say, and I saw a lot of parallels between his 1910 radio club and the computer clubs of the 1970s. Read it here.
Those are just a handful of examples. I usually put up 5 articles each week, give or take. If you like what you see, check out the SundayMagazine.org archives, and subscribe to the RSS.
JET LAMP Promotional Artwork Set [Taking Inventory]
For the people who are working so hard to bring me to their places to show GET LAMP and talk for JET LAMP, so I’ve created a Flickr Set of GET LAMP/JET LAMP promotional artwork. Use freely as needed.
Some Quick Updates [Taking Inventory]
Here’s some scattershot updates related to GET LAMP.
The photo, by the way, is me being interviewed for another technical documentary, Viva Amiga, that will be covering the history of Commodore’s amazing computer. Obviously I know more about the Amiga than I do about the proper color socks to wear.
If you ordered a copy of GET LAMP before August 30th, you should really have it or are about to have it. Out of the many hundreds of orders, I’d say only 14 are in some sort of quantum state (the address didn’t check out, changes were made during the time period that I have to reconcile, etc.). If you do not have it or did not get it, bring it to my attention at jason@textfiles.com. I don’t mind being e-mailed about ensuring everyone who bought a copy gets a copy.
Adventurers’ Club copies are more than halfway done, as are free interviewee copies. I am trying to have all of them done before the JET LAMP tour really starts taking off. A bunch of dates are about to be added; I really think I need to learn how to sleep on planes.
Orders are continually coming in. Thanks, everyone!
September 07, 2010 [Saturday Morning Breakfast Cereal (updated daily)]

Whee!
Oh, and in case you missed it, the new video is awesome.
freedombox for a solar powered house [see shy jo]
I'm swinging on the front porch shade, with happy wifi bars lit up on my laptop. A good network makes for a happy home, isn't that how the saying goes? (Maybe not yet.)
Typically that's easy to achieve -- here it wasn't. The house is solar powered, the only connection to the outside is a phone line. So I needed a computer that would work in that environment, using minimal (12 volt) power, and getting the most out of the limited bandwidth while providing those happy wifi bars.
At DebConf we learned that the name for these little home servers we have been building for years is "FreeDomBox". All right then, here's my latest FreedomBox build.
![]() |
Since the solar house is in the sticks, the result is a server I call "stick".
Debian Installer with ZFS [Robert Millan's blog]
Long time no see… Not much hacking in the last few months. Not much ranting either (some of you I’m sure will appreciate ;-).
Anyway, I recently grew excited to learn that ZFS is coming to Debian. I decided to bite the bullet, patched the missing bits in GRUB and Parted, a few small changes in D-I and there’s now a modified Debian Installer with ZFS support for you to play with. Enjoy!
Note1: I didn’t have time or interest in warping D-I into the N:1:M model used in ZFS. Instead, this installer assumes each zpool has exactly one device and exactly one filesystem. However, you can later add more devices (“zpool attach”) or create new filesystems in the same pool (“zfs create”).
Note2: Don’t ask for i386, it was intentionally left out. ZFS is designed with modern CPUs in mind. It can work on i386 with special tuning but I don’t want to encourage users to do this unless they’re well aware of what they’re doing.
Generated by rawdog