Tuesday, June 30, 2015

Solved: The Mystery of the Red Fuzzy Cones

While hiking a couple of weeks ago, I came across this odd looking plant:

Tried as I might, I couldn't get Google to tell me what I was looking at. Surely those red fuzzy cone things are so distinctive that an identification should have been trivial.

This past weekend, at the end of our rafting trip, we took a big 'ol WWII Army truck back to our starting point. As we slowly crawled up the ravine towards our car, we passed a wall of raspberry bushes. And then it hit me: could those red cones I saw while hiking be hiding raspberries? I tried to get Google to confirm this, but had little luck. I did find this image, which was very promising.

Yesterday afternoon though, I finally solved the mystery. Check out what was growing along the W&OD trail:

To my eye, those are the same structure as my first set of photos, though now with the raspberries burst through. Who knew?

It boggles my mind that I've been noshing on wild raspberries my whole life and yet I've never seen them in their red-coned form before. Probably because I wasn't paying attention.

Monday, June 29, 2015

5 Geocaching Tips for the Beginner with Kids

Recently a friend and self described "not so outdoorsy mom" asked if Geocaching was for her and her daughter. My answer: absolutely! Here a few tips to try to make your first geocaching experiences as much fun as possible:

1. Keep an eye on the last time a cache was found. For beginners, you'll want a cache that was found within the last couple of weeks, if not sooner. After spending a couple of minutes looking for a cache you're going to think: aha, it's not here any more. That may be true, but if it was found recently, that's probably not the case. This cache is ideal because it was found yesterday:

Along with when the cache was found, check the comments for other feedback about how difficult the cache was. Though, don't read too much into any of this: I've been totally stumped on caches that others flagged as a "quick find."

2. Avoid caches that are surrounded by public activity. It's tempting to try finding caches that are close to home, say near a shopping center you park frequent all the time. The thing is, these caches survive because they are extremely well hidden. That's not to say you shouldn't try for them, I just wouldn't make them my first set of attempts. Our most recent treasure hunting expedition took us to Potomac Overlook Park and accessing the cache required hiking a couple hundred yards. This led to a cache that was kid friendly, requiring that you do little more than look under a log. This only works because the foot traffic through this was infrequent.

3. The GPS will get you close by, your geosense will get you the rest of the way there. To geocache, you'll need an app on your phone. I use c:geo on Android and it works well. Regardless of the app you use, the GPS on your phone will get you close to the cache itself. But it won't do all the work. Once you're in the neighborhood of the cache, you've got to use your other senses. The general strategy I use is to look for anything that seems out of place. Does that large rock seem like it belongs? Or why is that big chunk of bark leaning against the tree, just so. Another strategy: where would I hide something if I were looking to stash something in this area? Is there a hallow in the log or tree that would be a perfect hiding place? Don't forget to check the hint on the geocache entry and read the comments. More than anything else, just look for something that's just not right.

4. Avoid micro and nano caches. A micro and nano sized cache are going to be harder to find and they aren't going to contain any trinkets for you or your little one to take home. It's often tempting to go after these because they may be stashed near your home. See #2. Most caches we go after are "small" or larger, like this one:

5. Practice a take one, leave one, policy. When we do find a cache, I strive to always leave something if we plan to take something. So make sure you head out caching with a couple of goodies on your person. It doesn't need to be anything remotely fancy. I've left stickers, Play-Doh, coins (both foreign and domestic) and even a p51 can opener. The treasure we've found has never been worth more than a few cents. But it's treasure none the less, and the kids who we've gone geocaching with have treated the eraser, playmobile figure or coin for a foreign land as though it was as precious as can be.

Ultimately, not finding a cache is part of the experienc too and does make finally finding a cache all the sweeter. It took me at least three geocaching attempts before I finally found one, so don't be shocked if the same happens to you (though, I didn't follow the above advice).

So what are you waiting for? Sign up for the free membership over at geocaching.com, install the app on your phone, and go treasure hunting today!

Sunday, June 28, 2015

Riding the Rapids - A Harpers Ferry Rafting Adventure

Today's big adventure: riding the rapids in Harpers Ferry, WV. Shira arranged a rafting trip through Harpers Ferry Adventure Center. I'd been rafting a couple of times and had high hopes for the trip. For Shira and the rest of the group, this was their first time on whitewater.

My hunch is that the success of these trips are driven by two factors: how much water is on the river and how good your guide is. Without enough water volume, the rapids just don't exist. We lucked out on both accounts. Yesterday's full day of rain meant that today there was plenty of water. In fact, our guide judged that the Potomac was at around 8 feet, instead of its usual 2 feet, and that they won't run the trips when it hits 10 feet. In other words, we couldn't have asked for better conditions.

And our guide, Ian, was awesome. He kept things interesting, all while being in 100% full control. It's exactly what you want in a whitewater guide. He tell us he's been riding this river since he was 9 years old, and I believe it.

This was definitely my kind of adventure. I was only bummed that we couldn't explore Harpers Ferry more. The area was overflowing with Civil War history. Still, to have an activity that pleased everyone from a 5 year old to a sophomore in High School is no minor feat and one I'm thankful for.

All the photos of this trip were snapped with my Polaroid XS 100 Action Camera. It was the perfect camera for the trip, as I didn't need to worry about it getting wet or even losing it.

View Photos

Saturday, June 27, 2015

Camping at Point Lookout State Park

After a few days in a plush hotel I dragged Shira and J to Point Lookout Maryland State Park for some camping. The park promised a beach, birding and history and delivered on all fronts.

Our original plan was to stay at the park from from Thursday to Sunday. However, the full day of rain forecast for Saturday, caused us to trim the trip down to just Thursday night and Friday. Still, we packed a lot of adventure in this one overnight.

The first order of business was to setup camp. Our campsite (#144 in the Hoffman Loop) was perfect: a bit secluded, but an easy walk to the (very clean!) bathrooms. After that was taken care of, it was off to the beach. The beach, while not as flawless as Cumberland Island, was still quite nice. After the beach, it was back to the campsite for dinner.

We supplemented our usual hot-dogs and baked beans cooked over the fire with corn on the cob. Turns out, it's easy to make: just wrap the corn and a couple of tablespoons of water in a aluminum foil and toss in the fire for 20+ minutes. The results were quite tasty!

Thursday night, we had our traditional camping trip thunderstorm (a tradition I'd very much like to discard). The lighting was blinding, the thunder was booming, but no strike ever got within a mile of us, so there wasn't really anything to worry about. Friday morning the storm had cleared up and we a day of sun to explore the park.

Friday morning, after breakfast and the campsite had been cleaned up, we took a short hike through the marsh. The ospreys and herons active, giving me plenty of interesting photo ops. From there we made our way to the point itself and tried to explore the lighthouse. To Shira's relief, it was closed. I dragged J over to look at the pelicans and asked him what he saw. His reply: a shark. As I tried to explain to him how wrong he was, I saw the same fin he saw in the water. He wasn't crazy at all -- though it wasn't a shark was seeing, it was a stingray. It was an excellent find!

Next it was off to rent a canoe. Unfortunately, because of the impending storm they weren't renting. Oh well, we'll have to try again next time. We then hit the beach for more fun in the sun. I busted out our $20 Amazon raft and J and I had a heck of time playing with it.

As beach time turned into lunch time, I had one last request: could we go explore Fort Lincoln? The sign on the beach said it was a 1/4 of a mile away. Shira and J were up for it, so off we trudged. I was expecting to find a simple sign detailing the fort, but was instead greeted with the fort itself! (though the buildings are reconstructions). We were able to get into a number of the buildings, which was a nice bonus. From there, we followed signs to the Prison Pen and arrived at at the infamous Point Lookout Civil War Prison Of War Camp.

There's not a whole to see in the prison section, but what is there made quite an impact on me. They've got a section of wall reconstructed, and markers showing where the deadline was. Apparently, the origin of the word deadline goes back to the Civil War POW camps, and means what you think it means: prisoners who crossed this line could (or would?) be shot. Life was horrific in the camp and over 3000 inmates died there. There's an impressive monument to those lost that's visible as you enter Point Lookout State Park.

History, hiking, swimming and roasting marshmallows over the fire. What more could one possible ask for in a camping trip?

Wednesday, June 24, 2015

Lancaster Adventure, Day 3

With Dutch Wonderland behind us, we had a full day to explore the rest of the Lancaster Area. We started with the Turkey Hill Experience. This is your chance to not only learn more about ice cream than you've ever wanted to know, but you'll hit the lab and make your own ice cream creation.

My custom flavor: mint ice cream with peanuts, chocolate chips and sprinkles with peanut butter and cake batter mixed in. It was delicious, if I do say so myself. The lab experience was actually pretty cool. Consider that I put 5 drops of mint (yes, drops) in my pint of vanilla ice cream and ended up with mint flavored ice cream; it was like magic. The non-lab parts of the experience were interesting too, with plenty of interactive exhibits for the kids to play with (though, to get the most of the exhibits you needed to be an older kid). And really, the kids mostly just loved the ball pit.

The main gotcha with the Turkey Hill Experience is that when you're done with the lab experience, you're handed a pint of ice cream and told that if you can't get it to a freezer in 15 minutes, you should just eat it now. Which is crazy, and yes, I consumed my entire pint of ice cream (plus some of Shira's and J's). Yikes! They didn't even provide a good setting to enjoy your treat in; we just picked a bench among the exhibits and chowed down.

At a minimum, they should have allowed us to continue to "harden" (remain in the super cold freezer) the ice cream while we walked around for 30 ~ 45 minutes checking out the exhibits. For bonus points, they should have sold us a freezer friendly bag with a re-usable ice pack to give us a chance to enjoy the ice cream later in the day or something. Otherwise, it's a bit ridiculous to expect people to effectively throw out the ice cream they just spent time and money creating.

But I digress. Everyone really did enjoy the experience and I won't look at a tub of Turkey Hill ice cream the same way again.

After the Experience we made our way across the area to the Kitchen Kettle Village. This cluster of shops is easy to write off as a tourist trap, but we enjoyed it. The Jam and Relish store was a fun one, with dozens of samples to try. Perhaps I should have read the label *before* I gave J a sample of the Mango and Habenero jelly. Oh well, live and learn. Definitely lots of unique things to try here. Also on the site is a tiny petting zoo (perhaps 10 animals in total) and playground, which J really liked and didn't cost a cent.

From there, we made our way back to Abe's Buggy Rides, where we did the touristy thing and took an Amish Buggy Ride. It was actually quite enjoyable, and a wonderful way to see the country side. We passed a number of Amish Farms, which exclusively use horses to plow their fields; talk about old school. Abe's also had some goats, chickens, turkeys and horses for J to oggle, which combined with the playground, made for an easy place to wait for our turn to ride in a buggy.

We had planned to do something train related while we were in Lancaster. Though, we didn't think we had quite the time or energy to tackle the Railway Musuem. Instead, we opted to visit the Choo Choo Barn to get our railway fix. The Choo Choo Barn is a massive and extremely detailed model train layout. That description hardly does it justice. You walk through this room and see dozens of scenes, mostly modeling the Lancaster area, ranging from an Amish barn raising to a zoo, to Dutch Wonderland. Not only are there trains running through the scenes, but the scenes contain "animations" which give life to the layout. Some scenes are remarkably complex, like the house on fire which ends with the fire department putting out the blaze, to the simple, like the accidentally opened out-house door. J and I were impressed and took two laps around the room. Shira wasn't as moved by the whole experience, impressed, but once around was fine for my non-musuem loving wife.

We finished up the evening with pizza and one last trip to the pool. Definitely a fun day, and I'm confident we'll all sleep well tonight!

View Photos

Tuesday, June 23, 2015

Lancaster Adventure, Day 2

After a fun preview of Dutch Wonderland on Sunday evening, we dedicated all of Monday to visiting the park. Our first priority was to hit the water section of the park, which includes one raft/slide ride and a large sprayground. The kids (and adults) thoroughly enjoyed both parts. J especially enjoyed the sprayground, specifically turning the wheel that triggered a deluge of water on some unsuspecting victim.

After water time, we hit Merlin's Restaurant for lunch. While the food was good, the service was downright impressive. Every request we made was met with a "sure, no problem." I know I shouldn't be shocked by this, but it was nice none the less.

After lunch we walked the park hitting rides and attractions we hadn't seen the night before. We watched a diving show which everyone enjoyed, took the train and monorail and hit the Merry-Go-Round a few times. J loved driving the remote controlled boats, the bumper cars, the log flume and the Silo Slide (a slide wrapped around a simulated farm silo). By 4pm we were all pretty wiped and called it a day.

Overall, Dutch Wonderland was a hit for the kids. It definitely feels a bit Old School when compared to Disney. But the smaller park size really works for the 3~5 year old age group. Essentially, everything in the park seems targeted to this age group. Older kids will find stuff to go on, but by 8 or 9 years old, they seem outside the target demographic.

After the park we found our way to Noodle King in Downtown Lancaster for dinner. J insisted on eating his Pho with chopsticks, which was amusing but at times a little on the slow side. What, with consuming one noodle at a time and all. But he was a good sport and even though this wasn't exactly the pasta he was used to, he ate up.

View Photos

Monday, June 22, 2015

Lancaster Adventure, Day 1

We're one day into a week of summer vacation fun. Unlike most of our vacations, we aren't flying off to some exotic locale. In fact, I'm typing up this post a mere 2 hours from home. But as anyone who's ever been to Lancaster, PA will tell you, this place is worlds away from the hustle and bustle. But I'm getting ahead of myself.

Yesterday, Shira needed to step away for a few hours, leaving me and our friend's 5 year old, J, to fend for ourselves. After wrestling with the question of how we should best use our 9:30am free time on a Sunday, I decided to go with an oldie but a goodie: treasure hunting.

We hit Potomac Overlook Park for a little geocaching. There are three caches in the area, and our route took us near all three. In the end, we only found two of them because we ran out of time. Both caches were just hidden enough that they weren't obvious, yet J was able to discover each of them. And both caches had a few little goodies in them, meaning that we could walk away with some treasure. The Donaldson Run trail in Potomac Overlook Park is one of my favorite hikes in Arlington, as you're required to make a number of stream crossings. I'm quite thankful I wore my water shoes, allowing J to hop from stone to stone, while I tromped along in the water next to him making sure he didn't end up on his tush. Good times.

After that, our vacation really began! We made our way to Lancaster, PA and met up with friends. The main attraction: Dutch Wonderland, and old school amusement park that's ideal for J and our friend's 4 year old, A.

Anyone who knows me, knows I'm not the biggest fan of amusements parks. I could probably make up some highbrow reason, but really, I'm just too scared of the rides. But even I have to admit, this place is perfect for the kids. Dutch Wonderland has a policy that allows you to visit the park for the last 3 hours the day before a full visit. This preview option is truly fantastic: the kids got to experiment with almost every ride, and the parents got to get a lay of the land to know what supplies we'll need for main day.

The kids loved everything they rode, with the log flume and roller coasters being top choices. J even went on the big coaster with Shira. And I got to offer my services as bag holder and photographer, which let me feel as though I was contributing.

Day 1 was a huge success. With a full day of playing at Dutch Wonderland ahead of us, I expect Day 2 to follow suit!

View Photos

Friday, June 19, 2015

Pocket Dump, Summer of 2015 Edition

Yesterday I was commenting on a post, and wanted to link to my pocket dump when I realized the most recent one I had was from 2013. Yikes! That won't do. Here's what was in my pockets this morning:

Not shown in is my Galaxy S5, with $20 stashed inside the hard case.

Starting in the top left hand corner and going clockwise...

  • CPR essentials - A CPR mask and pair of gloves shmooshed between two business cards. The gloves are pretty handy, and the mask is what we use during CPR training. This is one of the last items I put in my pockets, and I've considered dropping it. But man, what if I needed it? I'd kick myself something fearsome for not having it.
  • Binder Clip Wallet - I started this habit while traveling (assuming that my wallet would be taken, but not these front pocket items) and I've grown to very much like it. Now I can grab this binder clip worth of goodies and my tool keychain, and I've got my essentials covered.
  • Wallet - A sort of dummy wallet. All my real valuables are in the binder clip. The wallet ends up being a proving ground for possible items to carry. Right now it has: a few paper clips, a few small safety pins, a few bandaids, a couple of sheets of toilet paper, a folded up plastic produce bag, a Fresnel lens, a few Spiderman stickers and a (very useful) Ikea paper tape measure. It also contains a few important looking, but totally useless cards. Oh, sometimes it even contains a little cash. Ironically, it's one of the first things I leave at home when I don't have enough pocket space.
  • Notepad - I've been carrying this $1.50 version for years, and expect to do so for years to come.
  • Handkerchief - Thanks to a frequently runny nose, this is my most used item. Seriously, I feel absolutely naked without one in my pocket.
  • Car keys - Car keys and a Res-Q-Me tool. Yet another nod to general preparedness.
  • Pilot G2 Pen
  • Schrade Tactical Pen - My preferred carry-everywhere self defense option.
  • Tool Keychain:
    • Silva Metro Compass - I'd love to have a smaller compass on my keychain, but this one is so responsive that it has earned its place . With smaller compasses I found I'd have to play the tap-tap game to try to make sure it was pointing the right direction. Not so with the Metro; I take it out, look at it, and I'm done.
    • House key - a key on a key chain, what a novel idea?
    • Derma-Safe blade - still my "knife" of choice for carrying every day. Super sharp and goes everywhere.
    • P-51 Can Opener - still my multi-tool of choice. Recent uses: as a screw driver, scraper and as a trinket to leave in a Geocache. Try that with your $90 multi-tool. I've tried various methods for keeping the blade closed on the P-51. My preferred method: slip a large'ish paper clip over the whole can opener. It's not a perfect fit, but it's effective and you get a bonus useful tool: a paper clip.
    • A Titanium Nitcore NWS 10 Whistle - Yes, this was a splurge, but it really is light and compact. I'm a big fan of whistles, so I was confident that I'd want one on my key chain and thought it was a worthy investment.
    • Kingston Mcro SD Card Reader and Spare Micro SD Card - this serves as a thumb drive, document storage, software toolkit, backup memory card for my camera, backup memory card for my cell phone and USB reader for my camera's SD card. For the few bucks this guy costs, he does a heck of a lot. I used to carry the eLargo version, but this Kingston one is a little smaller and more robust. Yes, we live in a network based world, but when that network isn't available, this guy is invaluable.
    • Pill Containers - These hold important meds for me and Shira. So valuable.
    • Photo Microlight - still my favorite little flashlight. It's tiny, bright and reliable.

So there you go, my pocket contents. It's always interesting to see how it's changed and stayed the same.

What's in your pockets these days?

Thursday, June 18, 2015

5 Photo Habits To Try, and 2 To Just Do

1. Try: Switch the auto-focus trigger from a half-way shutter press to the star button on the back of the camera. Why? It's what thepros do. Source.

2. Try: Intentionally select the center focus zone and purposely center you subjects. A little cropping after the fact allows you to vary the composition. Why? This tip was suggested in a video about shooting action related subjects. By picking a single zone, you apparently reduce auto focus time. Related to this is walk through the camera settings and make sure anything that's going to slow down focus is disabled. Source.

3. Try: Set the camera to Auto-ISO before turning it off. Why? I've already learned the value of leaving your camera with sane settings, allowing you you to turn it on and get an impromptu shot. However, I usually avoid Auto ISO. I think it's worth a try to make it the default option. That way the camera has one more degree of freedom for capturing an ideal exposure. Source

4. Try: Rent a high end lens or exotic camera body. Why: Uh, why not? I know renting gear is standard pre-purchasing advice, but I've never found a good source for doing such a rental. I'm seeing ads all over the place for borrowlenses.com (kudos to their marketing dept!) and their prices seem downright cheap to me. How else would I ever get to play with a $1,500 lens or a see if that smaller-yet-more-expensive camera is really worth it. Heck, a gift certificate to rent some gear seems like it would be the perfect gift for the photographer in your life. Let them do the equivalent of driving a Ferrari for a weekend - who wouldn't love that? Source.

5. Try: Use a space blanket to create a fill light reflector. Why? Flexible reflectors are a well known way of tweaking lighting that's cheap and effective. Yet, I've never been able to bring myself to invest in a folding reflector for fear that it would just a piece of gear lying around. But utilizing a $2.00 mylar blanket seems like an absolute no brainer. I usually have one in my bag anyway, I can't believe I've never thought of putting it to use in a photographic context before. Source and Source.

And a couple items that have gone from things to Try to things to Do.

6. Do: Use the various metering modes on your cell phone camera. Why? I always seem to forget that I've got the option of spot metering with my cell phone. That strikes me as a pretty advanced option for a cell phone camera and so I never expect to have access to it. But my Galaxy S5 offers it, along with exposure compensation and ISO selection. Amazing. I've just got to remember to use these settings (oh, and turn off HDR, so these settings are even available to you).

7. Do: On a regular basis, do a full settings audit on all your cameras and gear. Why? A few weeks back I realized I was shooting on the lowest quality setting from my camera phone. When did it get changed? How did it get changed? Who knows. But I know that I kicked myself for going so long without checking to make sure all the settings were sane. This is especially important for the DSLR world where you may initially written off a feature, and after a few months, be ready to embrace (or disable) said feature.

Wednesday, June 17, 2015

Gardening Progress: A First Harvest

I see a handful of green tomatoes on the vine and couple of peppers which look like they'll be ready to pick any day. But our first official harvest was these guys:

That's right, cut flowers from the cosmo seeds we planted. They were, in fact, the first thing we put in the ground (technically, in a container) this season. And despite the fact that they were planted with some random, inappropriate potting soil, they still managed to grow and thrive. Life just wants to live.

I was initially a little disappointed that our first harvest wasn't some tasty or esoteric vegetable. But I've since grown to very much like the idea of having pretty flowers sitting on the table that we grew ourselves, rather than bought from the supermarket. So there, take that my utilitarian self.

Other bits of gardening excitement:

The purslane I planted in a small container after our original crop got trampled is showing signs of life:

The sweet potato I dropped in the ground is also thriving. Who knew that the potato you've let sit too long on your counter is all you need to start growing your own potatoes?

Mostly I'm just keeping my eye on the tomatoes, peppers and such. They are looking healthy and I hope relatively soon will be ready for a harvest. Then we'll actually be eating some of the stuff from our garden, rather than just photographing it!

Tuesday, June 16, 2015

Gotcha of the Day: Fedora 22 Upgrade Breaks Touchpad, Triggers Hissy Fit

A few weeks back, essentially on a whim, I upgraded my Linux laptop from Fedora 21 to Fedora 22. The process was as easy as running a few commands, including the well named FedUp. The upgrade seemed to go well; though I didn't really notice any changes in my Linux experience. That is until the touch pad on my laptop stopped working.

At first the touch pad just behaved oddly: acting like a scroll wheel on some pages, or like the mouse pointer was stuck in mud. I wasn't sure if I was looking at a Firefox issue, a Fedora issue or a hardware issue. But after recalling the original touchpad issues I had (setting Clickpad=1 saved the day), I realized I was almost certainly dealing with a Fedora 22 incompatibility.

My first response was to curse Fedora. Ugh, how could it manage to break something as fundamental as my touchpad! But then I went to work debugging the problem.

My first attempt at Googling took me to some advice regarding the use of libinput in Fedora 22. The recommendation was to copy /usr/share/X11/xorg.conf.d/50-synaptics.conf to /usr/share/X11/xorg.conf.d/99-synaptics.conf so it would be loaded after 90-libinput.conf. At this point I was groping blindly, not sure what libinput versus synaptics was all about. Of course, this didn't address my problem.

Diving further into the problem I learned that I could run the xinput command and get a list of all the input devices in my system:

 Virtual core pointer                     id=2 [master pointer  (3)]
    ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
    ↳ ELAN Touchscreen                         id=11 [slave  pointer  (2)]
    ↳ MSFT0001:00 06CB:75BD UNKNOWN            id=12 [slave  pointer  (2)]
 Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Power Button                             id=8 [slave  keyboard (3)]
    ↳ Sleep Button                             id=9 [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD                     id=10 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=13 [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                         id=14 [slave  keyboard (3)]

Aha! Fedora 22 wasn't recognizing my touchpad as a meaningful device. I Googled around for MSFT0001:00 and found some useful leads. I went ahead and followed the fix here, creating a blacklist.conf and disabling a particular module.

I rebooted and that left me worse off than before: now the mouse was totally dead.

By now I was downright angry. This is so typical Linux. Here I am trying to be a poweruser, and instead I'm stuck researching low level system internals in the hopes that I can get the most basic of hardware to function.

I decide to put the problem away and leave it for another day. Though before I did, I decide to run a yum upgrade. I've got yum upgrade -y setup to run nightly, so the system should already be up to date. But I figured it wouldn't hurt to double check.

And sure enough, yum reported that there were dozens (if not hundreds) of programs on the system that needed an upgrade. When I tried to run this upgrade it failed with this error:

...
Total download size: 245 k
Downloading Packages:
[SKIPPED] fontconfig-2.11.93-2.fc22_2.11.94-1.fc22.i686.drpm: Already downloaded                                                                                                                

/var/cache/dnf/x86_64/22/updates/packages/fontconfig-2.11.93-2.fc22_2.11.94-1.fc22.i686.drpm: md5 mismatch of result
fontconfig-2.11.94-1.fc22.i686: Delta RPM rebuild failed
fontconfig-2.11.94-1.fc22.i686.rpm                                                 

Delta RPMs reduced 0.2 MB of updates to 0.4 MB (-47.1% saved)
Running transaction check
Transaction check succeeded.
Running transaction test
Error: Transaction check error:
  file /usr/share/fontconfig/conf.avail/10-scale-bitmap-fonts.conf from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/doc/fontconfig/README from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/doc/fontconfig/fontconfig-user.html from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/doc/fontconfig/fontconfig-user.txt from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/man/man1/fc-query.1.gz from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/man/man1/fc-scan.1.gz from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64
  file /usr/share/man/man5/fonts-conf.5.gz from install of fontconfig-2.11.94-1.fc22.i686 conflicts with file from package fontconfig-2.11.93-2.fc22.x86_64

And now it started to make sense: there was a package that was keeping yum from performing the rest of the system upgrade. Included in that upgrade may have been some code to make my trackpad work. I ran the command:

 sudo yum upgrade --exclude=fontconfig

and the system finally went to work downloading and installing the massive update. Once completed, I rebooted for good measure and sure enough, my touchpad was back to working! Incidentally, my touchpad device is still identified as MSFT0001:00 06CB:75BD UNKNOWN and dmesg still reports:

[    0.000000] ACPI: MCFG 0x00000000DAC5C850 00003C (v01 DELL   QA09     01072009 MSFT 00000097)
[   19.275100] i2c_hid i2c-MSFT0001:00: failed to retrieve report from device.
[   19.282697] i2c_hid i2c-MSFT0001:00: failed to retrieve report from device.
[   19.283481] i2c_hid i2c-MSFT0001:00: failed to retrieve report from device.
[   19.284193] i2c_hid i2c-MSFT0001:00: failed to retrieve report from device.
[   19.284980] i2c_hid i2c-MSFT0001:00: failed to retrieve report from device.
[   19.285045] input: MSFT0001:00 06CB:75BD UNKNOWN as /devices/pci0000:00/INT33C3:00/i2c-7/i2c-MSFT0001:00/0018:06CB:75BD.0002/input/input9
[   19.285192] hid-multitouch 0018:06CB:75BD.0002: input,hidraw1: <UNKNOWN> HID v1.00 Mouse [MSFT0001:00 06CB:75BD] on 

But those errors are apparently not show stoppers.

I debugged the issue with fontconfig by noting that I had 3 copies of the package installed:

$ rpm -qa|grep fontconfig
fontconfig-2.11.94-1.fc22.x86_64
fontconfig-2.11.93-2.fc22.i686
fontconfig-2.11.93-2.fc22.x86_64

I removed one of them:

$ sudo rpm -e fontconfig-2.11.94

and now yum was properly able to upgrade fontconfig.

My Linux box is back to functioning and I'm back to thinking, hmmmm that wasn't so bad. Heck, that was better than an Internet Explorer Has Stopped Working error or a Blue Screen of Death.

Monday, June 15, 2015

Caption Me: Weekend Wildlife Edition

Cheer up grumpy toad (or frog?), your lunch is right behind you.

Looks Great and I Can Eat It? What's Not To Love?

Man, I'm having a serious case of the Baader-Meinhof's1 with this lovely flower:

I saw this guy last Friday on the Potomac Heritage Trail. And after snapping a few photos and thinking just how exotic it looked, I started seeing his cousins all over the place. During a weekend run I caught glimpses of these guys everywhere; from front yards to medians to everywhere in between.

My hunch, based almost exclusively on the delightful and powerful poem The Lion and Lily by Elizabeth Spires, was that this was a lily I was photographing. And a quick Google Search showed I was mostly right: I was looking at a Daylily, which apparently is unrelated to the true lily.

Daylily's have an awful going for them: they are, as the photo above suggests, gorgeous. They're also quite robust surving both drought and frost conditions. If that weren't enough, they're also fully edible, with reports of being quite tasty.

Alas, the plant isn't without some controversy: first, the thousands of variations that have been created have led to some doubt as to whether daylily's should be eaten. Second, the plant is so robust that it can pop up where folks don't want it, leading some to classify it as "weedy" or invasive. I should be so lucky to have such weeds in my yard!

All I know is that next time I pass a wild daylily, I'm going to have to snack on a few of the flowers. That is after I get a few photos. Now there's a plant that provides!

1From this page: "Baader-Meinhof is the phenomenon where one happens upon some obscure piece of information--often an unfamiliar word or name--and soon afterwards encounters the same subject again, often repeatedly." I've always heard of this referred to as selective perception.

Friday, June 12, 2015

Oven Dried Strawberries - A Tasty Fix for Too Many Berries and Not Enough Time To Use 'Em

Last weekend we went strawberry picking, and it was good times. But now the race is on: use the strawberries or watch our hard work wither away. While browsing a post on dehydrating tomatoes, it occurred to me: why not dry some strawberries? Turns out, all you need is your oven and a bunch of time. This article explains it all.

Though, there's isn't much to explain: slice, spread, "bake" for 3 hours at 200 degrees, take out, enjoy. (OK, there's a little more to that. Go read the article.)

I've got to say, the experiment went well. The process was not hard to do and the resulting strawberries are tasty. Well, maybe not as tasty as fresh strawberries, but still a yummy snack and infinitely better than throwing out moldy strawberries. The only catch: all my drying produced the tiniest Tupperware container full of berries.

Drying: it's the new freezing.

Thursday, June 11, 2015

Ebert on Anime

There's something powerful about Roger Ebert's review of Grave of The Fireflies. He actually covers quite a few topics in the eight and half minute piece: how animation can tell a more real story than live actors, how the (apparently) more crude looking Anime is just as powerful as the most technically advanced Hollywood animated flicks, what the heck a Pillow Scene is and more. Heck, he touches on what the role of art is. Most importantly, he manages to introduce you to a form of film you'd likely dismiss, all without coming across as preachy or holier than thou.

The film itself is considered one of those have to watch it once type of movies. Gut wrenching, but supposedly worth it. I'm not sure I'm signing myself up so quickly for that experience. (That's how I felt about A Beautiful Mind - so glad I saw it; never again). But watching the review is a no-brainer. You can consider it your art lesson for the day.

View Video

Bye Bye Zend GData, Hello Custom PHP Google Spreadsheets API Access

For years now I've been leveraging the Google Spreadsheets API from within PHP. And while I was never a huge fan of it, the Zend GData code took care of the nitty gritty details that went into interacting with Google's API. That was until a few weeks ago when Google finally retired their non-OAuth based authentication, leaving Zend users apparently out of luck.

I poked around for an updated API option, but really didn't find one that appealed to me. Besides, I've been using this for years, I had a pretty solid idea of what my dream API would look like. So I give you my latest creation: google_sheets.php (and the accompanying google_auth.php). My goal was to create a simple Google Spreadsheet API that made accessing and updating a list-based document as painless as possible.

Here's how it all works.

First, there's the matter of authentication. I've tried to streamline this as much as possible, but there's still a few things you're going to need to do get this all up and running. You'll want to follow the instructions here and note the client ID and client secret you've setup. Then you'll need to arrange to invoke a couple of methods on the GoogleAuth class. I threw together this trivial PHP script to setup authentication:

<?php
require_once('../lib/google_sheets.php');
header("Content-Type: text/plain");

$ctx = array('client_id'      => 'XXXXXXXXXX',
             'client_secret'  => 'XXXXXXXXXX',
             'auth_file'      => __DIR__ . '/sheets.access');
$api = new GoogleSheets($ctx);

if(isset($_GET['c']));
  var_dump($api->auth->complete_auth($_GET['c']));
} else {
  echo $api->auth->start_auth();
}

?>

If you invoke this script without a URL parameter named c, it should respond with a URL you can copy and paste into your browser. This will grant access to the app from whichever Google Account you're logged in as. Once you've agreed to the permissions on the app you'll get a code. You can then hit the above script again with ?c=CODE where CODE is the value that were shown in your browser. Once you do this, the authentication data is saved in whatever file you set as auth_file. The GoogleSheets code will refresh the authentication as needed, so you can essentially discard the above script after you've successfully called $api->auth>complete_auth(...).

For more info on authentication check out my curl based experimentation over here. This code is written in a Google Drive context, which matches up well with the Google Sheets API. In fact, I used the shell scripts in that post to debug my PHP code.

After authenticating the real fun can begin.

The GoogleSheets object contains these high level functions:

  1. $api->rows($doc_id, $worksheet_name) - return an array of all rows of a worksheet for a given spreadsheet .
  2. $api->map($doc_id, $worksheet_name, $fn) - the classic map function: evaluate $fn for each row of a worksheet within a spreadsheet.
  3. $api->walk($doc_id, $worksheet_name, $fn) - like map with two twists: (a) it doesn't return a value, (b) if you return an array from within $fn, it treats that data as an updated version of the record. It then saves this record back to the spreadsheet.
  4. $api->reduce($doc_id, $worksheet_name, $fn, $init) - the classic fold function: calls $fn for each row of a worksheet it passes a carry value, the row and the underlying XML representation of the document. Using this method I was able to implement all of the above functions. This is the low level interface to the API.

A few conventions worth noting: $doc_id is the that big, ugly, unique identifier in the URL of your document. You can't miss it. $worksheet_name is the human readable name of the worksheet you want to work with. Internally this is converted to a unique identifier, but I've found it much easier to work with the names in the spreadsheet itself. A 'row' is represented as an associative array of column names and values.

OK, enough talk, let's see some code. Assuming that we want to work with the spreadsheet found here: the $doc_id would be 1WOflWqDRpRtvVwWdJi1-XxA6_ePW_uAtpkg9j80uUj8 and the worksheet name would be People.

<?php
/*
 * A PHP file for testing stuff out
 */
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

header("Content-Type: text/plain");
require_once('../shared/lib/google_sheets.php');

$ctx = array('client_id'      => 'XXXXXXXXXXXXXXXX',
             'client_secret'  => 'XXXXXXXXXXXXXXXX',
             'auth_file'      => '/XXXXXXXXXXXXXXXX');

$api = new GoogleSheets($ctx);

$api->walk('1WOflWqDRpRtvVwWdJi1-XxA6_ePW_uAtpkg9j80uUj8', 'People',
           function($row) {
             echo strtoupper($row['name']) . ": " . rand(100,999) . '-' . $row['phone'] . "\n";
           });

$api->walk('1WOflWqDRpRtvVwWdJi1-XxA6_ePW_uAtpkg9j80uUj8', 'People',
           function($row) {
             $row['luckynumber'] = rand(1000,9999);
             return $row;
           });

echo "\n";

$sum = array_sum($api->map('1WOflWqDRpRtvVwWdJi1-XxA6_ePW_uAtpkg9j80uUj8', 'People',
                           function($row) {
                             return $row['luckynumber'];
                           }));
echo "Sum = $sum (via array_sum)\n\n";

$sum = $api->reduce('1WOflWqDRpRtvVwWdJi1-XxA6_ePW_uAtpkg9j80uUj8', 'People',
                    function($carry, $row) {
                      return $carry + $row['luckynumber'];
                    }, 0);

echo "Sum = $sum (via reduce)\n\n";
?>

The above code performs three operations:

  • A walk to output the name and phone field, showing how you can access individual fields
  • A walk to generate and store a new lucky number for each row
  • A map and reduce to demonstrate two methods for extracting and manipulating data in PHP

So there you have it. If you need access to Google Spreadsheets from PHP, feel free to grab the code and hack away!

Tuesday, June 09, 2015

The Dark Sky Finder

On my TODO list is to grab some night sky pictures. The tricky part is finding an area which is dark enough to support this kind of photography.

Luckily, there's Dark Sky Finder to help. As the name suggests, it provides a map that estimates where such a photo friendly spot my live. In our case, it seems like about a 45 minute drive is all its going to take.

The rest of the setup seems pretty basic. Now I just need the weather and a willing wife!

Via: PhotoJojo

Monday, June 08, 2015

Better Gardening Through Chemistry

Problem #1: Squirrels

I cleverly voted for tucking in one of our raised bed gardens right up against our property line and neighbor's fence:

Not only would it maximize our lawn space, but as a number of YouTube videos had suggested, the fence could be handy for securing taller plants. We added a chicken wire fence to keep out bunnies and the neighborhood kids. But there's one flaw we hadn't anticipated: the squirrels love the fence. They're happy to traverse it as easily as climbing stairs. So all our chicken wire is for naught. We've had a number of plants get burrowed into, and we're reasonably confident we've got squirrels to blame.

I cracked open my paper version of 1001 All-natural Secrets to a Pest-free Property to see what the author suggested. Apparently, hot sauce is the way to go. I mixed up a batch of the following cocktail: 1 quart boiling water, 2 tbsp. cayenne pepper and 1/2 tsp. of Tabasco Sauce. I let it all cool and ended up with this yummy mixture:

For my first attempt, I filled up a spray bottle with the stuff. However, after a squirt or two I completely clogged up the nozzle. This stuff is way to chunky for the recycled Windex Bottle I was using. I resorted to just splashing it on from a water bottle.

Will it work? Who knows. But I'm comfortable that a dash of canyenne pepper will do minimal damage to the plants, so that's a good thing. The last thing I need is a cure more dangerous than the disease.

Problem #2: Mystery Mold!

Last week we had like 4 straight days of rain and overcast skies. After the deluge we noticed that some of the soil in the X-Garden had a white glaze to it:

It's possible that this stuff isn't actually a bad thing. But with my luck, it is. A while back my brother had passed me an article on use of Hydrogen Peroxide, and in my research on dealing with mold, I kept seeing it mentioned as a cure. What the heck, why not give it a try, right?

I mixed up a batch of 1 cup water to 3 tsp. of 3% Hydrogen Peroxide and gave part of the X-Garden a good spray. I checked on it today and it didn't look like there was a huge change. But that's probably a good thing. I may step up the dosage if there's no effect in another few days.

Other good signs in the garden: this guy (or a sibling of his) is still with us:

and the first tiny sprouts of blue flax have appeared in our Tea Garden. No sign of the actual tea plant yet.

Friday, June 05, 2015

One Holy Bug

I caught, what appears to me, to be a praying mantis crawling on one of our sunflowers. Apparently, praying mantises (or manti?) are an ideal garden insect as they love to feast on other more harmful insects. Plus, they're fun to photograph.

Let's hope he grows up, marries and has lots and lots of little babies.

Thursday, June 04, 2015

Name that Plant: Yellow Flowers and Super Soft Leaves

During an afternoon stroll I came across this guy:

It's hard to appreciate from the photos, but the leaves are super soft. More like decorative felt than normal leaf type material. It reminded me of lamb's ear, but I didn't recall seeing lamb's ear growing so tall.

That's because it's not lamb's ear. A quick Google Images Search set me straight: it's wild mullein. Another mystery solved: first year mullein grows as a rosette on the ground, whereas second year mullein grows in to a tall plant. That explains the two varieties I spotted growing.

While mullein is categorized as a weed, it actually has quite a few uses, including: as a medicinal tea, for primitive fishing and for primitive fire starting. And the most important use: as emergency backwoods toilet paper.

I'm coming to appreciate that weed is just another word for "grows really, really easily." Which I usually like in a plant.

Next time I see some mullein I'll have to try to harvest some of the leaves for tea. It's got to taste better than the "tea" I picked up in Japan.

Wednesday, June 03, 2015

An NFC Based Audit Log, Adventures In Overengineer A Garden Notebook

I want to do a better job of tracking garden activities. Sure, I could pick up a $1.75 notebook at the store, but I lose all the niceties that go with having a digital copy of the data. Besides, there's actually an interesting problem to solve here: how do you associate an audit log with a physical object? Ideally an audit log is write-only, automatically timestamped and has minimal opportunities for user error. While my garden ramblings hardly require this level of sophistication, it would be nice to work out a solution to this problem. Once I had one, I could keep logs of all sorts of physical items (I'm looking at you furnace, with your filters that need to be changed yearly...).

OK, let's over-engineer a solution!

My first thought was to print out some QR Codes, and leverage that technology. The QR Code, in theory, would help me avoid human error associated with matching my notes up with the right object (i.e., plant). But why stop there? How awesome would it be to slap NFC tags on the my plants (or really, their containers) and use that to identify them.

The NFC tag could serve two purposes: first, it would kick off the log entry process and second, it would uniquely identify that plant I'm making notes about.

I ordered 10 NFC stickers from eBay. If all goes well, they'll be waterproof and simple to attach to the containers or a popsicle stick. With the easy part out of the way, I now needed to figure out a crafty way to make these NFC tags actually do something.

Enter Tasker.

I already use Tasker and NFC tags in our laundry room, so I know kicking off a Task is no big deal. The next ingredient: taking note input from the user. This, too, is easy to do in tasker. Just invoke the Variable Query action. It's ugly, but totally effective.

Moving on, I needed to figure out where I was going to store these entered notes. My ideal solution was to have it appended to a Google Spreadsheet of my choice. I imagined having to work out Google Authentication from within Tasker and figured I'd have to lower my sights a bit. Perhaps Tasker could write to a text file and FolderSync could push these files to the web. Still, I figured it wouldn't hurt to Google around for a Spreadsheet solution.

And what do you know, it's easy to do! Using a Google Form, you can trivially post data to a spreadsheet. I developed a quick form that looks like so:

I then used an HTTP POST action from within Tasker to submit this form. The results are timestamped rows, which is exactly what I was after.

I was almost there. I had my notes and place to store them, I was now missing the NFC Serial Number to associate my notes with the object. Unfortunately, there's no obvious way to get the NFC Serial Number from within Tasker. On to Plan B. Each NFC Tag is setup with Tasker as its own Profile. I can name these profiles and using %caller2, I'm able to access this name. In some respects, using the Profile name is even better than the NFC Tag, as the name is under my control (versus being a random alphanumeric string).

The solution is built! Let's test it out. Consider a test tag setup in Tasker:

When I hover my phone over my test tag I get the following prompt:

After I hit submit, my Google Spreadsheet auto updates with this information:

As solutions go, there's no denying this is clunky, but it precisely meets my needs. Setting up a new tag should be fast (New Profile; Scan Tag; Name Profile; Done) and using them should be even faster (Scan; Type; Done). Google Spreasheets even has improved filter capability. This means that I can look at a season's worth of planting data, or just the detail of one plant, with ease.

There you have it: a write-only, auto-timestamped, idiot-proof solution to tracking notes associated with an object.

I'll truly know this works when the NFC stickers arrive. In the meantime, I may splurge and implement this same capability with QR Codes. The code for the Post Notes Task is below. Happy Hacking!

Profile: Test Tag (51)
    State: Locale NFC Plugin [ Configuration:C26745C6 - repetitive ]
Enter: Post Notes (47)
    Abort Existing Task
    A1: Variable Set [ Name:%src To:%caller1 ] 
    A2: Variable Split [ Name:%src Splitter:: ] 
    A3: Variable Query [ Title:Notes Variable:%notes Input Type:Normal Text ] 
    A4: HTTP Post [ Server:Port:https://docs.google.com
                    Path:/forms/d/1qVh0HbYKXal25c8VCm_ov9GFFsYx6D0bSsp2GpFdMfI/formResponse
                    Data:entry.1657698255=%src2
                         entry.1862053229=%notes
                     Content Type:application/x-www-form-urlencoded ] 
    A5: Vibrate Pattern [ Pattern:0,500 ] 

Tuesday, June 02, 2015

Gardening Progress: Who Needs a Water Timer?, Yes They Grew! And Adventures in Tiny Container Gardening

Last week the garden was getting a bit on the dry side so I decided put our drip hoses to work. I had thought about splurging and purchasing a water timer, but surely the timer on my phone would do the trick equally as well. I turned on the water and promptly forgot about it. 3 *hours* later I came into the kitchen and heard the not-so-close-not-so-distance sound of water running. Oh crap! I promptly turned off the water and then hit Amazon to purchase a water timer. Lesson learned.

Since the timer arrived it's been wet enough that I haven't needed to hook it up. Last night was an especially crazy set of storms, and will probably keep the garden will damp for a few more days. But I figured I might as well setup the water timer anyway (and leave it off, of course). Here's a photo of it in action:

As a rule, hoses always leak on me. Always. To reduce the chances I'd have problems I went ahead and purchased brand new hoses for the season. And what do you see in the above test shot? Yes, water gushing from the right branch of the hose. Ugh. So classic. I don't have the energy to troubleshoot this today, so I just left everything as is and I'll come back to it another day. But really, why couldn't this have just worked?!

Other than the fact that the hose attachment is leaking, I actually very much like the water timer. It seems like it's going to do just what I need it to.

A while back I tried three Will It Grow? experiments. I dropped store bought Quinoa, a chunk of sweet potato and sweet peppers into the ground. I had my answer on the Quinoa pretty shortly after the experimented started: yes, it grows!

Over the last few days, I believe I've confirmed that both the sweet potato and sweet peppers are growing too!

The first photo shows, what appears to me anyway, to be a sweet potato seedling. And the second two photos are of clusters of pepper seeds. I just dropped them in the ground while still attached to the stem, so this is how I'd expect them to grow.

Amazing, right? I wonder what else I can start growing from the supermarket?

And here's a new Will It Grow Test:

I'm curious if how these small containers do. That's a Costco sized dishwasher soap tablet bucket, a mayo jar, the bottom half of a prune juice container (yum!) a regular old small planter. They have seeds for: tea, blue flax, borage and mint respectively. I'm also fiddling around with different ways of marking what's in the containers. That's Menchie Spoons vs. colored popsicle sticks. I should really get fancy and put QR Codes on the containers.

Will anything grow in these small containers? Will being able to bring them inside or perhaps give them away be handy? Will borage, which isn't supposed to be grown indoors, ever flower? Who knows (well, you do), but we'll find out soon enough!

Whenever I'm waffling about trying out these experiments, I think of this Chinese Proverb:

The best time to plant a tree was 20 years ago. The second best time is now.

Monday, June 01, 2015

Claude Moore Colonial Farm - A Kid and Parently Friendly Adventure

This past weekend we had my parents and some kids to entertain, so we decided to check out the Claude Moore Colonial Farm, followed by a trip to the super impressive Clemyjontri Playground.

In many respects the Claude Moore farm is like Oxon Hill Farm: not especially grandiose and easy to dismiss. The colonial farm had two, maybe three buildings to investigate, a couple of reenactors and handful of animals to see (a cow, a few turkeys, a couple geese and 3 not-so-little pigs and a bunch of chickens). What I read suggested that the property takes about 45 minutes to walk through and that seems about right. We saw a few gardens and a couple of fields worth of tobacco being grown.

So yeah, this isn't Colonial Williamsburg.

But, with the right frame of mind and level of curiosity, the site is actually quite cool. You can interrogate the reenactors as much as you'd like, and we got to handle some of the of implements in their kitchen. The small farm size meant that nobody got too tired out walking. I'm certainly glad we visited, and I could definitely see going back with the right audience (everyone in our group found at least something cool on the farm). It's also worth checking the schedule and seeing if you can visit during a Market Fair weekend, where things are supposed to be really hopping.

Just around the corner is Clemyjontri Playground, which of course the kids loved. For us, these two activities paired together perfectly. The farm infused some adventure and history to the day, while the playground is just a solid good time for the kids. Definitely a fun way to spend an afternoon.

LinkWithin

Related Posts with Thumbnails