Mnemonic

I don’t think there’s a mnemonic aid for “mnemonic,” but I’m studying for a law exam, and it’s insanely conducive to various visual associations:

  • Engel v. Vitale, the 1962 case that ruled that mandatory school prayer was an Establishment Clause violation. (You think?) Remember angels and that some thought it was vital to pray.
  • A trio of conscientious objector laws:
    • Welsh v. US: you needn’t have organized religious beliefs to object, if your beliefs are held with the strength of organized religion.
    • Gillette v. US: you can’t be a CO if you only object to one war; it has to be war in general
    • Clay v. US: it’s based on individual beliefs, not your whole sect’s beliefs. In particular, you must remember 3 prongs:
      • Oppose war in any form
      • Religious, not political, beliefs
      • There must be evidence that your beliefs are sincere
    • Remember Welsh grape jelly (and eating it individually, not in church), Gillette stadium (and protesters there opposing the Iraq war but supporting the war in Afghanistan), and, well, Clay is easier if you know that it’s Cassius Clay (Muhammad Ali). The three items are pretty easy to remember on their own.
  • There was a Pinette case where the KKK wanted to put up a cross. It was for pretty intimidating purposes, but the court “had to live with its own precedent” that it was protected free speech. Imagine that the cross was made of pine.
  • VA v. Black: you can’t ban cross-burning, but if it’s used as intimidation, it’s illegal anyway. Remember that cross-burning was usually done as intimidation against black people.
  • Loving v. VA: essentially struck down anti-miscegenation laws. After all, marriage is about loving, not skin color.
  • Baehr v. Anderson and Brause v. Board of Vital Stats were two cases with a lot in common:
    • They both had the state’s anti-gay-marriage laws ruled violations of the state constitution
    • They both resulted in the state constitution changing to define marriage differently, banning gay marriage and doing it in a way that can’t be unconstitutional (since it’s in the constitution)
    • They both occurred in “Western extremity” states (Alaska and Hawaii)
    • They both involved people with strange B-names

Of course, we’ll see in an hour if this helps, or if I just sit there thinking that I could really go for some Welsh grape jelly having no idea why I’m thinking about it.

When Life Gives You Lemons

There’s a pile of snow outside.

In other news, Georgia is still having a drought.

Business idea of the day? Charge New Englanders for snow disposal. For about the cost of plowing, I’ll take the snow for you. You don’t have to worry about snowbanks.

I’ll then fill trains with it and ship it to Georgia and others in need of water, who will buy it from me.

MiniAjax — An Awesome Site

Web developers, check it out. My one complaint is that this is an awkward assortment of things ranging from little JavaScript snippets to free (GPL) apps to proprietary, expensive applications. But there are some very cool ones in there. (Psst! Heatmap is running on this site! It’s going to take a while to build up enough data worth sharing, but I’ll let you know when the time comes.) Some of the other ones are going to make their way into some projects I’m working on.

A Plea to Phone Makers

Make ringers “polite.” If a phone ‘rings out’ (e.g., rings non-stop until voicemail kicks in), switch to silent mode automatically.

Yes, this has flaws, like missing multiple calls because you missed one call.

But sit here with my as my suitemate’s phone rings time and time again, with a really irritating ringtone while he’s gone, and hold back the tears long enough to tell me that this feature isn’t necessary.

If nothing else, come up with a universal, unobtrusive means of switching a phone to silent. My Treo’s got a slide on the top, and I think all phones should have something like that. Every time I try to use someone else’s phone I end up getting into strange menus or, more often than seems statistically probable, ending up inside a web browser. So I’m pretty averse to opening up people’s phones and changing settings. I could cope with sliding a hard switch on the outside, though.

Seriously, please implement this. I’m begging.

Malus Fide

I’ve always like the idea of rewarding douchebaggery with more douchebaggery. And one bit of douchebaggery that really bugs me is that, running a webserver, it’s always getting requests for pages that have never existed. What’s going on is that people are probing for common vulnerabilities. I don’t have a /phpmyadmin, but I get multiple requests a day for it. (I do have PHPMyAdmin, but it’s up to date, secure, and at an obscure URL.) Same goes for awstats.

What I’ve always wanted to do is respond to these requests with complete garbage. Unending garbage. My long-time dream was to link a page to /dev/random, a “file” in Linux that’s just, well, random. (It’s actually a device, a software random number generator.) The problem is that linking it is full of problems, and, when you finally get it working, you’ll realize that it’s smart enough to view it as a device and not a file.

So I took the lazy route and just created a 500MB file. You use dd to copy data from a disk, with /dev/urandom as the input and a file with a .html extension as output. I had it read 500 “blocks” of 1MB. Granted, this is a total waste of disk space, but right now I have some spare space.

Of course, I was left with a few resources I was concerned about: namely, RAM, CPU time, and network activity. I use thttpd for this idiotic venture, which lets me throttle network activity. I’ve got it at 16 KB/sec right now. (Which is an effective 128 kbps.) This ensures that if it gets hit a lot it won’t put me over my (1,000 GB!) bandwidth allocation.

Apparently, though, this throttling solves the problem: at first glance, it looks like it’s smart enough to just read 16KB chunks of the file and send them out, as opposed to trying to read it into memory, which would kill me on CPU time and RAM. So the net result is relatively minimal resource utilization.

Currently, it’s just sitting there at an obscure URL. But my eventual plan is to setup a /awstats and a /phpmyadmin and a /admin and a /drupal and have them all throw a redirect to this file.

The other bonus is that, at 16KB/sec, if a human gets there, they can just hit “stop” in their browser long before a crash is imminent. But, if it works as intended, infected systems looking to spread their worms/viruses won’t be smart enough to think, “This is complete gibberish and I’ve been downloading it for 30 minutes now” and will derail their attempts at propagating.

It’s not in motion yet, though… But I’ll keep you posted.

Filesystems

On my continuing obsession with squeezing every bit of performance out of this system… They say that Linux filesystems don’t get fragmented. I never understood this. It’s apparently smarter about where files are placed. But still, frag-proof? If it was that easy, other filesystems would have figured it out long ago too. I figured that the explanation was just over my head. In reality, the “explanation” is that it’s a myth.

oxygen bin # fragck.pl /home 2.19458018658374% non contiguous files, 1.03385162150155 average fragments. oxygen bin # fragck.pl /var/log 56.3218390804598% non contiguous files, 28.9425287356322 average fragments. oxygen bin # fragck.pl /var/www/ 1.45061443222766% non contiguous files, 1.05527580153377 average fragments. oxygen bin # fragck.pl /etc 2.18023255813953% non contiguous files, 1.05450581395349 average fragments. oxygen bin # fragck.pl /var/lib/mysql/ 16.5424739195231% non contiguous files, 2.93740685543964 average fragments.

The results kind of make sense: /var/log is full of files where you’re constantly appending a line or two to various files, so it only stands to reason that, if the filesystem isn’t very careful, fragmentation would build up. The other one is /var/lib/mysql, where MySQL stores its data. It’s the same deal as /var/log, really, in that it’s continually adding files.

/var/log/messages, the system log file, is in 75 pieces. Its backup, messages.1.gz,was in 68.

Realistically the performance hit is negligible. It’s not like a core system file is in hundreds of pieces. (Like, say, the paging file!) /bin has very low fragmentation. Log files can be fragmented an not impact anything. (Except my OCD.) Although I am concerned about MySQL’s data stores building up fragmentation. In theory I can bring the database down and shuffle the files around, but it’s probably best left alone right now.

Fortunately, there’s hope… By moving a file to another partition, you cause it to move physical locations. Something like mv messages /tmp/ramdisk && mv /tmp/ramdisk/messages . will cause the file to be rewritten. (Granted, this particular command was an awful idea: syslog-ng keeps /var/log/messages open, and doesn’t like it when the file randomly disappears. The fact that it was only gone for a split-second doesn’t change the fact that the files location has changed.) Although don’t get too excited about this: for some reason, fragmentation sometimes ends up worse! access_log was in 60 pieces. Now it’s in 76.

I’ve also heard it said that some fragmentation isn’t necessarily a bad thing: a few files close together on the disk with light fragmentation is better than frag-free files on opposite ends of the disk. But that doesn’t satisfy my OCD. I guess the moral of the story is to not muck around too much with things. Or, “if it ain’t broke, don’t fix it!”

Speeding up MySQL with tmpfs?

I’m still getting a decent percent of files being created on disk in queries, even though my tmp_table_size is an astonishing 128MB. (The whole blogs database uses about 6MB of disk.)

The problem is described here: TEXT and BLOB queries apparently don’t like being in memory. This page explains it further.

The problem is that… These are blogs. Aside from some trivial cross-table type stuff, every single query uses TEXT queries. Interestingly, the solution everyone proposes is using a ramdisk. I was somewhat concerned about using a ramdisk, though: for one, the procedure for creating it looked somewhat arcane, and one place talking about it mentioned that his 16MB of ramdisk was almost as big as his 20MB hard drive. I think of my old 20GB hard drive as ridiculously old. The other reason, though, is that ramdisk is scary: it’s a finite size. I’d love something like a 1GB ramdisk for /tmp, but I don’t even have a gig of RAM, much less a gig to allocate for file storage.

Enter tmpfs. In a nutshell, it’s like tmpfs, but the size can be dynamic, and it can swap, which means I don’t have to worry about my 16MB tmpfs partition trying to store 17MB of data and blowing up. Creation was eerily easy:

# Make a directory to use as a mountpoint, and give it a misleading name
mkdir /tmp/ramdisk

# Mount it as type tmpfs
mount -t tmpfs tmpfs /tmp/ramdisk -o size=16M,mode=1777

In my.cnf, it’s as easy as changing tmpdir=/tmp/ to tmpdir=/tmp/ramdisk/.

And now, we let it run for a while and see how performance feels.

Geekery

One of my weird OCD concerns is that some of the scripts I host place a heavy load on the server. I want to make sure that, in busy times, they don’t weigh down things further. Here’s a neat little bit of PHP I wrote to simply have PHP abort the page load if the 1-minute load average is over 2.00:

// Check the uptime first
$fh = fopen('/proc/loadavg', 'r');
$uptime = fread($fh, '4');
fclose($fh);

if ($uptime>2) {
die("Sorry, we're too busy.");
}

Rather than die(), you might throw a redirect to a cache or something else. And I should point out that, of course, running this code does take some CPU time… And that this script doesn’t always make sense: you’re basically forcing a failure before the server itself forces the failure. The time it makes sense is in the way I’m using it — when some unimportant, tangential project requires inordinate resources and you want to make sure it doesn’t slow the server down too excessively, at the expense of the more important projects (e.g., the blogs).

ISO: The Next Frontier?

In photography, there are a few key variables in determining exposure. The first is the aperture of the lens: basically, how much light is let in. Really serious (or rich) photographers carry around very “fast” lenses–they’re enormous and let in a ton of light. Notice the huge lenses that you see on the sidelines as sporting events, for example. (Err, not the length, but the width–these things are huge in both dimensions.) Of course, these lenses (we call them “fast” lenses, or lenses with wide apertures) are very heavy, and insanely expensive: for a really good one, you’d pay at least $1,000, and that’s pocket change compared to some lenses.

Another control is ISO sensitivity. Back in the days of film, some film was more sensitive to light than others. For example, ISO100 produces great pictures, but requires a lot of light. It’s superb for outdoor pictures on a sunny day. On the other hand, if you’re getting shots indoors, you might be at something like ISO1600. The problem is that, as you increase the sensitivity, you also increase the noise. ISO1600 will get decent shots indoors, but they’ll be grainy. (This is especially bad if you’re like me and tend to try to boost details in the shadows in Photoshop.)

The two come together to control the third important variable, shutter speed. In some cases, it doesn’t matter a ton. If it’s bright and sunny, and I’m taking a picture of a building, I really couldn’t care whether it’s 1/100th of a second or 1/4,000th of a second. And, if I’m using a tripod, it’s not uncommon to have shutter speeds lasting several seconds. But the problem is that, if the shutter speed is too low, you get a lot of blur. There are two reasons–the first is that people rarely hold still. I use 1/60 as a general rule of thumb: below that and you risk some blur if people are moving a lot. This is a really rough guess: I’ve gotten great portraits at 1/8, and sometimes 1/125 isn’t fast enough.

The bigger consideration, though, is camera shake, especially with longer zoom lenses. The rule of thumb there is 1/length. For example, shooting with a telephoto 200mm lens, it’s recommended that I shoot a 1/200 of a second or faster.

Putting it all into practice… Bill Clinton was speaking tonight at an event we went to. I have a 55-200mm telephoto lens, and tended to stay right around 200mm. I stayed at ISO1600; I can go to ISO3200 but it’s very grainy so I don’t use it. Unfortunately, though, my lens can’t go wider than f/5.6 at that length, which meant that the fastest I could get shots was around 1/60th of a second. At 200mm, this really was inadequate: most of the shots came out okay because I have a steady hand, but they’re not all that sharp. Example:

title=”IMG_1795 by n1zyy, on Flickr”>IMG_1795

It’s okay, but now compare it to this picture:

title=”Autumn Colors by n1zyy, on Flickr”>Autumn Colors

Granted, the subject isn’t that interesting, but every time I see that shot I took, I think, “Wow, that’s sharp!” Not so for the Clinton photo. If you view it in larger detail (click on it), its subtle blur becomes increasingly obvious.

There was a professional photographer about ten feet away from me. She was shooting a 70-200mm lens, which is a similar length to mine. But hers is an f/2.8 lens, which lets in twice as much light as mine does. So while I was getting 1/60 shutter speeds, she could have been getting 1/120. (Hers had Image Stabilization, too, but that’s a story for another day.)

The thing is, taking telephoto portraits indoors isn’t all that rare of a thing to do. To get good shots, you need to get that shutter speed up. There are two ways to do it, as you should now know: raise ISO or get a better lens. The problem is that getting a better lens will set me back $5,000 or so. And it’s an insanely heavy lens as well.

The other option is one that, until recently, wasn’t feasible: raise ISO some more. ISO1600 is good. You can do ISO3200, but it’s decent on only a few cameras. But I really have to give Nikon credit with their D3. It’ll go to ISO25600. Check out some samples. I’ve seen some higher-res images at ISO6400, and it’s just about perfect! Its ISO6400 rivals my ISO1600. The thing is, that’s a huge increase to be able to shoot at 6400 and have a perfectly usable image. It would have helped a lot with getting better shots.

I truly hope this is the direction camera makers go in now, and that Canon and Nikon get into an “ISO war” trying to outdo each other.