Tuesday, January 31, 2006

 

The New Regime

A few months ago, a new Head of Something-or-Other was hired. He's a Big Gun, hired away from one of our competitors at great expense. The word was that he was going to really shake up our department, to make us more productive and competitive. We've been waiting to find out just how hard the shaking would be.

Today, we heard the first new policies:

Yep, this guy is a real heavy hitter. I feel more productive and competitive already.

But I guess I should start saving up nickels to put in the Swear Jar.


Saturday, January 28, 2006

 

Puzzling Over Camping

No, I'm not planning anything related to the Great Outdoors. Camping is a microframework, written in Ruby, which provides a model-view-controller web page implementation mechanism similar to Rails. It is, however, much smaller and simpler. I decided I would study it, as a means of learning more about Ruby (and maybe about Rails).

Camping was developed by a programmer known as "Why the Lucky Stiff." He's completely insane, but in a good way. He gave himself a goal of fitting the whole framework into 4K and making it viewable on a single page. To accomplish this, he's eliminated unnecessary whitespace, punctuation, long variable names, and comments. See camping.rb to view the result. (Yes, that really is the actual Camping code, and it really does work.)

Obviously, it's very difficult for a human to read this, especially for a Ruby newbie like myself. So I spent some time reformatting the code and doing a little refactoring for the sake of readability. Here's what I ended up with:

# De-obfuscated rendition of Why the Lucky Stiff's Camping 1.2

require 'rubygems'
require 'active_record'
require 'markaby'
require 'metaid'
require 'ostruct'
require 'tempfile'

module Camping
  C = self

  S = File.read(__FILE__).gsub(/_{2}FILE_{2}/, __FILE__.dump)

  module Helpers
    def R c, *args
      p = /\(.+?\)/
      u = c.urls.detect{|x| x.scan(p).size == args.size}.dup
      args.inject(u){|str, a| str.sub(p,(a.method(a.class.primary_key)[] rescue a).to_s)}
    end

    def / p
      p[/^\//] ? @root+p : p
    end
    
    def errors_for(o)
      ul.errors{o.errors.each_full{|er|li er}} unless o.errors.empty?
    end
  end
  
  module Controllers
    module Base
      include Helpers
      attr_accessor :input, :cookies, :headers, :body, :status, :root

      def method_missing(m, *args, &blk)
        str = m == :render ? markaview(*args, &blk) : eval("markaby.#{m}(*args,&blk)")
        str = markaview(:layout){str} rescue nil
        r(200, str.to_s)
      end

      def r(s, b, h={})
        @status = s
        @headers.merge!(h)
        @body = b
      end

      def redirect(c, *args)
        c = R(c, *args) if c.respond_to? :urls
        r(302, '', 'Location' => self/c)
      end

      def service(r, e, m, a)
        @status, @headers, @root = 200, {}, e['SCRIPT_NAME']
        cook = C.kp(e['HTTP_COOKIE'])
        qs = C.qs_parse(e['QUERY_STRING'])
        if "POST" == m
          inp = r.read(e['CONTENT_LENGTH'].to_i)
          if %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)|n.match(e['CONTENT_TYPE'])
            b = "--#$1"
            inp.split(/(?:\r?\n|\A)#{Regexp::quote(b)}(?:--)?\r\n/m).each{|pt|
              h, v = pt.split("\r\n\r\n", 2)
              fh = {}
              [:name, :filename].each{|x| fh[x]=$1 if h=~/^Content-Disposition: form-data.*(?:\s#{x}="([^"]+)")/m}
              fn = fh[:name]
              if fh[:filename]
                fh[:type] = $1 if h =~ /^Content-Type: (.+?)(\r\n|\Z)/m
                fh[:tempfile] = Tempfile.new("#{C}").instance_eval{binmode; write v; rewind; self}
              else
                fh = v
              end
              qs[fn] = fh if fn
            }
          else
            qs.merge!(C.qs_parse(inp))
          end
        end
        @cookies, @input = [cook, qs].map{|_| OpenStruct.new(_)}
        @body = method(m.downcase).call(*a)
        @headers["Set-Cookie"] = @cookies.marshal_dump.map{|k,v| "#{k}=#{C.escape(v)}; path=/" if v != cook[k]}.compact
        self
      end

      def to_s
        "Status: #{@status}\n#{{'Content-Type'=>'text/html'}.merge(@headers).map{|k,v| v.to_a.map{|v2| "#{k}: #{v2}"}}.flatten.join("\n")}\n\n#{@body}"
      end

      def markaby
        Mab.new(instance_variables.map{|iv| [iv[1..-1],instance_variable_get(iv)]}, {})
      end

      def markaview(m, *args, &blk)
        b = markaby
        b.method(m).call(*args, &blk)
        b.to_s
      end
    end

    class R
      include Base
    end

    class NotFound
      def get(p)
        r(404, div{h1("#{C} Problem!") + h2("#{p} not found")})
      end
    end

    class ServerError
      include Base
      def get(k, m, e)
        r(500, markaby.div{
            h1 "#{C} Problem!"
            h2 "#{k}.#{m}"
            h3 "#{e.class} #{e.message}:"
            ul{e.backtrace.each{|bt| li(bt)}}
          })
      end
    end

    class << self
      def R(*urls)
        Class.new(R){meta_def(:inherited){|c|c.meta_def(:urls){urls}}}
      end

      def D(path)
        constants.inject(nil){|d,c|
          k = const_get(c)
          k.meta_def(:urls){["/#{c.downcase}"]} if !(k < R)
          d || ([k, $~[1..-1]] if k.urls.find { |x| path =~ /^#{x}\/?$/ })} || [NotFound, [path]]
      end
    end
  end

  class << self
    def goes m
      eval(S.gsub(/Camping/, m.to_s), TOPLEVEL_BINDING)
    end
    
    def escape s
      s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n){'%'+$1.unpack('H2'*$1.size).join('%').upcase}.tr(' ','+')
    end

    def unescape(s)
      s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){[$1.delete('%')].pack('H*')}
    end

    def qs_parse(qs, d ='&;')
      (qs || '').split(/[#{d}] */n).inject({}){|hsh, p|
        k, v = p.split('=', 2).map{|v| unescape(v)}
        hsh[k] = v unless v.blank?
        hsh
      }
    end

    def kp(s)
      c = qs_parse(s, ';,')
    end

    def run(r = $stdin, w = $stdout)
      w << begin
        k, a = Controllers.D "/#{ENV['PATH_INFO']}".gsub(%r!/+!,'/')
        m = ENV['REQUEST_METHOD']||"GET"
        k.class_eval{
          include C
          include Controllers::Base
          include Models
        }
        o = k.new
        o.service(r, ENV, m, a)
      rescue => e
        Controllers::ServerError.new.service(r, ENV, "GET", [k, m, e])
      end
    end
  end

  module Views
    include Controllers
    include Helpers
  end

  module Models
  end

  Models::Base = ActiveRecord::Base

  class Mab < Markaby::Builder
    include Views

    def tag!(*g, &b)
      h = g[-1]
      [:href,:action].each{|a| (h[a] = self/h[a]) rescue 0}
      super
    end
  end
end

Now it doesn't look so scary. If I'm lucky, it will actually work the same way as the original.

This doesn't exactly match the current version of Why's camping.rb, because he's been making changes. Doing the reformatting exercise manually was valuable experience, but I started looking for an automated way of doing it.

Then I discovered, yet again, that I am a bonehead. Why already provides a nice readable version of the Camping code: camping-unabridged.rb. It's even got comments and inline documentation.

But that takes all the fun out of it. I'm going to keep looking at "my" version to figure it out. These kids today have it too easy.


Friday, January 27, 2006

 

Dead-End Job

I've read the articles, and I'm afraid. The Indians are going to take my job. Recent college grads are going to take my job. The economy is going to eliminate my job. I'm a 40-year-old in a job for 22-year-olds. I'm not sure how, but somehow my job is definitely going to disappear.

Maybe it is really not so dire, but I am pretty sure that my job of implementing simple stuff using C++ will disappear some day. Then what will I do? Unfortunately, my job doesn't give me the opportunity to explore new technologies or gain experience in other domains, so when my job is lost, my resumé will only have a lot of "old" technologies on it.

I can't respond to the ads for Java, C#, or Ajax jobs, because I have no actual experience with those things. I can't respond to the ads for sophisticated C++ jobs, because my job is to eliminate anything "sophisticated" about our C++ code, and make it so simple that one doesn't need to know much about C++ to hack on the code.

I look around at the over-40 programmers in my company who have jobs. None of them have jobs due to their programming abilities—they have jobs because they have knowledge of the legacy systems. That's knowledge I don't have. It's knowledge I really can't obtain.

Maybe I should move up into management. I've always thought that working with idiots would bother me more than working for idiots, but job security might require that I make the move upward. It might be annoying, but at least I'll get more vacation time and I'll get to take holidays off.

Maybe I should become a consultant. All I need to do is convince somebody that I am worth four times as much as one of their employees, and they'll pay my fees.

Maybe I should start my own business. I've got the entrepreneurial spirit. I'm tired of working for other people. I'd rather implement my own dumb ideas tham implement somebody else's dumb ideas.

I don't know what I'm going to do, but I need to do it soon. The news articles say that I'm doomed. The recruiters say that I'm behind the times. My employer's newsletter says that I'm valuable, but who knows when they might decide to lay people off.

I thought economic security was supposed to improve with age. I'm in the wrong industry. I always thought that being smart, helpful, and useful would be enough to keep a job, but apparently, they are not.


Friday, January 20, 2006

 

39

I celebrated my 39th birthday this week, if the term "celebrate" can mean "sit alone at home and watch TV just like every other night." Because my birthday is in January, I do Birthday Resolutions instead of New Year's Resolutions. After all, that gives me a couple more weeks to figure out what it is I want to do with the coming year.

I've got one year to do all the things I want to do before I turn 40. But there's nothing I want to do. Yeah, I'd like to get into better shape, be smarter with my money, clean out my closets, find a better job, and the other typical stuff, but I know that none of these wants are engaging enough to hold my attention for a year.

So, I really don't have anything to write about, but I wanted to record this so that I can look at it next year and be comforted that I didn't fail to accomplish any of my goals.

I know some people will probably wish me a Happy Birthday, let me wish you all a Happy Birthday as well, whenever it is.


Monday, January 16, 2006

 

Clog

Today I heard an amusing metaphor for the limits of network bandwidth:

If you try to push too much crap through a pipe, it ain't gonna flush.

Poetry, isn't it?


Sunday, January 15, 2006

 

Scuba Lesson #3

I got to the dive shop early so I could buy a wetsuit. I don't need a wetsuit in the warm water of the pool, but I figured if I would be using one in real life, I should get some experience during training. I had planned to try on a few, but after seeing how much work was involved in getting into and out of the first one I tried (which fit well), I just decided to just take that one.

Classroom time was spent reviewing chapters 4-6 of the textbook, then filling out all the training logs and other paperwork needed to get credit for the class.

The in-pool session began with swimming fitness tests. Without any equipment, we had to swim 200 meters without stopping, then tread water for ten minutes. I have not done laps in a pool in about twenty years. The first 25 meters, I was able to swim a pretty good freestyle, but I got tired quickly and so I did the rest with a slow backstroke. (Geez, I'm getting old.) The water treading wasn't too bad, but after those activities, I was exhausted. I was looking forward to getting back in the water with the scuba gear, which is much less strenuous.

But first, I had to put the wetsuit on again. It was hard enough putting it on in the dressing room, but now, with tired arms and wet skin, it was a lot worse. I finally got it on, then had to put on the scuba equipment, which seemed to be about twice as heavy today as it did yesterday.

I did a back roll entry into the water, and then things got easier. You don't use your arms to swim in scuba, so the fact that they had become useless to me didn't matter. My legs cramped up a couple of times, which they hadn't done before during the lessons, but it wasn't too bad. Most of the time, we just floated, which was nice.

It was pretty warm in the wetsuit, and I found that it was slightly more difficult to inhale with the constricted feeling, but it didn't hinder my movement.

We practiced the remaining training tasks. These included "alternate air breathing" (using your buddy's regulator), "hovering" (floating a few feet above the bottom, using breathing to control buoyancy), underwater mask removal and replacement, removing one's BCD underwater and then putting it back on, compass navigation, and "controlled swimming ascent" (ascending to the surface on one breath of air).

I went through two tanks of air during the lesson. Everybody else was still on their first tank at the end of the lesson. I think the wetsuit made me breathe a lot more deeply and often than I normally do.

At the end of all this, I was really tired. After getting out of the pool, I spent about two minutes drinking from the water fountain. My limbs had that wet noodle feeling. Carrying all my gear around was difficult. Taking off the wetsuit took a long time. I spent a couple more minutes at the water fountain before driving home. When I got home, I weighed myself and found that I had lost five pounds today, all presumably from dehydration. Lesson learned: take a break and drink some water once in a while. I also shouldn't have skipped lunch (yes, Kris was pretty stupid today).

That's the end of the lessons in town. To get certified, I'll have to do four dives in a lake or sea. I may take care of that down in Florida next weekend, or I may wait a while. It would be best to do it quickly, but if I decide to wait a few months, I can always take a refresher class.

When I got home, I found Goldfinger on my TiVo. In the opening scene, James Bond comes out of the ocean, dispatches a few bad guys, and plants some explosives. He then removes his diving suit, revealing a tuxedo beneath, and goes to a party to wait for the explosion. I have quite a way to go before I can do all that without needing to guzzle Gatorade afterward.


Saturday, January 14, 2006

 

Scuba Lesson #2

Today's lesson was about five and a half hours long. The first couple of hours were spent in the classroom, reviewing the quizzes for chapters 2 and 3 from the textbook, along with various other topics. We started the lesson by watching the climactic underwater battle from Thunderball, which the dive master happened to record last night. We wondered whether we would be taught how to use harpoon guns, how to drive self-propelled underwater sleds, or the best technique for cutting a SPECTRE frogman's air hose, but alas, this course doesn't cover such topics.

The in-pool exercises started with mask clearing. Next we learned to breathe from a free-flowing regulator. Regulators are designed such that when they fail, they will be stuck open rather than stuck closed, so you get a continuous flow of air out of the mouthpiece. It was surprisingly easy to breathe from it in that condition.

We practiced switching between the regulator and the snorkel while swimming at the surface, without raising our heads out of the water. I got a mouthful of water once when I descended a little while snorkeling. I suspect I'm going to have a lot of trouble if I ever go back to non-scuba swimming—breathing underwater seems natural to me now, and I'll never be comfortable holding my breath ever again.

Most of the water work was focused on buoyancy control. Most of the time, a diver wants neutral buoyancy, meaning that the diver stay at a constant level, but of course you need to ascend or descend sometimes. Buoyany is controlled in a couple of ways. First, a diver wears a Buoyancy Compensator Device (BCD), which has inflatable chambers. As the chambers are filled with air, one gets positive buoyancy, and by deflating the chambers, buoyancy is reduced.

The other means of control is by breathing. When you inhale, your lungs fill with air and you get positive buoyancy. When you exhale, the opposite occurs. So, by controlling the BCD and breathing, one can maintain a depth or make a controlled ascent or descent. The proper technique is to inflate or deflate the BCD appropriately, then use breathing for fine tuning. It's a bit like the trim tab on an airplane.

We did an exercise known as the "fin pivot." To do this, you descend to the bottom of the pool, lying on your stomach with arms outstretched like Superman. Then, when you inhale, your body should rise from the bottom, and when you exhale, your body will descend again, pivoting on your fins, which stay on the bottom.

I really like the buoyancy control exercises. You just control your breathing, and do nothing else. They have a very relaxing, meditative quality to them.

We practiced "tired-diver tows," where one diver drags or pushes another who is unable to swim. It is easier than towing a non-scuba swimmer, because the BCD's keep both divers floating on the surface, and the regulators allow the tower to swim without worrying about keeping either diver's head out of the water.

After getting out of the pool for a brief break, we did the "giant stride entry." This is how you often see scuba divers enter the water: they just stand at the edge of the water, take a big step forward, and fall feet first into the water. It always looked a little traumatic to me, but after doing it, I can see there's nothing to it. It doesn't take any skill: you just let yourself fall into the water, and then wait until you float back to the surface, breathing normally from the regulator the whole time. I think tomorrow we'll be doing the "back roll entry," where a diver flips over backwards into the water, which also looks difficult but now I suspect it won't take any more skill than the giant stride.

Finally, we got to dive to the deep end of the pool for the first time. All of the exercises up to this point were in four or five feet of water, but here we descended 12 feet. There was nothing difficult about it, but it was the first time I felt like a real scuba diver. Down at the bottom, we just played around. There were a bunch of weighted frisbees and other toys at the bottom that we threw between ourselves. The dive master laid on his back and blew bubble rings (like smoke rings, but underwater). We stayed down there for about ten minutes, then made nice slow controlled ascents back to the surface. Then class was over.

One lesson to go . . .


Friday, January 13, 2006

 

Scuba Lesson #1

I had my first scuba lesson this evening. When I showed up, they fitted me for a Buoyancy Compensator Device (BCD), a jacket/vest which holds the air tank and which has inflatable chambers to control buoyancy. They also gave me a regulator, weight belt, and air tank.

Then we met in a classroom. There are eight people in the class. We all introduced ourselves. The instructor gave a short PowerPoint-style presentation, then we went over the "Knowledge Quest" (a short quiz) for chapter 1 of the textbook. Then we went to the pool.

The instructor demonstrated how to assemble the scuba equipment (attach the air tank to the BCD, connect the regulator to the tank, connect a low-pressure hose to the BCD, turn on the air flow). We got into the pool, which was pleasantly warm, then donned all the gear. The instructor went over some hand signals and basic emergency procedures. Then it was time to start breathing underwater.

The first breath was very intimidating. I half expected to get a mouthful of water as I inhaled from the mouthpiece, but everything worked just as it should. Breathing from a regulator feels just like breathing through a snorkel, except that when you exhale, you get a lot of bubbles in front of your face. We all descended, crouching on our knees or sitting on the bottom (four-and-a-half feet deep), and just sat there breathing for a while to get used to it.

The first set of skills practiced taught us what to do if the regulator comes out of one's mouth. One must first find the regulator, which is not easy with the mask blocking one's peripheral vision. There are two basic methods: the sweep method, where one moves the right arm in a circular motion from the back, hoping to end up with the regulator hose caught in the arm; and the reach method, where one reaches back to the top of the tank, and grabs the topmost hose coming out of the tank. After getting the regulator, one must clear the water out of it before inhaling, which you do either by blowing the water out or by using the purge button. We practiced and demonstrated these methods.

Next was learning to clear the mask: that is, to get water out of it if it becomes full. This is easy: just exhale from the nose while slightly pulling the bottom of the mask away from the face.

Finally, we did a little swimming. The dive master noted that AMC is playing a bunch of James Bond movies this week, and recommended that we watch Thunderball to see some really good examples of divers swimming (Sean Connery's scuba double is particularly good, he said). The group was happy about that assignment.

After that, we had about fifteen minutes to just "play," practicing the skills. The only thing I really had trouble with was the swimming—I just couldn't move very well. I'll get more practice in the coming days.

Finally, we got out of the pool, disassembled and rinsed everything, and then went home. We'll meet again tomorrow.

A common problem with new divers is panic. The dive master noted that it is not uncommon for somebody to freak out during lesson #1. I didn't panic, but I'll admit there were a couple of times when I had an irrational desire to ascend to the surface as quickly as possible, as if I could sense that the regulator was about to stop working. There is something about breathing through a little tube in a strange environment that is unnerving. I kept my cool, but I can certainly understand how somebody could lose it, especially if some real danger were to present itself.

Two lessons to go . . .


Thursday, January 12, 2006

 

How to Good-Bye Depression

Check out the book description for this: How to Good-Bye Depression: If You Constrict Anus 100 Times Everyday. Malarkey? or Effective Way?

This author also wrote Rejuvenation and Unveiled Hidden Phenix: Carlos Castaneda Shamanism Plus alpha After His Death. Here's the "About the Author" information from that:

Hiroyuki Nishigaki, a graduate of Osaka City University in 1963, resides in Japan. He was employed by the Kyodo News Agency until 1976. He is the author of four books in Japanese, including How to Attain Silent Knowledge. A female inorganic ally gave the author the ability of space travel at age of 10 and 56. His first space travel was at the age of 56.

(link from Xooglers)


Wednesday, January 11, 2006

 

Working for a Jerk

I don't think any of my co-workers read my blog, but in case any of them do, I want to make clear that the "jerk" referred to in this entry's title does not apply to the people who are officially my bosses. And if the person who I am referring to does happen to read this entry, I'm sure he won't recognize himself as the target. So if you think it's you, it's probably not. If it is you, I know you don't care about my opinion anyway.

I recently started working with someone who others had warned me about. Nobody had anything nice to say about him. He was variously described as a "dick," a "prick," and an "asshole," usually prefixed with a colorful adjective or two. Nobody used the term "jerk," but I'll use that one since it is rated G.

I pride myself with being able to get along with anyone, by being helpful and never taking things personally. I can always find some sort of common ground. I wanted to keep an open mind and get things rolling on the right foot. I figured he couldn't be all bad, and even if he was, he'd try to play nice with me just because that's the smart thing to do.

So when on Day One, he made a snide comment with the subtle implication that I was lazy and not focusing on my job, I let it slide. I was sure he didn't really mean it that way.

But now on Day Three, he has directly insulted me in an e-mail. And he CC'ed a few other people, I guess because he wanted others to know how he felt about me. OK, now it's clear where we stand.

This guy holds a position of authority, so I'll continue to do as he asks. But I know I can't make this guy happy, so I'm not inclined to try. I'll obey his orders, and continue to do what I think is in the best interests of the company, but I'm not going to be doing him any favors or giving him the benefit of the doubt when we disagree. I'll act like an adult, but I won't be working weekends to help him earn his bonus.

It's unfortunate, because this is going to be a difficult project for him, and today he lost the only enthusiastic ally he might have had.


Monday, January 09, 2006

 

Diver's Knife

A standard piece of equipment for every scuba diver is a knife. Aficionados of action-adventure movies might think that these are a diver's primary uses for a knife:

In fact, the primary reason to carry a knife is to be able to free oneself after getting tangled up in fishing line or a rope. I wonder how many drowned divers were found trapped in fishing line before someone thought, "Hey, maybe we should carry knives."

For an illustration of a diver with a knife, I highly recommend looking at Ursula Andress from Dr. No. (You are looking at the knife, right?)


 

Am I an Idiot?

A few weeks ago, I was contacted by Google, who was looking for new recruits. I spoke to the pre-screen interviewer, who asked a few questions to determine if I was smart enough to talk to one of the real Google engeineers. I passed that test, but then cancelled the interview with the Google engineer when it conflicted with aoother appointment.

Working for Google would have been kinda cool, but after a lot of reflection, it lost its appeal. I would have had to move to Mountain View, California, which I'm sure is a wonderful place, but is far away from my family and other people I love. It was the kind of job where I would have a beeper, and if the beeper went off, I'd be expected to drop whatever I was doing and go into the Googleplex.

I'm sure I made the right decision, for me, but if anyone wants to tell me how stupid I was to turn down a chance to work at Google, here is your opportuniity.


 

Skilz

I'm not sure why, but lately I have been thinking about my "skill set": those things I know how to do that make me special. In Napoleon Dynamite, the hero brags about his skills: "You know, like nunchuck skills, bowhunting skills, computer hacking skills...". He also makes note of his sidekick's skills: "Well, you have a sweet bike. And you're really good at hooking up with chicks. Plus you're like the only guy at school who has a mustache.".

In interview situations, my skill-set is often an issue. It's not enough to demonstrate that I am a competent C++ programmer or that I know something about Microsoft Windows; many recruiters/interviewers want a very fine-grained description of my skill-set. They want to know how many months I have spent using Active Data Objects (ADO) in Visual C++ 6.0 Service Pack 5 with Windows XP. Then they want to know how many months I've spent using ADO with Windows 2000, which is really the same thing. In such interviews, I suddenly remember an Important Engagement that requires me to terminate the interview. Life is too short to spend it working for morons.

So, here is my short list of "Skills I Have Acquired:"

There are, of course several skills I wish I had which I don't have yet:


Saturday, January 07, 2006

 

Scuba

After a couple of evenings of research on the Internet, I stopped by a dive shop today. Two hours and $750 later, I own a bunch of diving gear and I'm signed-up for lessons next weekend.

The way this works is that I'll have three days of lessons in a local swimming pool, along with some classroom time, then I'll have to do four open-water dives in a lake or the ocean to get the initial open-water certification. This shop takes a bus down to Florida about once a month to give certification dives.

I have my own mask, snorkel, fins, gloves, booties, knife, and slate. Tanks, regulators, dive computers, and other such stuff will be provided by the school during the lessons, then afterward I'll either rent or buy those things. I'll probably buy a wetsuit before my certification dives, because even in Florida, it's cold outside.

There is a book and a DVD I have to study before the lessons.

With all this stuff, plus the certification dive trip, the total cost for getting the open-water certification will be $1,200-$1,500. They kept warning me that I am getting into an expensive hobby, but after the private-pilot experience, this seems pretty cheap. Diving looks like it is going to cost about $100 per day, which is a lot less than the $100 per hour it takes to fly.

In addition to the expense, scuba has other similarities to flying. Participants are relying on technology to put them in environments where humans normally can't go. People aren't allowed to do it without formal training and demonstration of proficiency. One learns a lot about physics, meteorology, and physiology. Everybody is obsessed with safety. There are lots of toys to play with. People look goofy while wearing the equipment.

Scuba diving isn't regulated by the government. Instead, there are dozens of organizations around the world that provide training and certification. This school can provide both SDI and PADI certification. PADI is the larger, more well-known organization, but the guy at the dive shop recommended SDI, because their training focuses on more modern equipment and techniques, so I'm taking an SDI class. From what I gather on the Web, there isn't much difference between the organizations' training requirements and methods, particularly at the lower levels, so I'm not too concerned about the choice.

So anyway, I'll spend the next few days studying the training materials, then I'll get wet next weekend. With any luck, I'll be at the bottom of some large body of water within the next couple of months.


Thursday, January 05, 2006

 

Here I Go Again

After a couple of conversations with a couple of bosses about my newest project assignment, it looks like this will be a typical project:

(sigh)


This page is powered by Blogger. Isn't yours?