Defeating a Ninja

I was recently asked if I had ever used Ninja on any of my machines. I had not even heard of such a thing. I found that it was available in the Lucid repository, so I installed it and configured it for my system. The two changes I made were to have it constantly poll, instead of waiting 1 second between polls; and to kill the offending tasks, instead of merely warning about them. I whipped up a little back door application that gets root. I ran it and sure enough, it was instantly killed by the Ninja. But how instantly? There is a race there to be sure. I had my w00t process run ‘killall -9 ninja’ instead of giving me a root shell. Sure enough, my hack was faster than the Ninja. It must only be a wannabe or maybe a Ninja Apprentice. Whatever it is, I defeated the Ninja in less than ten minutes. Without even breaking a sweat.

Ninja may be good in concept, but poor in execution (I’m so punny!!!) The race window that exists is wide enough to easily defeat it. What it needs to do is something along these lines:

1) Run the critical section in the kernel as a kprobe parked on the fork, exec, setuid, setgid syscalls.
2) On each watched syscall, check for escalation and pause execution while we pop out to userspace (probably via the kprobe print functions) and do a bit of testing.
3) If we pass muster, let the task go, otherwise kill it.

This way, we can pause the questionable tasks in the kernel before they get a chance to do anything malicious.

Right now, all Ninja does is make you think you are safe, while really, it does very little for you.

AVR junkie paradise

I have been pining for some shiny tiny hardware that would look good in the CW (Morse code) paddle that I am making. Arduino had been a first choice for several days. I was on the verge of buying a couple of boards when I came across PJRC’s Teensy. It really is teensy. But it incorporates a little bit of hardware that I had not seen in a proto-board before: Atmel’s 8-bit MCU with USB support. The Teensy has the Mega32U4 processor at its core, which has 32kB of flash, 2.5kB SRAM, and 1kB EEPROM, support for up to 6 USB full-speed functions, and lots more of the standard AtMega goodies. I think one of the coolest things about this board is that once you have a bootloader in place, you can flash the system over the USB connection that is already has. No need for an extra programmer and more cables. And even if you screw up your application, the bootloader is safe, because it is protected by separate lock bits.

To make a short story even shorter, I ordered two Teensy boards over the weekend and they arrived today. Fast shipping. (It helps that PJRC is less than 20 miles away.)

I am in Atmel junkie paradise.

RF Probe

A quick test of my SWR meter that I have been working on for the past few weeks told me that something was awry. It is a slight modification of that circuit, adding a couple of capacitors and replacing the two ammeters with an Atmega8 microcontroller’s ADC unit. I figured if I could stabilize the voltages sufficiently, the ADC could read them and directly calculate the SWR. So I am sure that at least half the problem is that I made some assumption in SPICE that does not account for or some newbie error like that.

I looked at the DC levels and all the connections. I double checked the schematic. I don’t have a low-frequency (<150MHz) signal source, so I just went whole hog and plugged in my radio. Pretty much no matter what I used for the load (short, open, 50 ohms, etc.) I could not get anything other than the full reflection voltage. But my silly multimeter doesn’t do 150MHz. I need an oscilloscope. Or whatever they used before oscilloscopes. An RF probe. So I built one.

After poking around on the internet, I found N5ESE’s classic RF probe, which seems to have been duplicated in many places, even as as kit from Hendricks QRP Kits. I rounded up the parts and put it together. I had the bright idea of stuffing it into a small bit of 1/4″ copper tubing to shield it. I ground down the end of a small allen wrench to be the tip of the probe. I put it all together, added a bit of epoxy and some heat-shrink tubing.

Disappointment must be my lot in life because the RF probe was not working right either. Measuring the voltage across a 50-ohm dummy load (three 3-watt 150-ohm resistors in parallel), yielded 30+ volts when my radio was set to 1/2 watt. Just for reference, 1/2 watt over 50 ohms is 5 volts. If I bumped my radio up to 5 watts, the probe said 250+ volts. My multimeter was not happy about that.

I built another one on a spare breadboard. It worked like a champ. Even with the extra capacitance of the breadboard (or maybe because of it???). And when I say it worked fine, I mean it worked fine at 150MHz. I tore the first probe apart and tested the components. If it really was putting out 250 volts, the diode and capacitor should be dead. The multimeter says they are both fine. I test the probe out of its container. It is fine. I build a new container, this time fitting the copper tubing into a pen tube. No epoxy. I test it again and this time it works. Hooray!!! The picture above is my final product.

Now I need to put it to work debugging my broken SWR meter. Maybe if I can assemble these simple circuits, I can graduate to a real project like the MMR40 transceiver.

Training My First Mutt

At work, I deal with a lot of mail. Not as much as some people, but still, it is a non-trivial amount. I don’t have to respond to all of it, nor is it all of the same importance. For example, I get emailed by various cron jobs, some of which are critical to read and others are more informational. All in all, it averages out to 60-80 emails a day, depending on how crazy things are. This adds up fast, with the last two years each landing about 14,000 emails. Since I need to keep my email, I am getting quite a stash — about 51,000 messages totalling 1.2GB. How in the world do you keep that organized? More importantly, what mail client can present all those without choking?

When I first started my current job, I chose Evolution, since that was about the best thing at the time. But somehow, it got dumber. Each new release took away features that I had come to love and depend on. When it started changing the key bindings without allowing me to have a say in the matter, I finally gave up and went with Kontact and Kmail. There are some things about KDE that I really like. One of the things is how customizable things are. I set all my key bindings so things worked for me. By this time, I had accumulated a fair amount of email and I noticed that it took a second or two to change folders. Annoying, but I just dealt with it. But on one of my upgrades, I noticed that Kmail was constantly crashing. That is beyond annoying. I moved to Thunderbird. I installed the Lightning extension to allow me to integrate my calendar with my email client like Evo and Kontact. Another year or two goes by and I notice a sufficient number of things about Thunderbird that drive me nuts. Time to move again. I look through the options. I test some out. But they all are SO SLOW.

I start looking at some of the second-tier mail clients, you know, the ones that only have a small following, like Sup, and Notmuch. I like a lot of things about both of those, but neither one is really ready to handle my abusive behavior. They both have powerful searching using the Xapian engine. They both deal very well in threads. Sup even has a UI. Notmuch doesn’t have a UI. I wrote the beginnings of one and decided that there was still way to far to go before I could really use it. I threw my hands up and adopted a Mutt.

Mutt is really a full featured MUA. It doesn’t speak SMTP, it only knows how to speak with a local process such as the venerable Unix Sendmail program. This is perfectly okay, since there are any number of ways to get around this. I chose MSMTP, which runs like sendmail and then makes an SMTP connection to your configured MTA to actually get your mail out there. So my entire mail stack looks something like this:

We have any number of IMAP servers to collect incoming mail. Fetchmail contacts the servers and delivers the mail to my local machine, filtering and tagging the messages on the way. Mutt notices the newly delivered mail and I read it. I reply or send mail and Mutt passes it off to MSMTP, which looks at the envelope from address and chooses the appropriate SMTP server to contact and pass the message off to. The entire stack suits me quite nicely. Each piece does its thing well and does not depend on the other pieces being of any particular brand. I am now free!

But let me tell you, taming your first Mutt is a non-trivial process. I still have not read the entire 12,000 line manual, but I have read much of it, some parts many times. I have spent many hours learning how Mutt does things, what I can change (almost anything) and what I can’t change (very little), customizing key bindings, writing macros, etc. I finally feel like my Mutt and I are getting along. One of the things I really LOVE about my Mutt is that I get to use a *real* editor to compose my mail. Not some clunky built-in, unconfigurable, piece of junk. I use VIM to compose my mail. With a few key settings, it even does syntax highlighting (mail headers, quoted text, etc.), spellchecking and automatic line wrapping for my typed text. It also allows me to paste verbatim text in without messing up its format. I can paste a patch in without whitespace mangling. Hooray. How many other email composers allow this? None that I know of. You don’t like VIM? You can use any editor you like.

When I first switched to Mutt, I was considering writing up a patch that would work with labels, giving me virtual folders for my labels. But after exploring the current label support that Mutt has, I found that to be uneccessary. All my incoming mail get passed through fetchmail, which does filtering and delivery. Part of my filtering process is to remove the junkmail and tag all the rest of the mail with labels according to some regular expressions. I have a little script I wrote that will read the headers of a message and spit out the ‘X-Label:’ header to add to the message. Once delivered, Mutt caches this in its header cache, making for some VERY speedy searches by label. Not only can it search by labels, but it has a very powerful search pattern language. For example, I can limit my view of my messages to ‘~(~d 6m-8m*2w ~f (“telly”|”cookie”) ~Z >1M ~s recipe)’ which means “all messages from threads containing messages from ‘telly’ or ‘cookie’ with dates from 6 to 8 months ago, plus or minus 2 weeks, that were larger than one megabyte and had recipe in the subject”. Tell me this is not a powerful search engine. All of those things it can do without actually re-reading the messages because of the header cache. Some of the modifiers do force Mutt to actually read the messages (like ~b or ~B, which end up searching the body of the message). The header cache does not save all the headers, only the ones that Mutt deems important. Personally, I think this should be configurable.

Besides the Mutt manual (available online at http://www.mutt.org/doc/manual/ or included with your Mutt installation (Debian/Ubuntu users can press F1)), there are loads of online resources to help configure and train your Mutt. I found this site to be very helpful: My First Mutt.

If you are curious what I have done, drop me a note, leave a comment or something and I will share configs or whatever with you. In the mean time, I have some mail to read.

[Edited 27 Jan 2010] Fabio wanted to see my config and my label script, so here goes… A little insight to the twisted mind of Vernon.

Traffic Shaping and Policing

Recently I had the opportunity to work with a customer that needed some help with traffic shaping and policing on their network. I had poked around in the past with this, trying to get guaranteed bandwidth for my VoIP phone, but the last time I checked, that setup no longer worked, so it was shelved until further notice. I just had to take care that when I was on the phone, I could not do any large downloads that would rob the bandwidth from my voice packets.

The customer gave me impetus to re-learn Linux Traffic Control. The main tool offered to us is called tc, meaning traffic control. You can learn all about tc at the Linux Advanced Routing and Traffic Control website. I spent several hours there trying to remember all I had forgotten. I also looked around at several other websites with howtos on the matter, but it seemed that they were all pointing back to lartc.org anyway. I poked around long enough to understand the recipes in their cookbook and then wrote up a script of my own.

I wanted to have about 90kb/s of guaranteed bandwidth for VoIP and then some other high priority bandwidth for things like ICMP packets, TCP ACK packets, and other low-latency stuff (things that mark the TOS field in the IP header.) In other words, I wanted to be able to:

  1. Make sure my VoIP traffic gets through so I don’t have choppy phone calls
  2. Perform uploads without killing my downloads (let the ACK packets through)
  3. Be able to type in an SSH session while doing a large download
  4. Not starve my VPN to work when the network is busy (no more 3-12 second latencies, please.)
  5. Have fast ping times so I can brag to all my friends

Sounds like I am hoping for a miracle, right? Well, not really. Simply dividing the traffic into several classes and then giving each one a slice of the pie will do a lot on my quest for the Well Tempered Network. I know the VoIP bandwidth, so that is easy. Then the rest, I decided to split into quarters — high priority gets at least 1/4 of the remaining bandwidth, medium priority gets the same, while bulk transfers and the rest of the stuff get anything that is left over (a little less than 1/2 the pipe).

Without this QoS script, I am unable to do a large download (or upload) without killing my VoIP call, uploads kill downloads, ssh is very non-interactive, and pings range in the 400-1100ms range. With this QoS script, I can do simultaneous large downloads and large uploads without hurting my VoIP call quality AND at the same time, ssh interactivity goes up (to the same as with no other traffic) and ping times range in the 80-200ms range. VPN traffic seems to be better too, though sometimes it suffers from latencies beyond my control. I think this means I reached all my goals. I was very happy with it and thought it might be nice to share.

Here is my script inline, or you can download it.

#!/bin/bash -e

# Copyright © Vernon Mauery 2007-2009. All Rights Reserved.
# Author: Vernon Mauery

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

# user settings
RATE_UP=1850
RATE_DOWN=4750
VOIP_RATE=90
VOIP_IP=69.59.224.0/19
VPN_IP=204.146.0.0/16
WAN_IF=ppp0

#
# End Configuration Options
#

LOCK_FILE=/var/run/qos_started

stop_shaper() {
DEV=$1

# Reset everything to a known state (cleared)
tc qdisc del dev $DEV root >& /dev/null || :
tc qdisc del dev $DEV ingress >& /dev/null || :
echo "Shaping removed on $DEV"
}

start_shaper() {
DEV=$1
RATE_DOWN=$2
RATE_UP=$3

# Remove all qdiscs from the device to reset
tc qdisc del dev $DEV root >& /dev/null || :
tc qdisc del dev $DEV ingress >& /dev/null || :

# set queue size to give latency of about 2 seconds on low-prio packets
ip link set dev $DEV qlen 30

#############################
# egress (outbound traffic) #
#############################

# create root HTB qdisc, and point unclassified traffic to 1:40
tc qdisc add dev $DEV root handle 1: htb default 40

# shape all traffic with a rate limit of $RATE_UP which should
# prevent queueing at the ISP, allowing us to control the queue length
# and priority of packets that get sent
tc class add dev $DEV parent 1: classid 1:1 htb
rate ${RATE_UP}kbit burst 6k

# VoIP class (we want guaranteed priority on this one)
tc class add dev $DEV parent 1:1 classid 1:10 htb
rate ${VOIP_RATE}kbit prio 0

# high prio class 1:20 for low-latency packets
tc class add dev $DEV parent 1:1 classid 1:20 htb
rate $[($RATE_UP-$VOIP_RATE)/4]kbit
ceil ${RATE_UP}kbit burst 6k prio 1

# medium priority class 1:30 for small packets and the like
tc class add dev $DEV parent 1:1 classid 1:30 htb
rate $[($RATE_UP-$VOIP_RATE)/4]kbit
ceil ${RATE_UP}kbit burst 6k prio 2

# bulk prio class 1:40
tc class add dev $DEV parent 1:1 classid 1:40 htb
rate $[($RATE_UP-$VOIP_RATE)/2]kbit
ceil ${RATE_UP}kbit prio 3

# SFQ is mostly to make multiple streams share the bandwidth, so in the
# case of our VoIP class, it is really only one stream and pfifo_fast
# would be a better choice. Not many packets should end up in the high
# prio class (1:20), so we just let them go in fifo order as well.
# But the two lowest prio classes (which likely have more traffic)
# will likely benefit from SFQ.
tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev $DEV parent 1:40 handle 40: sfq perturb 10

# filter VoIP stuff
tc filter add dev $DEV parent 1:0 protocol ip prio 50 u32
match ip protocol 17 0xff
match ip dst $VOIP_IP
flowid 1:10

# TOS Minimum Delay (ssh, NOT scp) in 1:20:
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32
match ip tos 0x10 0xff flowid 1:20

# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $DEV parent 1:0 protocol ip prio 20 u32
match ip protocol 1 0xff flowid 1:20

# To speed up downloads while an upload is going on, put ACK packets in
# the interactive class:

tc filter add dev $DEV parent 1: protocol ip prio 20 u32
match ip protocol 6 0xff
match u8 0x05 0x0f at 0
match u16 0x0000 0xffc0 at 2
match u8 0x10 0xff at 33
flowid 1:20

# put the vpn in 1:30 so it doesn't get hurt by downloads
tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32
match ip protocol 6 0xff
match ip dst $VPN_IP
match ip dport 443 0xffff
flowid 1:30

# all other outbound traffic that doesn't match one of these
# filters gets put in the default class, 1:40

#############################
# ingress (inbound traffic) #
#############################

# It is not possible to *shape* inbound traffic (I don't understand
# reasoning behind this), but we are able to limit it. The ingress
# qdisc does not have classes or anything fancy, but we can add
# filters to implement policing. This means we can drop inbound
# packets which will effectively limit our download speeds, which
# makes it so our packets are not getting hung up in the HUGE
# queues at the ISP.

# I also tried to make sure that we didn't drop any VoIP packets
# in the policing effort. You might think of this as profiling. :)

tc qdisc add dev $DEV handle ffff: ingress

# filter VoIP traffic and enqueue it
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32
match ip src $VOIP_IP
flowid :1

# filter *everything* to it (0.0.0.0/0), drop everything that's
# coming in too fast:
tc filter add dev $DEV parent ffff: protocol ip prio 20 u32
match ip src 0.0.0.0/0
police rate $[($RATE_DOWN-$VOIP_RATE)]kbit burst 10k drop
flowid :1

echo "Added shaping for $DEV limited at $RATE_DOWN/$RATE_UP kb/s"
}

start_qos() {
[ -e $LOCK_FILE ] && return 1
start_shaper "$WAN_IF" "$RATE_DOWN" "$RATE_UP"
touch $LOCK_FILE
}

stop_qos() {
stop_shaper "$WAN_IF"
rm -f $LOCK_FILE >& /dev/null
}

qos_status() {
echo "[qdisc]"
tc -s qdisc show dev $WAN_IF
echo "[class]"
tc -s class show dev $WAN_IF
echo "[filter]"
tc -s filter show dev $WAN_IF
}

case $1 in
start)
start_qos
;;

stop)
stop_qos
;;

restart)
stop_qos
start_qos
;;

status)
qos_status
;;

*)
echo "usage: $0 {start|stop|restart|status}"
exit 1
;;
esac

exit 0

Artisan Breads Every Day and Sourdough Pizza

Over this past year, I have been testing recipes for Peter Reinhart’s new book, artisan breads every day. The goal of this book was to find a way to get the full flavor that delayed fermentation offers, but to make the preparation time shorter. Or something. I don’t know, because with the delayed fermentation plan, you mix the dough and then bake the next day. Not a lot of involvement in the middle.

But one thing that this book did offer was something along the lines of the Artisan Bread in 5 Minutes a Day style of making a bulk pre-ferment and then using a part of it each day for up to five days and baking a fresh loaf from that. This actually makes some really good French bread. One of my favorite recipes was the “same day french bread”, which uses a pre-ferment to pull in extra flavor. It is called same-day because you don’t count making the pre-ferment for some reason (maybe because you can also use it for the next 4 days). But that was some of the best French bread I have ever made. And in the process of testing these recipes, I learned the importance of the “stretch and fold” technique. This is the best way to strengthen the gluten in a very wet dough. Even a dough that has 70% or more hydration can become smooth and workable with the stretch and fold. After doing this, I found that my freestanding loaves gained 50% in height, rather than being so flat.

Part of the reason I though I would write this was that I chose to make some sourdough pizza dough from this book for our Friday night pizza night yesterday. Mmmmm. I do love good sourdough. The dough turned out to be very tasty, though I think next time I will leave out the honey since I think it made the crust brown too quickly. Our old oven died about three weeks ago and our new oven can bake at up to 550°F, which is about where you should be cooking pizza, but not having experience with those extra 50 degrees is making pizza baking interesting. As far as the rest of the family goes, they say they prefer the original Pizza Napoletana recipe from Peter’s Bread Baker’s Apprentice book. That is a darn good pizza dough recipe, so it is hard to beat it. But I have to mix it up every now and then or we wouldn’t ever know if something better came along.

I will likely write more about Artisan Breads Every Day another time, as I find time to work through the recipes. Can anyone say Chocolate Croissants?

Praise for Heirloom Crops

In 2008 and 2009, we purchased seeds from Seed Savers and have been saving them. Last year, we saved some pea seeds (Green Arrow), some tomato seeds (Bloody Butcher) and some sweet pepper seeds (Tequila Sunrise). This year, we expanded the varieties and also saved some green bean seeds (Empress), and more tomato seeds (Siberian and Stupice). The King of the North sweet pepper seeds were not quite fully developed, but there are still some left in the package from this year’s planting. The mini sunflower seeds were some volunteers in our garden, likely planted by our neighbor’s trained squirrels. The sunflowers may or may not germinate next year, but I think the rest of the seeds will.

This year’s growing season in Portland was longer than last year and much more productive. We ended up at the end of the season with a tub of tomatoes and peppers. We had several meals with fresh picked green beans. Since it was good for everything else, the peas were not happy. They died out a little too fast in the warm weather. I think it was the week of 100+°F that did them in. But we saved plenty of seed for next year. I think the King of the North peppers would have done better, but they were hit hard by a slug infestation early on. The slugs ate half the leaves on the plants, forcing them to spend energy on growing new leaves instead of peppers. But we did get some small ones by the end of the season. I think this year may have me giving up on leaf crops for a while. After two years of failure on the lettuce front, we tried swiss chard this year. It grew, but never got very big, so we didn’t pick any. By the time we did pick it, it was very tough and a little bitter. Next year, I think we will focus more on the beans, peas, tomatoes and peppers. Oh. And the basil. That failed miserably too. I finally gave in and picked up some starts from the farmer’s market.

Next year, I think we will start the tomatoes and peppers outside in a makeshift greenhouse so they can get more sunlight and yet not freeze at night. I learned that peppers need warm nights to grow and tomatoes need some chilly nights in order to not get too ‘leggy’ like ours did this year, growing in our house. We will see. I had quite a green thumb as a child, but I also had parents that knew their way around a garden to make sure I didn’t kill things. On my own, the garden is much trickier. 🙂

Oooh, shiny new toys

After much debate, research and saving of greenbacks, I finally went out and bought my first ham radio. I chose the Icom 92AD. It didn’t take me much to see that the Icom handheld radios were a lot higher quality than the Yaesu radios. They also cost a bit more. The one I chose was one of the more expensive ones (surprise, surprise), but it should do all the things I want it to do. It is a dual-band radio that also has a digital voice/D-STAR capability built in. I am not sure how much I will use the digital voice part, but D-STAR also allows for data to be transmitted along with the digital voice packets. I think that KK7DS‘s D-RATS stuff is really a great idea. Plus, Dan’s a bit of a Linux geek like myself, so I feel good supporting him.

The radio as a handheld doesn’t really have a long range, but it will be great for the ARES and CERT activities that I would like to participate in. There is also a local LDS net that I can participate in as well. So it is a great start to get my radio feet wet.

I have determined that one of the reasons that amateur radio is alluring to me is because it is an excuse for me to get back to my electronics roots. I finally have a reason to get a mutli-meter and a soldering iron. My first project is going to be an SWR meter to make sure that my antenna and transmission line are all correctly tuned. If I plan on making my own antennas, and I do, then this is a very important piece of equipment. Later I plan on making a 6/2/440 collinear coaxial antenna, which will require some fancy assembly, and a center-fed zepp for HF, which should be much easier. I am thoroughly enjoying this new hobby. I just hope it doesn’t wring my wallet too much.

How vain are you?

Like I mentioned in my last ham post, I was not entirely happy with my call sign. I applied for a ‘vanity’ call sign, NV2M, and my request was granted six days ago. I think it is really nice that the FCC allows you to choose your call sign. They did periodically through amateur radio history, but now it is even easier than ever. You log into the FCC website, list your top 25 choices in order of preference, pay them thirteen dollars and wait for 21 days. There are several websites that maintain lists of call signs that are available so you can find one that suits you. Thirteen dollars is not very vain, especially for a ten-year license.

Now take a look at vanity license plates. Fifty-five dollars for a vanity license plate is vain. And you have to pay that each time you renew your registration. But here in Oregon, they have special amateur radio plates you can get for your car that display your call sign. The best part about this is that they are only five dollars. This is the kind of vanity that I can afford.

So it all comes down to the dollar. How vain are you? And Me? About five bucks. I think I am too practical and too much of a tightwad to be really vain.

Ham it up

I have been meaning to get my ham operators license for some time now. I never really knew what was involved in the process so I always let it slip out of my mind after a very short time. I knew that there was a “test” of some sort involved. And that you had to pay to take the test. Not wanting to pay for a test I might fail and not knowing where to turn to pass, I gave up. Until about 3 weeks ago. Then I heard about a ham class that was being offered locally. I actually heard about it through two channels: my church has been pushing to get people to have ham licenses for emergency preparedness, as has Beaverton CERT (Community Emergency Response Team). So when I heard about it this time, I signed up. The flier for the class had a link to Ham Elmer where you could download a PDF that told you the basics about getting a license.

After reading this booklet and absorbing the info like a sponge, I felt pretty confident. I started to read about ham stuff in my spare time. I learned about HF/VHF/UHF propagation and about RF safety. I found some practice tests online and started to take them. I found that I could ace the Technician test nearly every time. So I think to myself, this was pretty easy, maybe I should shoot for General. See, by now, I realized that there are three levels of licenses, each with increased privileges. I already had my sights set on Amateur Extra, but was not sure how long it would take me to get there. A few years, perhaps.

The first time I took the online General level test, I only failed by one question. It was a 35 question test, like the Technician test, only the questions were a little harder. That really got my hopes up. So I studied up some more on the questions I missed so I could understand what they were talking about. At this time, I recognized a lot of the words and phrases, but was still dredging the depths of my brain to pull of any shred of knowledge about radios and electronics I learned in college. As I read about radio wave propagation, FCC part 97, and the ham culture in general, I began to get slightly better scores. I think on the fourth try, I finally started passing the General tests regularly. I still had a week until the ham course. I was notified that they would be testing all levels and that if you pass one level, they automatically offer you the next level. Hmmmm….

I took aim. I jumped. I landed flat on my face with a score of 50% on my first Amateur Extra practice exam. Eeek. There were so many terms and principles that I knew I should remember, but didn’t that I almost gave up there. One week. I started reading and taking practice exams in every free minute of my time. I stayed up late and woke up early with ham radio on my brain. Circuits, and complex impedance, and Q, oh my! I dove in whole hog and pulled up all the debris out of the depths of my brain and put the wreckage back together. I was getting closer. I could feel it. Things were starting to make a little more sense. I was getting a better idea how the circuits fit together and how transmission lines behave at various lengths. What patterns antennas radiate radio waves in. I think I may have done a little happy dance when I passed the practice exam for the first time. After that, it was all downhill. I started passing regularly, albeit with somewhat low scores. The QRZ website kept telling me, “You passed! It was a good score, but not great. Keep studying.” So I go back to review what I missed and try to make sense of all the questions. Finally, I start to get more, “You passed! Great score. You are ready!” One day until the exam. I am so stoked that I have a hard time sleeping.

I skipped the class because it was very long (3 hours Friday night and then 4 hours Saturday morning.) I showed up in time for the exam. I made sure that I was at the start of the line because there were likely more than 80 folks there to get tested. The VEs (Volunteer Examiners) said that this was the largest group to be tested that they had ever seen. I would believe it. It took them a while to get the line moving, but after all my forms were checked in triplicate, I was handed my test. They announced that they would allow programmable calculators as long as there were no programs on them. Understandable, but my HP-48G from college had all the stuff on it that I spent years putting on, so there was no way I was going to delete that stuff. Good thing I had a backup plan. I brought the simple simon calculator that Lauren uses to calculate fees for piano lessons. It only does basic arithmetic stuff. Add, subtract, divide, multiply, square root, and percent. Woohoo. Well, it was better than nothing. I put my HP under my chair and put simon on my table. I opened the Technician test and flew through it. I raised my hand and they took my test away to be graded.

After what seemed like an eternity (which was really more like 15 minutes), they called out my number and they came to me with the results. It just so happened that the runner who brought my results already knew of my grand aspirations to take all three tests, so he merely told me I passed and said he would be back with the next test. By this time, there was already another guy at my table taking his test. Sometime before I finished my General test, he finished his Technician test and began the long wait. Another guy also joined us with his Technician test. I finished up and sent my test in to be graded and started to look around. I could see that most of the people who were taking the test passed since the CSCEs (Certificate of Successful Completion of Examination) were getting passed out like candy. Some people were requesting to take the General exam while others were happy to pass Technician and take off. I finally figured out why it took so long to grade the exams. There were six graders, lined up in threes across from each other along a table. The graders on the end each pull from the stack at the end of the table and start grading. To grade the exam, they merely select the correct template and overlay it on the exam, looking to make sure that each hole in the template has a mark on the exam below. Any holes without a mark below get marked and counted as wrong. Then the grader passes it on to the next grader. Like I said before, everything is done in triplicate. This is good because occasionally, somebody makes a mistake and the odds are fairly low that all three will make the same mistake.

My general test came back with a passing score and the runner congratulated me and brought me the Amateur Extra exam. By this time, my heart was beating pretty hard, so I tried to calm down so I could take the test on an even keel. Hands stop shaking. There were several of the questions that I did not know for sure, but by the end of the test, I was pretty sure that I had answered enough of them correct to pass. I only had to get 37 out of the 50 questions correct to pass, and I was confident that I had that. After all, when in college, a 75% was a failing score in my book. Getting a C on a test was devastating. Getting a B was still not good, but sometimes that was as good as I could do. But an A was the only acceptable grade. I raised my hand and sent the test off with the runner. I turned and tried to determine how many tests were on top of mine in the pile to be graded. This might be a while. By this time, the fellow next to me was nearly done with his General exam and the other guy passed his Technician and decided to try the General.

This time, I really did have to wait an eternity to get my test result. But before I did, I had some idea that they were starting my test as I heard, “Who wants to grade an element four?” Element four is the official name for the Amateur Extra exam. Not too long after that, the first grader got my attention by calling out my number and giving me a two thumbs up sign to let me know that I had passed. Woo hoo! I was shocked, relieved, and satisfied. I knew that the two weeks of studying had paid off. The head VE came over and congratulated me personally for taking such a big step. Lots of people congratulated me. Yes, it was a big deal. Element four was no joke. It was a difficult test, but I don’t think it was nearly as difficult for me at age 31 as it would be for me at age 62. Many of the people in the room were older than I am. Some had a very hard time on the Technician test. I can imagine that it only gets harder with age. Especially taking all three. They gave me my CSCE and I went home.

I went home for the long wait. Is my license there yet? Daily, nay, hourly checking on the FCC’s ULS website did not seem to move my license along any faster. The VEs said it would likely be until the following Friday (six whole days!!!) before it would show up on the ULS. And true to their word, my Amateur Extra license was granted on 5 Jun 2009. My originally issued callsign is AE7AV, which is a ‘coveted’ 2×2 callsign, but not exactly what I had in mind. Alpha Echo 7 Alpha Victor or di-dah dit dah-dah-di-di-dit di-dah di-di-di-dah just didn’t fit me quite right. I found that my great-grandpa George Comstock’s callsign, W7CJ, was already taken by my first-cousin-once-removed Terry Comstock of Hillsboro, OR. Hmmm. So I can’t take that one. After much perusing on the VanityHQ website, I found a few that I liked. So shortly after getting my license, I applied for a vanity callsign, which I still have a 3-week wait before I get it. The callsign I am hoping for is NV2M or November Victor Two Mike, or dah-dit di-di-di-dah di-di-dah-dah-dah dah-dah. Now that is something I can live with. I still like NR3V, which is like Vern spelled backwards, but due to issuing regulations, is not available until next year.

Now it is time to get on the air. But I have no radio. Most beginning radios are a couple hundred bucks. Mid-range radios are just under a thousand and high-end are several to many thousands. Eek. Where will I come up with money for this new hobby? Why can’t I have a hobby like Lauren, which makes money?