Sinatra is classy.

My First Sinatra Project

Slowly, but surely, I am working my way through the Flatiron School’s curriculum. Though it is taking me a bit longer than I expected, I also have relocated to Vermont, sold a house, and settled into my new home. So, I guess I shouldn’t be too hard on myself. Living in Vermont is great and I’m hopeful that I can refocus now on getting my Flatiron work done.

To that end, I have completed my first Sinatra application. Sinatara is a framework for web apps that, along with ActiveRecord, can generate some pretty powerful CRUD based apps. Sinatra provides ‘routes’, which are basically pathways to content that your app will follow in response to HTTP requests. These routes allow for loading and manipulating data through Ruby methods.

For my Sinatra app, I imagined a survey system that would allow users to both create and take surveys. I made some decisions along the way to limit the scope of what I would create for this porject. These limitations were selected so that I could fulfill the requirements of the Flatiron curriculum, but also get the project done without going crazy. I’m still going crazy anyway.

To begin, I though about my database and the relationships between the data. I came up with a model that looks something like this:

Sinatra Project Database Model

The “responses” model was not copmleted as previously indicated. So, there are four databases that I used:

So, with that basic model in mind, I got to building the CRUD functionality, models, routes, etc.

To illustrate some of what I learned, let me go over the user authentication and login procedures:

class SessionController < ApplicationController 
  get '/login' do
    if !logged_in? 
      erb :'sessions/login'
      @user = User.find_by(email: session[:email])
      redirect :'/'

  get '/registration' do
    if !logged_in?
      erb :'sessions/registration'
      @user = User.find_by(email: session[:email])
      redirect :'/'

  post '/registration' do
     @user = params[:username], firstname: params[:firstname], lastname: params[:lastname], password: params[:password], email: params[:email])
     if !logged_in? && @user.valid?
      session[:email] = params[:email]
      @my_surveys = @user.surveys
      @all_surveys = Survey.all
      redirect '/surveys'
      flash[:message] = ""
      @user.errors.messages.each do |key, message|
        message.each do |text|
        flash[:message] += text + "<br />"
      redirect :'/'

  post '/sessions' do
    login(params[:email], params[:password])
    @user = current_user
    @my_surveys = @user.surveys
    @all_surveys = Survey.all
    redirect '/surveys' 

  get '/logout' do
    redirect :'/'


The SessionController manages the user login experience. But three helpers I created in ApplicationController are also relevant:

  helpers do 

    def logged_in?

    def login(email, password)
      user = User.find_by(email: email)
      if user && user.authenticate(password)
       session[:email] =
       session[:user_name] = user.firstname + ' ' + user.lastname
       redirect '/login'

    def current_user
      if logged_in?
        User.find_by(email: session[:email])
        redirect '/' 

These helper methods assist the login process by providing the following funtionality:

Now, looking back at SessionController, there are four Sinatra routes that manage the login process:

get ‘/login’ do: This route checks to see if a user is logged in already. If not, it renders the login form. If they are logged in, the user is redirected to their home page.

get ‘/registration’ do: This route renders the registration form if the user is not logged in already.

post ‘/registration’ do: This route handles the registration process. This is where I used validation and flash messages to provide feedback to the user. The validation flash settings are configured in the User class:

class User < ActiveRecord::Base

  validates :username, presence: { message: "You must provide a username." }, uniqueness: { message: "Username is already taken." }
  validates :email, presence: { message: "You must provide an email." }, uniqueness: { message: "That email is alreday taken." } 
  validates :password, presence: { message: "Password cannot be blank." }
  has_secure_password validations: false

  has_many :surveys


post ‘/sessions’ do: Here, this route logs the user in and then send them to the ‘/surveys’ route where their surveys will be listed for editing, creating, etc.

get ‘/logtout’ do: Finally, this route clears the session hash, logging the user out.

Ok. This post is long and fairly boring, so I’m going to stop here. The CRUD aspect of this app will have to wait for another blog post. That stuff is handled by the SurveyController class. Fun!

Ruby is a precious gem.

Making A CLI in Ruby

For my educational benefit and as part of the process at the Flatiron School, I recently wrote a CLI gem in Ruby. This was a great learning experience and a bit of challenge for a newbie like myself. That said, it was also rewarding and I have gained a much better understanding of things Ruby. Mission accomplished.

My idea was simple, since this was my first effort. So, I decided to make a CLI that searches for a list of doctors in a particular zipcode and then allow the user to get more details about a particular doctor. I cleverly named this app “doctor_finder.” Why? Because it finds doctors!

At first, I thought I would use one of the large, well-known sites, like WebMD or HealthGrades. I also looked at insurance companies websites and government websites. All of them posed challenges that I could not overcome. The commercial sites blocked scrapers, and I wasn’t savvy enough to get around their blocks. Other sites required the user to fill out forms that I could not easily get past in an automated way.

I finally settled on Zocdoc. This website met my needs and allowed me to search for a doctor by zipcode by using a customized URL. It returned 20 doctors to me, that I could parse with Nokogiri.

But first things first. The first step in this whole process was setting up properly for a Ruby Gem. This process is made simple thanks to Bundler. Bundler includes a gem command that creates the directories and basic files you need to get started. It also includes some automation in your gemspec file so you don’t have to manually maintain your list of files. Finally, it sets up a git repo for you. Basically it gets you off to a good start:

bundler gem doctor_finder

Bundler will even ask you if you want to include a license and a code of conduct. The basic structure of a gem includes a bin directory for storing executable files, a lib directory for storing the main code, modules and classes, etc, and a spec or test directory for your testing tools. I didn’t use any tests for this project, but I’m sure I will in the future.

With that done, the next step is to figure out how you will set up your dependencies and files to get things working. Since I was building a CLI, it made sense to start there. I decided that my CLI would call a CLI object and run a method on that object - and that that CLI object would take care of things from then on. So, to get that going, I needed to create a file in the bin directory called ‘doctor_finder.rb’ which would serve as my main executable file. So I also needed to chmod +x doctor_finder.rb to make it executable. Then, I added this code to the new file:

#!/usr/bin/env ruby
require_relative "../lib/doctor_finder"

So, the key line is the First, I assume a moduel (namespace) called “DoctorFinder” that is actually created by bundler in the versions file. Then I assume an object called CLI, I create a new one, and I call the method call.

So I need to create the CLI class and include a method called call. I’m pasting in the completed object below. This file would be found in the doctor_finder/lib/doctor_finder directory.

# CLI Main file defining the CLI class

class DoctorFinder::CLI

  def call 
    puts "\nWelcome to Hooper's Doctor Finder."
    puts "\nWith HDF you can retrieve a list of doctors by zipcode and then get more details about a particular doctor on that list. It's easy!"

  def get_zipcode
    # Gets a valid zip code from the user
    zip = "" 
    while !iszipcode?(zip)
      puts "\nPlease enter a valid zipcode:"
      zip = gets.chomp[0..4]

  def iszipcode?(zipcode)
    # Provides a basic level of validation for user input of zipcode.
    if zipcode.length == 5 && zipcode.scan(/\D/).empty?

  def show_list(zipcode)
    # Calls scraper and prints a list of doctors based on the zip code entered by the user.
    docs = DoctorFinder::Scraper.scrape_by_zipcode(zipcode)
    docs.each.with_index(1) do |doc, i|
      puts "#{i}. #{} - #{doc.speciality} - #{}, #{doc.state} #{}"

  def get_choice_from_list
    # Gets a valid choice from the list of Doctors.

    choice = nil 

    while choice != "exit" && choice != "q"
      puts "\n[1..#{DoctorFinder::Doctor.all.length}] Select Doctor | [zip] Start over with new zipcode | [exit] To quit"
      choice = gets.chomp
      if choice.to_i > 0 && choice.to_i < DoctorFinder::Doctor.all.length+1
        doc = DoctorFinder::Scraper.scrape_for_details(DoctorFinder::Doctor.all[choice.to_i-1]) 
        puts "======================================\n"
        puts doc.street
        puts + ', ' + doc.state + ' ' +
        puts "--------------------------------------\n"
        puts "Areas of Specialty:"
        puts doc.areas
        puts doc.details
      elsif choice == "zip"

  def farewell
    # Tells the user goodbye.
    puts "\n\nThank you for using Hooper's Doctor Finder.  This was an educational experiment, and I learned a lot.  At first it seemed hard, but then it got easier.\n\nSee you next time.\n\n\n\n"

Let me explain the purpose each method:

call: This is the initial method that is called from the executbable itself. All it does is print some introductory content and then call other methods. First I want to get a list of doctors based on a zipcode the user enters. So, I call a function list_doctors and I pass it get_zipcode. After that, I want to run the main menu loop, and then, when the user is done, say farewell.

get_zipcode: This method simply asks the user for a zipcode and then returns that zipcode.

iszipcode?: This method runs some very basic validation on the user input. The good news is that Zocdoc is very tolerant of user input - so even if they don’t enter a proper zipcode Zocdoc will do its best to return a list of doctors to us.

list_doctors: Prints out a list of doctors based on a zipcode passed to it. In order to accopmlish this, it makes calls to two other classes, Scraper and Doctor. I’ll show you those below.

get_choice_from_list: This is my poorly named main menu loop. Until the user enters valid input, it shows a list of doctors, pulled from the Doctor object. If they choose a valid doctor, it prints that doctors details.

farewell: Says goodbye when the user exits.

Next, lets take a look at the Doctor object. All this class does is store data for a doctor and it maintains an array of all the doctors:

# The Doctor class

class DoctorFinder::Doctor

attr_accessor :name, :url, :speciality, :street, :city, :state, :zip, :details, :areas

  @@all = []

  def initialize
    @@all << self

  def self.all

  def self.clear
    @@all = []

Not much going on here. But if this was part of a larger application, having the Doctor class as a separate class might prove useful. One thing to note - I made a clear method to empty out the array of doctors so I could do a new search in a new zipcode without creating another instance. For the rest of the app, the action is in the Scraper class:

# The Scraper class

class DoctorFinder::Scraper

  BASE_URL = ""

  def self.scrape_by_zipcode(zipcode)
    html = Nokogiri::HTML(open("#{BASE_URL}search?address=#{zipcode}&insurance_carrier=-1&day_filter=AnyDay&gender=-1&language=-1&offset=0&insurance_plan=-1&reason_visit=75&after_5pm=false&before_10am=false&sees_children=false&sort_type=Default&dr_specialty=153&"))
    slice = html.css('.js-prof-row-container')
    slice.each do |doctor| # will go through the HTML and create new doctor instances
      doc = = doctor.css('.js-profile-link').text.strip.gsub("\n", ' ').squeeze(' ')
      doc.speciality = doctor.css('.ch-prof-row-speciality').text.strip
      doc.url = BASE_URL + doctor.css('.js-profile-link')[0]['href']
      address = doctor.css('.js-search-prof-row-address').text.strip
      doc.street = address.slice(/^\d+[ ][\w+[ ]]+/) # To format the text correctly, had to use some regex = address[/[ ][ ]+[\w+[.]*[ ]]*[,]/].strip.chop
      doc.state = address[/[A-Z][A-Z]/] = address[/\d{5}/] 

  def self.scrape_for_details(doctor)
    html = Nokogiri::HTML(open(doctor.url))
    doctor.details = html.css('.profile-professional-statement').text.squeeze(' ')
    if doctor.details.strip == ""
      doctor.details = "No further details were available."
    doctor.areas = html.css('li.specialty').text.squeeze(" ").gsub("\r\n \r\n ", "\r\n").lstrip

The Scraper class has two methods and one constant. The BASE_URL constant was just a helpful way to desingate the web site I was scraping. The other methods:

scrape_by_zipcode(zipcode) takes a zipcode and scapes Zocdocs for a list of doctors based on that zipcode. I encode the zipcode in a search string nad usethat from my open-uri request. I slice a chunk of html out of the whole site to narrow in on just the doctor info. Then I iterate through the array from Nokogiri tossing the data I want into a new Doctor instance. I use a number of regular expressions and string methods to get only the data I want in the object. I return the array of all the doctors.

scrape_for_details(doctor) takes a doctor and fills in more data about that doctor by scraping the doctor’s detial page. I use the url I scraped before when I constructed the doctor list and pull down the details. Then, like before, I use text methods and regular expressions to get the data I want in the right place. I return the doctor, but now with more details.

So, that’s basically how this things works. As I said at the begninng, I learned a lot playing with this. Now, onward!

Be lazy. Machines should serve human being. Often programmers serve machines unconsciously. Let machines serve you. Do everything you can to make you lazy. (Yukihiro Matsumoto)

Object Orientation and Ruby

Ruby is an object oriented programming language.

When I was in college in the early 90s, OO was a peripheral subject. We learned about object oriented programming, but it was reagarded as a side show. There were special cases and certain applications that benefited from OO, but it wasn’t the main event. We were focused on procedural programming, in highly structured languages like Pascal or lower level languages where we could get real speed advantages like C.

OO has now become a fundamental approach in most high level programming languages. Ruby was developed, in part, to integrate object orientation throuhgout the programming language. Everything in Ruby is an object, for better and worse.

Even a number.

So you can write code like:


Which takes the object “1”, which is an instance of the Fixnum class, and runs the “+” method on it which adds the argument, in this case, “2”. The result is “3”.

Now, that’s kinda funny, so you can also just write:

1 + 2

and all works just fine. I suppose that is a convenience when dealing with numbers, but it is good to always remember that everything is implemented as an object.

Generally speaking, objects contain both their data structures and their code. In the parlance, the data are called “attributes” or “properties” and the code are called “methods.” On occassion, it is useful to reference the instance of the object in a method, in order to operate on the instance itself. For that, you use the keyword self. Generally, self refers to the current object. But self can also refer to the current class. Ruby uses context to distinguish what exactly self means. So, for example:

class Person

    @name = ''
    @@count = 0
    def name
    def initialize
    def self.count
        @@count += 1


In the example above, refers to the instance variable @name. In that case, self refers to the instance created by initialize. However, in the method declaration def self.count self now refers to the class since using self in a method declaration makes the method a class method.

This is both confusing, and intuitive. It’s confusing because the word ‘self’ is being used to refer to two different things. But it is also intutive, so long as you consider the context. When you are defining a class, at the top level of that class, self should refer to the class itself, like in the method example. But, within an instance method, self naturally refers to the instance of the class, since the method will be used and ‘owned’ by instances.

Well, ok, maybe it isn’t super intutive. And there is a good chance that I got the details a bit wrong here….But that’s the idea.

Reclaiming the Internet (and embracing the well-intended flame)

When I was in collge, back in the early 90s, I was first introdcued to the internet. I had an account on my school’s mainframe, ostensibly for academic reasons, and I had my first ever email address. Back then, no one had email addresses. I could only email my fellow nerd students and a few professors. Soon, I discovered Usenet, and I followed a number of newsgroups religisouly, especially the one’s that commented on beer in a world before micro-brews.

In the early 2000s the internet began to mature. Soon, websites were a thing. As were companies trying to sell you stuff on websites. With the Web 2.0 evolution, websites became dynamic and databse driven and real commerce could be done. I remember learning the basics of Perl and CGI when that was the number one way to create dynamic web content. It wasn’t pretty, but it worked.

My life took a different turn. I went to seminary and became a pastor, while the internet continued to change and evlove, largley driven by economic forces. But I remember a few moments in the early 90s when the internet was about something else. It was about connecting with people, sharing information for the good of all, and, yes occassionally flaming people for not RTFM.

That said, whenever I was duly flamed, I was spurred to learn more. When the internet was not as mean-spirited a place as it is now, a flame was a helpful slap to encourage you to dig deeper, do your homework, be a contributor and not just a consumer. The internet, back then, expected me to have something to offer - and because of that expectation, usually, there was something to learn, something to gain, something to share.

Now, between Facebook and Twitter, the internet has become about shouting at people. Or narcissistically sharing the highlight reel of your life. Or about tempting our consumerist cravings until they explode in credit card debt.

I wonder if it could be different. Hosting this blog, on a server I pay for, with a set of open source tools that empower me to make the blog, all of which is free from anyone’s ownership or commercial ambition, is a reminder of what the internet can allow. The internet can allow us to freely express ourselves, to engage each other with ideas, to share what we are up to. And it can be a profound community that challenges us to be more thoughtful, more self-critical, and more engaged in meaningful, helpful ways.

Recently, I signed up for, a new service that hopes to provide a more open, more accesible alternative to Twitter and Facebook. By providing an accessible framework within which people can share short posts of content, enables the internet to resemeble its old self. If Manton (’s founder) can find a way to keep free of the commercial interests that have diminished the effectiveness of tools like Twitter and Facebook, and if the community continues to evolve in an intentional way, with strong and clear community guidelines, the future could be bright for and by extension, the internet.

(Usenet began to decline when it’s servers were overwhelmed by people uploading pornographic images and pirated software binaries. I’m not judging, but good community guidelines are essential to ensure that any network or community lives up to it’s best ideals and original vision.)

The end of net neutrailty threatens new ventures like If it turns out that the only real purpose for the internet is to make some people rich, services like and the old internet have no hope. Eventually, it might become necesssary for an entirely new network to be built - a public network that benefits all people. For now, let’s hope that enough of us care enough about the internet to realize it’s potential to really, deeply, meaningfully improve people’s lives.

I find the primary reason I get stuck is because of a pesky syntax error.

Getting Stuck...and Unstuck

Getting stuck is part of life. It’s also part of programming.

As a fairly novice coder, I find the primary reason I get stuck is because of a pesky syntax error. Somewhere I forgot to put a parenthesis, or I forget to properly close a code block. It’s easy to miss these things, and the interpreter is unforgiving.

There are a couple of tools and techniques that I find help when I get really stuck.

These tricks help me move beyond a stuck point. But you know what helps when I’m really stuck? I step away from the desk and take a nice long walk, watch some TV, or (don’t tell) play a video game. Taking a break and doing something unrelated really helps. When I return to the desk, I usually find the problem much more quickly than I would have otherwise, thanks to having a refreshed perspective.

Sitting in front of a monitor trying to make the stupid computer do something interesting is my idea of a good time.

Setting a New Course

Recently, I began pursuing a new professional path that, on first blush, might seem like a radical change in direction. However, in the context of my life story, I think it is a fairly reasonable change and I am hopeful for some interesting new opportunities.

First, let me give you some background.

For my professional life so far, I have served as a United Methodist pastor. I was drawn to ministry for a number of reasons: a passion for the church and the rich questions of life that the church wrestles with, a love of people and a desire to serve my community, a knack for speaking and a capacity for leadership. For many years, working in the church was very rewarding and endlessly interesting.

But, eventually, the church began to become a place of frustration for me. Churches are wonderful places, but they are also broken places. The mainline church faces immense challenges - shrinking congregations, crumbling buildings, decreasing cultural resonance, insufficient resources and a basic lack of clarity around mission and purpose. In addition to all of that, the church is engaged in endless debates around sexuality, gender, and power structures - debates that don’t really interest most people and serve to make the church an even less attractive option for Sunday mornings.

While my convictions as a Christian remained intact, I grew increasingly disenchanted with organized expressions of my faith…even of the ones I was leading.

I toiled in this frustration for a while and tried different opportunities, but in the end, I concluded that I would be of more use to the church and happier as a person doing something else professionally

That began a long period if introspection and reflection. I’ll bore you the details except to say I have an amazing and graceful wife.

In college, I majored in Computer Science. I was an average student, on a good day. But as a child I had developed a fascination with computers from the first time I touched an Apple II (yes, I’m that old). My dad bought an Apple clone (the famous, and illegal Franklin Ace 1000) and I learned to write BASIC programs and play video games. In college, I continued my interest into computers, but I was a typical college kid of Generation X, with out any real direction. Seminary gave me direction so off I went - but now my old interest in playing with computers is returning to the fore.

Over the years, I’d built websites for the churches I served and friends. I took a stab for a while as a freelance web developer, but I didn’t really like working for myself and I always wanted to hone my skills so I had more to offer. So, at the end of my reflection, I concluded that I would like to set aside some time and really develop myself as a coder/programmer/developer. At the moment, I am hoping to work in the health care field, continuing my interest in helping people, but I do not want to close myself off to any opportunities that might come my way.

As I began exploring how I might proceed, I discovered a number of “schools” that offer to prepare people for careers as web developers. To be honest, I was skeptical about them, since they were non-traditional educational institutions, usually for-profit, and with little information to confirm their effectiveness. Eventually, however, I found the Flatiron School. I was impressed with them for a few reasons. First, I read about them on a blog I follow, and the reports seemed to be quite positive. Second, I noticed that Flatiron was unique among these “code camps” in that they submitted their results to an independent audit. Finally, Flatiron has a strong commitment to educate and place women and minorities in tech careers. Their values seemed to line up pretty well with mine. That isn’t to say all things are rosy at Flatiron. The need for programmers and coders has far outpaced the supply. Consequently, these “schools” have popped up in an effort to meet the need. But it feels a little “wild west.” More than others, Flatiron seems committed to bringing standards and professionalism to their emerging industry - and I hope they are sincere and successful.

So, I’ve begun. So far so good. The road ahead is long and challenging for me, and I’m not sure where it will end up. But I am excited to find out. In the weeks ahead I’ll be posting additional blog posts here about my progress and what I have learned.

Oh. There’s one other reason why I want to do this. I find it fun. I enjoy it. Sitting in front of a monitor trying to make the stupid computer do something interesting is my idea of a good time. So….that’s no small part of this new adventure.

Arethusa Falls
The view from Frankenstein Cliff is impressive.
Don't walk on the tracks!

Arethusa Falls And Frankenstien Cliff

Yesterday provided a perfect early-summer day to go look at a waterfall. This time of year, the rivers and lakes are full, so waterfalls have ample fuel. We decided on Arethusa Falls, just south of the AMC facility in the White Mountains. Nearby Frankenstein Cliff offered another opportunity for great views.

It was a warm day, slightly overcast. But the sun poked through often and we sweated a lot. The trip took us about four hours, and covered just over 5 miles and about 1400 feet of elevation gain. Generally, I would classify this as a moderate hike, however there were stretches on the downhill portion after Frankenstein Cliff that many (myself included) would find challenging. They are short portions, however, and we managed them without too much difficulty.

Ample parking by the trail head made us quickly aware that this is a popular destination.  The hike from the parking spot to the falls themselves was very popular and we passed many hikers heading back down as we were heading up. The trail during this section was easy to follow.  The only challenges were the climb, the many roots, and the occasional mud.  In rainy weather, this trail would be much tougher.

A short, downhill spur leads to the falls themselves.  The air gets much cooler as you approach, and you can feel the gentle spray as the water cascades down.  The falls were much larger than I expected.

After a few moments at the falls and a snack, we headed back up the spur trail and then turned off toward Frankenstein Cliff.  This trail had far fewer hikers on it - we only saw a couple - and was harder to follow.  Some sections follow creek beds and you have to look for the yellow blazes to make sure you are going the right way.  Also, since this trail appears to be much less popular, the trail is often narrow and overgrown. Just the way we like it!

The Frankenstein tail begins with a bit more uphill, until you reach a high point that offers some views, but is mostly blocked by trees.  The real view is on down from that “peak” at the Frankenstein Cliff overlook.  Here, the view of the Saco River valley is spectacular, and sadly, my iPhone camera did not come close to capturing the beauty.

Heading down from here is when things start to get a bit tricky.  The trail down from the cliffs makes a number of switch backs and is often narrow and muddy.  As you come down, you begin to realize how dramatic those cliffs are, looking back and up.

After you come down from the cliffs, you encounter the railroad, and this amazing elevated bridge.  The trail continues under the bridge, which was confusing at first because my navigation software followed the train tracks themselves back to the parking lot.  The AMC Guide says that walking the tracks is dangerous and prohibited, do I don’t recommend it, tempting though it was. The trail actually follows basically the same route, just to the south of the tracks and presumably out of the way of trains.

And finally, here is the route we took:

All in all, this was a great, challenging hike, with New Hampshire’s tallest waterfall at 200’ and a great cliff view to boot.  A good way to spend the afternoon.

Heublein Tower

An Early Semi-Urban Hike

Living in Hartford, I am usually surrounded by the trappings of an urban environment - sidewalks, asphalt, glass, steel, cars, trucks, horns honking, sirens blaring. And yet it is fairly easy to take a short drive and find oneself surrounded by wilderness. An accessible semi-urban hike is a real treasure.

One example is the hike we did last weekend. We had a pretty glorious day on our hands, so that helped. Heading west, we went to Reservoir 6 in the Metropolitan District’s recreation area system. Reservoir 6 offers a wide, 3.6 mile path around the reservoir that is a real pleasure to walk on. You can get a PDF map here. Sometimes, taking a stroll around the reservoir makes for a great day.

But sometimes you want something a little more. So, we walked about half way around the reservoir trail where the Metacomet Trail breaks off and heads up to Heublein Tower. Heublein is a popular destination, though the tower itself doesn’t open until Memorial Day (here is the official site). There are a lot of ways to get up to the tower, but taking the Metacomet ensures a quiet hike away from the crowds.

The only downside for us on this hike was that there was a lot of mud. Recent rains had really saturated the trails and in some cases getting muddy was unavoidable. But hey, that’s part of the fun. Around the tower there are great views and picnic tables - a good place to chill out and hang out - and there is great space for bigger groups if you are looking for that.

Also, interesting fact: A party was once held at a large BBQ pit (which is still there) for Republican political leaders. At that event, Dwight Eisenhower was asked to run for president. A little history!

At one point, wooden boards had been placed on the ground to help navigate some muddy sections.

Another fun fact: at one place near the tower, the borders of three different towns all converge: Simsbury, Avon and Bloomfield. A sign marks the spot.

And here is the route we took. It was about 3 hours for us, moderately difficult verging on easy. We covered 6.5 miles with about 600 feet of elevation gain (and loss since we did an out and back).

Having a hike like this - that truly feels like wilderness and yet is just a few minutes out of the city - is a wonderful thing. It would be nice if more Hartfordians took advantage of this very accessible widerness.

We live in a world that is in serious turmoil and desperate need of the hope, grace, and open-ended possibilities that our God offers.

The Uncertain Future of the UMC (and it isn't about gays!)

As a lifelong United Methodist and a somewhat reluctant member of the clergy, I watch the church as its institutions struggle to navigate the rough waters around homosexuality, church polity, and the demands of the gospel of Jesus Christ.

These are difficult waters to move through. For many, homosexuality remains a sin, inspires disgust, and deserves the strongest condemnation. At present, our church’s official policy is to deny homosexuals (self avowed, practicing) access to full membership as clergy. The level of welcome and participation of gay and lesbian lay people varies widely from church to church (though churches are clearly moving in the direction of more acceptance of gays in volunteer roles).

So, our Judicial Council, unsurprisingly, ruled recently that a Bishop can’t be a lesbian and, furthermore, our Boards of Ordained Ministry, which recommend candidates for ministry, must make a “‘full inquiry’ of candidates” which includes “issues of sexuality”. In other words, I guess our Boards have to ask our candidates about their sex lives. That will be awkward!

What’s interesting to me is that the only time the church makes news anymore is when we are fighting about homosexuality. For the vast majority of Americans, the depiction of our church in the mainstream media is the image they will retain of our church. Not a pretty picture, and not something I would want to be a part of, except that I already am.

I support the full inclusion of our LGBTQI friends in all levels of the church. If they have the gifts and grace to serve as pastors, we should be celebrating that fact. But I also think the church, on either side of this debate, is making a terrible miscalculation if it thinks that by resolving the “homosexual question” - either with a new commitment to unity or a church split - that the church’s problems will somehow be easier to solve. The fact is that the world has largely moved on from this issue (Ellen came out on TV 20 years ago!) and whether or not the church “resolves” it won’t be of much interest to most people.

Instead, the church - or the churches if we split - will be faced with all the underlying issues that we haven’t even begun to address in earnest. We just won’t have homosexuality to distract us anymore from the dismal realities of our shared life: that our churches continue to shrink, that our structures continue to be untenable, that our financial models don’t add up, that our wider culture no longer understands us nor really cares about us.

So, what to do in this situation? Well, we are going to have a special General Conference, that will cost around $4 million, so we can argue some more about homosexuality.

We live in a world that is in serious turmoil and desperate need of the hope, grace, and open-ended possibilities that our God offers. The Methodists, historically, had an important role to play in extending that grace through our churches which were places for people to be accepted, loved, developed spiritually, and engaged in transformative mission and ministry. We extended that grace through our hospitals and clinics, our homes for the elderly, our schools and universities that embraced intellectual advancement and scientific inquiry. We had a passionate and progressive vision of the Gospel of Jesus Christ unfolding in our individual and collective consciousness as we pursued personal and social holiness.

What happened to that?

I fear that our church will split because I don’t see how the “homosexual question” can be answered in a manner that is acceptable to all. But I fear, even more, that we will continue to fail to embrace the beautiful and worthy mission that God has given us.

A momentary pause to absorb the view at Windy Gap.
From the peak on a clear day you can see Lake Champlain - a thin blue strip below the horizon.

Camels Hump Expedition

Editor’s Note: Though this trip took place on August 19, 2016, and the post is time stamped to reflect this date, the actual writing of this post happened on August 23.

So, after our success on Mount Willard (read all about it here), we decided to up the ante and try one of Vermont’s genuine 4,000 footers - Camels Hump (height 4,083 ft.). You might think I mean “Camel’s Hump”, but oddly, the official name as recorded by the U. S. Board on Geographic Names omits the apostrophe, so Camels Hump it is!  Locals of course usually include the apostrophe, suggesting that the hump is owned by a camel, but I don’t care! I just hiked the sucker!

We knew this one was going to be a bit more demanding. However, after reading a number of online trip reports, it sounded like we could handle it. We discovered on our journey that the hike was much harder than we expected, even after reading the reports.  It isn’t impossible, by any means, but it does pose a challenge to your average hiker, with significant sections requiring four-legged scrambling and a decent elevation climb.

We planned the route above - starting off on Burrows Trail but quickly taking the Connector over to Forest City Trail. The FCT ends up at the Long Trail, south of the peak, and we took the Long Trail on up to the top.  This was by far the hardest section of trail we hiked, and where most of the scrambling occurred.  Finally, after some time on the summit, we descended back following the Burrows Trail back to where we parked.

The parking spot is located at the end of Camels Hump road.  However, be careful!! We learned the hard way that there is more than one road named Camels Hump.  So make sure you are headed to the right place.  The hike along the Forest City Trail follows a stream for bit:

After the FCT joins up with the Long Trail, things start to get a bit more challenging. Scrambling up rocks on all four is not uncommon.

A bit after some of those tough scrambles up the Long Trail you come to Wind Gap, which provides a great view through a clearing.

Some more scrambling and rock climbing - all challenging for us, but doable - resulted in a joyful rest on the summit.  One thing I will say about Camels Hump is that the summit is quite nice - wide, open with great views in all directions.  You can see Lake Champlain stretched across the land. You can see Mount Mansfield and even Mount Washington.  Spectacular views and lots of room to share the space with others. We caught a perfect day and the temperature was really nice and it wasn’t too windy.  Just spectacular.

We had eaten lunch just before we reached the summit. Still the summit is a great place to dine.  The alpine region above the tree line is host to a number of fragile plant species and there are markers and signs warning you to not damage the foliage.  Generally, that was not a problem as we just stayed aware of where we were stepping.  We chilled out, absorbed the view, chatted with a few other climbers, and then began our descent, first on the Long Trail over Camels Hump and then on to Burrows Trail for the return.  Burrows is a much easier trail than the FCT, but it lacks the impressive views.  It’s main perk is that it allows you to make your trip a loop, instead of an out-and-back, and it is a faster return.  If you just wanted to get up Camels Hump and get back, it would be faster and easier to just go up Burrows and back Burrows.  But that’s too boring for us!

The hike took us 5 hours and 22 minutes and we covered 5.6 miles. Whew!! About 2500 feet of elevation gain and loss.  Double whew! Our 5 hour time included quite a bit of time on the summit and a few solid breaks for rest and lunch along the way.  A great day!  But we were wiped - I mean really wiped!! So a few days of rest were in our future.

Camels Hump is a challenging hike, but it provides great views and a great sense of accomplishment.

Just off the trail you can find pleasant waterfalls and pools.
Baylah pauses for a photo of Crawford Notch on the top of Mount Willard.

Mount Williad Expedition

Editor’s Note: Though this trip took place on August 17, 2016, and the post is time stamped to reflect this date, the actual writing of this post happened on August 23.

I like calling my hikes “expeditions” because it makes me feel awesome.  But, I am going  to reserve this word for trips that summit mountains so that it maintains it’s special feel. Mount Willard (elev. 2,865 ft) may barely qualify as a mountain, but nonetheless, I’ll call this an expedition.

On the other hand, there is a funny thing about the hike up Mount Willard - the trail ends just before the actual peak of the mountain.  So, technically, we didn’t quite reach the summit. That said, the cliff-top area where people gather after their hike up provides spectacular views of Crawford Notch.  Since the rock face is exposed, the view are unobstructed, but so are the winds.  Though it was a warm day, the top was cold and cloudy, with lots of fog - and fierce, gusty winds that blew without ceasing.  In the cover of the forest and thus for most of the trail, the trees provided protection from the winds.

First, here is a map of the route we took:

There is a nice parking lot across 302 from Saco Lake (a handy map) just south of the AMC Highland Center and next to the Crawford Notch Station where the Conway Scenic Railway stops on it’s Notch Train excursions. We witnessed the train when we retuned from our hike.  There is also a small shop and restrooms - both of which are handy.

The day was warm at our Vermont HQ, but even at the base of Willard near Crawford Notch Station the temps had dropped considerably. We were a bit concerned at the onset that we might be too cold at the top, but things turned out ok as we worked up a healthy sweat on the hike.

The trail up Willard is an out-and-back and doesn’t connect to any other trails.  It does, however, start off with the Avalon trail.  After a short stint, the Willard branches to the left off of Avalon.  The Avalon trail continues southwest and eventually connects with the Appalachian Trail. The Willard hike is fairly easy, though it does climb some - we had about 1,000 feet of elevation gain in 1.5 miles up.  The total round trip was 3.4 miles and took us just about 2 hours, with a 20 minute break on the top to enjoy lunch and the view.

The trail follows a stream most of the way, and this provides opportunities for waterfalls, cascades and pools.  Plus, the pleasant rush of the running waters provides a great soundtrack to the hike.

This hike is popular, presumably because it isn’t too hard and provides a fantastic view of the Crawford Notch, as already mentioned.

As you can see from the photos, we got a pretty cloudy day - and though the fog was thick, we still managed some great views.  The wind was more bothersome, and we didn’t linger long.  Just long enough to soak it in and eat some lunch.  The cliffs are quite dramatic, and vertigo can set in if, like me, you have an aversion to heights.  I just kept a safe distance from the edge!

That's me in my Swift
A peaceful view from the captain's chair.

Little Hosmer Pond

Editor’s Note: Though this trip took place on August 15, 2016, and the post is time stamped to reflect this date, the actual writing of this post happened on August 23.

Recently, we acquired a pair of new canoes. After much research, pondering, head-scratching, and consultations, we decided to splurge on two Swift canoes. Baylah got a 12-foot Adirondack Pack Canoe and, being somewhat larger, I settled on a 14-foot Keewaydin Pack Canoe.  Admittedly, these aren’t the cheapest canoes you can get. However, they are super lightweight, which is really helpful in a number of contexts.  For one, it’s much easier to carry these boats around and put them on the top of our car for hauling.  Also, you can equip them with “yokes” and carry them on our backs, if we choose to take them out on a backpacking trip in the future.

Outside of Craftsbury, Vermont we found a great spot for an evening canoe to break in the Swifts. Little Hosmer Pond is a serene spot.  On the evening we were there, we didn’t see a single other person anywhere on the lake.  There is a convenient boat ramp for easy entry and parking.

The pond was still as glass and a joy to paddle on.  Though Baylah found rumors online of a loon population, we must have missed them.  Still, it was a great evening.  We had packed sandwiches (from Craftsbury General Store and were excellent!), but we found no place to beach so we ate in our boats.  The pond is surrounded, as far as we could tell, with private land, much of it marked “No Trespassing!” The boat ramp area has a bench where you can sit for a minute and was the only public place we saw.  It was a serene experience!

There is also Great Hosmer Pond, which is much narrower than Little Hosmer but also much longer.  We will have to come back and give that pond a ride!

Not bad for such a leisurely stroll.

Littleton from the top top the crags.

Kilburn Crags

Outside of Littleton, New Hampshire, and just a short drive from our Vermont HQ, is a pleasant path that leads to an ridge that has fantastic views of the town on Littleton.  On August 8, my wife and I ventured to the top of Kilburn Crags (there is handy map!) to catch this view.

As far as these things go, this was an easy hike.  The trail is wide and gradual the entire route.  There is about 540 feet of elevation gain and the out-and-back trip is about 2 miles long.  We took a leisurely pace and enjoyed the view for a good while - but we did not eat a meal on the route - which would have been nice.  The entire trip took us about an hour.  So - this is a great one if you have a dog in tow or kids who want to hike or you just want a quick, fairly easy hike, with nice views nonetheless.  We were also lucky because the weather was nice.

On Route 18 (also called St. Johnsbury Road) near its intersection with 135 (North Littleton Road) there is a small parking area with a handy sign for reference, though it is easy to drive right on past.

Though the sign says the route is .7 miles, my GPS suggested it is a bit longer.  Nevertheless, the 30 minute time prediction proved accurate - and that was with a bit of time soaking in the view at the top.

Somewhat oddly, the trip begins with a (recently, thank goodness) mowed path in a field next to a private house.  This short jaunt leads to the trail proper.  And I wondered if the guy who owns the house just mowed this for folks out the kindness of his heart.  I would have liked to donate some money to his gas fund!

The trail is well defined and rather easy going - wide, well-worn, and gradually up hill.  Nice way to travel if you can find it!

Finally, after a nice, well-shaded walk, you get to the crag, which is defined as a “steep or rugged cliff or rock face.” From there, you can see Littleton, New Hampshire sprawled out below.

Not bad for such a leisurely stroll! There is also a hand picnic table at the top, but we did not pack lunch.  Would be a great spot!  By the way, when you are done with the hike, you should head in to Littleton and reward yourself at Bishop’s Homemade Ice Cream - it is fantastic, and I personally highly recommend the cotton candy flavor. I know, it seems wrong, but trust me - fantastic!

And finally, here is a map of the hike as we did it:

A view on the way up. I think the road below is I-93. The trailhead is just a minute off of the highway.
A view from the top. Echo Lake is nestled in there. To the left is Mount Lafyette, one of the White Mountain’s 4K peaks.

The Day After Thanksgiving

I’m grateful for Thanksgiving, but what I really like is the day after Thanksgiving.

This day, there is nothing that must be done. Their is usually food leftover from the day before, so in the unlikely event that you do get hungry again, no problem. Everyone is recovering from the antics of the day before - cooking, eating, socialzing, arguing, drinking…etc.

So, the day after, you can do what you want. We went on a little hike up Bald Mountain, a short, easy hike in the northern White Mountains of New Hampshire.

Just off of I-93, right across from the Cannon Mountain ski area, you can quickly bop up to the top of Bald Mountain for some reaonably nice views. The payoff for the effort is quite high.

The hike up Bald Mountain has a modest stretch of rock scrambling, but it isn’t bad. It is very windy however, and you should be prepared to put on a jacket and hold on to your hat. After the peak, we came down and cruised over to Artist’s Bluff, which offers another nice view. After that, we turned back and returned to our car…a nice way to spend the day after Thanksgiving. Oh, and did I mention that after that, we ate pizza and drank excellent beer at Schilling in Littleton. Oh yeah, that was nice too.