Is it really this ugly? I expected something like this:
doc = xmldoc()
doc.start('foo', { 'id': 'blah' })
doc.start('sub')
doc.text('subtext')
doc.close('sub')
doc.close('foo')
print doc
and I thought I had it in
SimpleXMLWriter. However, I
have to jump hoops to get it to output to a string, and it doesn’t have
any pretty-print. I tried using ElementTree, but that also doesn’t
pretty print! libxml2 is horribly low-level. lxml seems to do pretty
printing, but it’s still just as ugly as the best option I’ve found so
far, xml.dom.minidom:
from xml.dom.minidom import Document
foo = doc.createElement('foo')
foo.setAttribute('id', 'blah')
doc.appendChild(foo)
sub = doc.createElement('sub')
sub.appendChild(doc.createTextNode('subtext'))
foo.appendChild(sub)
Yuck! If I’m building up a document, I almost always want to append
directly at the last point: why do I have to keep track of all these
elements by hand? I presume I’m missing some small standard helper
module, but #python didn’t know about it. Anyone?
I really hate the word “friend.” It has no meaning anymore. No one can
define what a friend is. Believe me, I’ve asked dozens of people to
define it for me. My wife is my most “true” friend, for instance but
if you trust her with picking a great wine (she doesn’t drink much) or
picking a great sushi restaurant (she hates the stuff) you’ll be very
disappointed. You’d be better off asking @garyvee about the wine even
though you’ve never met him and he probably wouldn’t be listed among
your “true” friends.
-
Scoble
Might I gently suggest friendship isn’t about wine recommendations?
Apparently applications should be prepared to lose 60 minutes of data to
work around the file system
now.
Of course the notion that application should have explicit load/save
operations is a
nonsense
already. Now we should “fix” one of the few places that never had this
(ever seen a browser where you have to save your bookmarks explicitly
when you quit?) to expose this implementation detail in a data-losing
way again.
It’s a shame that it’s basically impossible to compete with Amazon when
it comes to online book selling, because their website is so horribly
awful to use. Not fair.
Nicholas Nethercote warns us against
atol().
Sadly, he recommends using strtol() instead. This interface is almost as
bad. If atol() is impossible to get
right,
strtol() has to be classified under the obvious use is
wrong.
As a perfect example of how horrible strtol() is, let’s look at his
example code:
int i1 = strtol(s, &endptr, 0); if (*endptr != ',') goto bad;
int i2 = strtol(endptr+1, &endptr, 0); if (*endptr != ',') goto bad;
int i3 = strtol(endptr+1, &endptr, 0); if (*endptr != '\0') goto bad;
...
bad: /* error case */
Can you spot the bug? What about an input like “,2,3” ? Nicholas does
mention that this code is broken for underflow or overflow (you must
wrap every singe call like this: “errno = 0; strtol(…); if
(errno…)") but either missed this or considered it irrelevant. It’s
just too hard to get right.
Just use the *scanf() family (yes, that’s hard to use too). Be
suspicious of any code using either strtol() or atol().
I’ve just watched last week’s episode of this series, Heston
Blumenthal’s Victorian Feast. The guy is the epitome of the mad
scientist (his dessert was strawberry, elderflower and absinthe dildo
jelly with earl grey ice cream).
I had one of his inventions a while back: strawberry, olive and leather
vanilla sundae. It was pretty nice, though the rather more staid
chocolate wine popsicle was much nicer.
You should watch Tuesday’s…
If you were thinking of trying to use CentOS 5.2’s tomcat packages:
don’t. You just get a silent 400 Bad request error on the holding page
for no reason. Download it from upstream, and use that directly. It’s
very poorly documented, sadly, so to get started:
- Install the Sun JRE and set $JAVA_HOME appropriately - gcj is …
lacking
- Grab the Tomcat ‘core’ tarball and unpack it in place
- edit conf/tomcat-users.xml to add a user that has the ‘manager’ role
- start Tomcat with ./bin/startup.sh
- Go to http://yourhost:8080/ and log in to “status” with the manager
user you added
- This will list any of the apps you installed (by dumping their .war
file in webapps/)
I also set up a virtual host with Apache (for OpenGrok) like this:
<VirtualHost *.80>
ServerName grok.example.org
ProxyPreserveHost On
ProxyPass / http://example.org:8080/
ProxyPassReverse / http://example.org:8080/
</VirtualHost>
Well this makes no sense:
Me: “Hi, your letter said I needed to arrange a visit with you to check
the gas safety of my flat.”
Them: “That’s right, what’s your details?”
*gives them*
Me: “There’s no gas supply in the building, but apparently you have to
come see that in person yourselves.”
Them: “Yes, that’s true. …. OK, we’ll send you a letter with the
appointment details.”
Me: “Uh, I can’t just do any time, it needs to be arranged.”
Them: “That’s OK - if you can’t make the appointment on the letter, then
you can ring us up after you receive it and tell us.”
Me: “…”
Somewhat unpleasantly, I’m a vague acquaintance of a couple of holocaust
deniers (in the sense that I’ve been in the same place as them once or
twice). Really weird people:
- They always bring it up at parties. Seriously, what? If I were a
terrorism expert, I’d tend to keep off the subject at parties, since
people might see it as a little sensitive. Even if I was just a huge
fan of He-Man or something I’d probably only mention it if we were
talking about 1980s kids' TV. Why do they always start talking about
it?
- It’s never a slight correction. It’s always some ridiculous figure
they claim, like “zero” or “thousands”. Surely if the figures are
really dubious, they’re not going to be 6 million off? It’s
equivalent to claiming that nobody lives in Libya.
- They appear to believe in either the most expertly executed hoax of
all time, and their only apparent response to this is to moan about
it to people they don’t know. How does that make any sense?
cdfrey: the fact that
you’ve disabled JavaScript in your browser automatically qualifies you
as irrelevant for anyone designing a modern user interface - sorry.