GORUCK Chicago Star Course 50 Miler AAR

Team: Rucking Idiots
Members: Me, S, C, T (names lightly anonymized)

I parked at 19:30 a short walk from the start point. Of course I took the long way, but that’s how it goes. I was first of my team on-site. S showed up a little while later, maybe 19:50, while C and T showed up a little after 20:00. Not quite ideal, but how it goes. Original fifth member didn’t even make it. S had completed the DC Star Course, and we were glad to have his experience on the team. C had apparently goaded his work buddy T into joining him. T had done endurance events when he was younger, so he was hopeful. Both were paramedics and coming off 24+ hour shifts, and this turned out to be a poor choice.

One thing we did during the admin phase that was valuable: S had C log into the team account on his phone. It meant both S and C could post the required photos. As it happened, S ended up posting all the updates. Much like in a Scavenger, your progress was scored by posting a selfie to Instagram at the designated place w/ the specified content and hashtags.

I think our missing team member was the only one who dropped before the event, so we started with a headcount of 41 and 13 teams. It wasn’t DC-big, but folks have said Chicago events are a bit small, and this not being the first Star Course probably added to it. Plus, some folks might have read those DC AARs and not signed up. Who knows? It was, however, a manageable size of event. That was good, because a bunch of the field at the start point had been roped off for something else, so the smaller size still fit easily in the available space.

Briefing started at 20:30 and we received the first three points. From the start at Arvey Park (south end of Grant Park, down at Roosevelt), we were to walk up the Lake Shore Trail to the north terminus, about 9 miles. From there we were to turn around and head 18 miles south on the trail to the South End Cultural Center. Mocha Mike would be set up near there, and he’d give us the rest of the points. So, not unlike DC, it started off with a long, simple walk.

@goruckstarcourse #goruckstarcourse

A post shared by Rucking Idiots (@ruckingidiots) on

We set off in good spirits and were making good time. A couple of teams passed us fairly quickly and stayed there. S took the role of local guide, as he’s lived in the city for nearly 30 years. That turned out to be incredibly valuable. We made decent enough time to the water station they’d set up about 4.5 miles into the course. That seemed a short distance for a refresh station, especially kicking off about 21:00, but it was welcome when we saw it on the way back. On the downside, it also represented a bit of a trap, and it was easy to end up taking 5 or 10 when you should have been taking 2 after covering so short a distance.

We made it to the first point about 23:48, covering 9 miles in a bit under 3 hours. 3 miles per hours is not a fast pace, but it was pretty sustainable. However, T and C were hurting a bit, and I took the opportunity to throw some friction tape on my feet. That was a bit late, as I already had a couple hot sports forming. Ah well. We took time for food and water, but it was probably double the time we needed. Reviewing the Instagram photos, you can see a marked difference in the enthusiasm of some of our team. They say attitude is everything, and to keep yours positive, and I made it a point to put on a smile (or something similar) for every selfie. It’s not much, especially early on, but I think it helped a little.

@goruckstarcourse #lakefronttrail

A post shared by Rucking Idiots (@ruckingidiots) on

Heading south, we were making good time for a while. We did suffer pace a bit as by this point, T’s feet were starting to really get to him, but he didn’t want to stop and check on them. We were also suffering on pace because T and C would get distracted trying to figure out whey his phone charger and his phone wouldn’t play nice together. They were still walking, but it was clear that any time they were distracted by that, they walked slower.

We made another stop at the water station, and that ate more time, but not too much.

We continued south, but somewhere around the Oak Street beach, the weather turned on us. While we’d been forecasted to stay dry, we’d started seeing lightning well north of the city on our way up. We thought it was heat lightning, but the rain component finally caught up to us. It was light at first, but got heavier when we finally ducked into a pedestrian tunnel to get out our rain gear. Busted drainage pipes made that a less dry experience than we might have hoped, and we had the fun experience of watching a flood of nasty water surge towards the rucks we’d grounded. We relocated them to a relative high spot and considered the situation. Another team joined us about that time and seemed to settle in to try and wait it out. We never saw them again.

From there, S lead us into the city to try and use the lower levels as a way to get out of the rain. At about Navy Pier, we finally managed to get to the sub-surface streets and took Lower N Lake Shore South to Randolph, then cut over to Columbus. A short jaunt on Columbus and we dropped into the Millennium Park garage and cut across it. I’m not sure where we popped up, or where exactly we rejoined the trail, but it worked out to keep us out of the rain and weather for a while.

Eventually, we were back to the museum campus. An actually-quick break in the ped tunnel, and then we continued to basically follow LSD past the Field, through some parking lots at Soldier Field, and then through the tunnel under McCormick. That, too, was a nice break from the weather, and supported a good breeze. We took about a 15 minute break near the south side of the McCormick Center tunnel. That was a nice rest, but it was really the beginning of the end for C. He made the mistake of sitting down and not really moving, which meant he froze up.

We benefited from S’s experience doing races at various events around the city for this portion of short-cutting and using garages as rain cover.

From there, we took a long walk south on Ft Dearborn drive, appreciating that it was not a well-used road, but straight and saving us from a few steps where the Lake Shore Trail preferred to meander. We stopped to chat briefly with a curious security officer, and marveled at a woman who rocketed by us twice w/out her lights on. Given that she drove by in the same direction both times, we’re not really sure what she was up to.

At 31st, we rejoined the trail (reviewing the map, it wasn’t much of a difference, but it did sort of keep us from seeing any other teams, which I think was kind of nice). Unfortunately, we hit a few snags w/ the trail being under construction, but this was more of a distraction than a delay.

We found BD and his refresh station around 5 in the morning at the Burnham Park Outdoor Fitness Station (or thereabouts; it’s the only place in the zone that matches my memory of the layout).

We met up w/ C’s girlfriend just a bit south of where we met BD. There was a convenient pulloff northbound on LSD. Hot coffee and a few light snacks, plus some water was a welcome pick-up. We lost a fair bit of time to some dispute over what exactly we should take vs. what she was asked to bring us, but they worked it out.

A key benefit of the stop was that it provided us an opportunity to talk T into handing off his ruck. I took it as we set off, and we were able to pick up the pace for a while. This is where training w/ heavy rucks and sandbags really felt beneficial, as I slung his ruck on top of mine and set off. We kept up a much better pace this way for a while, and S and I traded T’s ruck back and forth. C initially wanted to get in on that extra-weight action, but he seemed to realize quickly that it wasn’t going to be a good idea.

We kept going, but the pace started dragging again. Eventually, between the 57th and 63rd St beaches, C came up and told us he and T were dropping. I think they realized they just didn’t have the gas left to push on through the more than half the course remaining at a finishing pace.

We traded coffee containers back and then S and I set out at a relatively brisk pace. There were still some miles to cover before we hit the turnaround, and we wanted to make up time. Plus, without the extra ruck on, I certainly felt a lot lighter.

S navigated and we went more or less waved at Mocha Mike as we passed by his checkpoint. Course instructions said we had to hit the South End Cultural Center and get our photo before we got our points. So we did a quick walk-by check in and kept on. Turned out our team mates who dropped hadn’t called ahead yet, so we let cadre know they’d dropped. They’d planned to keep on until they hit Mocha Mike, but I suspect they gave it up. Can’t blame them, as smoked as they looked. Important to let folks know if you’re dropping, though, and since Cadre were at checkpoints and not following the group, it was extra important that folks called it in. S sent in an update just to round things out. Accountability, you know? It felt like about three-quarters of a mile each way. It had since gotten plenty light, and we logged the South Shore Cultural Center at 06:37, 27 miles in.

@goruckstarcourse #southshoreculturalcenter

A post shared by Rucking Idiots (@ruckingidiots) on

We rolled back up to Mocha Mike, got the list of the next points and took 20 to reset feet, chow on food, and plan. This was a huge benefit. I cannot emphasize how much value we got out of fixing the feet, swapping in new, non-wet socks, fresh tape, and a having a short sit w/out the ruck. On top of that, taking the time to plan the route was very smart; it meant we didn’t have to think on our feet later in the event, and we could make sure we weren’t wasting any steps. Here again, we leaned on S’s experience — he did all the route planning, since he had ~ 30 years’ residency and a lot of local race-running experience to lean on.

Once we were done w/ our feet, our fruit, and our plan, we refreshed our water and moved on. First stop was Statue of the Republic, and we logged it at 07:33, with about 29 miles behind us. Heading out from Statue, I was able to contribute my ability to read maps & navigate to keep us on track. Go SAR, eh?

@goruckstarcourse #statueoftherepublic

A post shared by Rucking Idiots (@ruckingidiots) on

We set off to the Fountain of Time, and, while waiting at a crosswalk, were randomly asked to for directions on how to get somewhere nearby. I think our guidance was mostly sound, though, frankly, we weren’t much better off than they were. At least they were driving.

We hit the U Chicago campus and took a slight detour to north side of the Waverly Park to see if any of the buildings up there were open so we could hit the head, but no. Saturdays. Passerby said campus was all locked up, but up a few blocks to 57th and the shops would be open.

We finally hit the fountain, just about 30 miles in, taking our photo at 08:14. As we were sorting out how we’d get to Promontory Point, R from 1811 joined us, on account of the last of his team dropping at the Fountain.

@goruckstarcourse #fountainoftime

A post shared by Rucking Idiots (@ruckingidiots) on

I was very glad of R’s company: he had great attitude and provided a good buffer between me and S in terms of someone extra to talk to, someone extra to help buoy mood, etc.

We went up to 57th (again, yay SAR land nav at key intersections), stopped in a Starbucks for 10 to hit the can (finally) and grab a pick-me-up. I was so tired that I ordered a tall when I was thinking a veinte, but at least it was just a refresher tea. I love caffeine, but didn’t need much to keep going and didn’t want the diuretic effect.

We hoofed it over to Promontory point (57th turned out to be about the perfect road to make it a straight shot), grabbed our photo at 09:08 (~ 32 miles) and kept going. We were keeping our stops short at this point, just a photo and move on, and I’d maybe drop my ruck for the couple minutes it took S to type out the required stuff in our post.

@goruckstarcourse #promontorypoint

A post shared by Rucking Idiots (@ruckingidiots) on

From there, it was a long, hot slog north to Adler Planetarium. For much of it, there was no breeze and the sun was cooking us. I started really feeling the heat and was feeling a bit out of it, so I started pulling in more water (hadn’t been having tooo much before then). We stopped around Oakwood/41st and used the outdoor shower things to cool off. Between the shower-drench and and some cooling cloths that S broke out and shared around, I felt a lot better. It didn’t hurt one bit that the breeze started picking up again, too.

From there, we continued our slog to Adler. Insult to injury, we had to head east to a point where we could get the dome in the shot, but we got it at 11:08 (~ 37.5 miles). We took a slightly longer stop here to get S the coke he was craving (said it always gave him a boost), while R and I enjoyed getting our rucks off for a few.

@goruckstarcourse #adlerplanetarium

A post shared by Rucking Idiots (@ruckingidiots) on

We struck north again, taking a short stop across the street from Buckingham to get our photo and keep moving (11:47, ~ 38.5 miles). Stupid traffic took forever to clear, so we probably should have gotten it on the way back to save 5, but whatever.

@goruckstarcourse #buckinghamfountain

A post shared by Rucking Idiots (@ruckingidiots) on

Heading north to Navy Pier, my feet were giving me grief again, but we kept on. I found I had to keep to the flat surfaces, as the uneven surface of grass was really hurting; some of the tape had rolled w/ the sock and every step felt like it was pulling at my skin. Earlier, I noticed a hotspot/blister under that spot, so it was probably a bit of everything. Any way you sliced it, it sucked.

Somewhere in here, as we were heading to Navy Pier, S realized we should swap the order we hit the Water Tower & 2nd City, getting Tower first, then up to Second city, so we wouldn’t have to double back east after going west of it, and having more points west of it still. This was the only change to the plan we’d made down at the halfway checkpoint, so overall it was very solid.

I kept up a pretty steady slow-sip of water from here, and somewhere along the way, I’d drained my Nalgene, which had been spiked w/ caffeinated Nuun tabs. I took my last sip of water about as we hit the outdoor pedestrian-only area at Navy Pier. From there, it was an impressively long slog out to the anchor at the end of the pier. We cut indoors, which meant weaving a bit through crowd, but that wasn’t so bad, and the shade and AC were made up for it. We grabbed our photo at the anchor at 12:33 (~ 40.5 miles), you can tell I’m hurting pretty bad.

@goruckstarcourse #usschicago

A post shared by Rucking Idiots (@ruckingidiots) on

We slogged back inside Navy Pier a little ways, dropped our gear on a set of steps that seemed to lead up to a movie theater, and I took the opportunity to use the head and refit my feet again. I shuffled food around to where I could get to it, while I was in there, since I felt like I should have taken calories on the way east on the pier, but didn’t. It was a ‘quick’ stop for a foot refit, but even kinda pushing it, that takes a while. Still, I got it done quick as I could and went to refresh my water. Of course I went to the bottle refill station that was busted and had to refill from the water fountains next to it. Even only refilling my Nalgene (adding more Nuun tabs, of course) and about half of my hydro bladder, it took what felt like ages. Teammates took their own little break and were hanging out at a non-broken bottle refill station. I simply hadn’t spotted that on the way in, and I feel like it might have saved us a few minutes. Oh well.

On my way out of Navy Pier, I pulled down one or two of my Clif blocks and a Tanka bar, and I felt far better; I had a real lift in my step on our way out. The power of fixing your feet and refueling, I guess. Might have been a serious mental component there, too.

From there, we had about 10 miles left to cover across a bunch of relatively short hops, so it was easy to keep our moods up. We hoofed it quick as we could up to Water Tower (13:36, ~42.2 miles), got our photo, and rocked on up to Second City. We grabbed our photo (14:05, ~43.6 miles) and then set south.

@goruckstarcourse #watertower #fixingmispost

A post shared by Rucking Idiots (@ruckingidiots) on

@goruckstarcourse #secondcity

A post shared by Rucking Idiots (@ruckingidiots) on

That walk south felt long. We were going as fast as we could, because it was the return trip, but at every light we couldn’t cross immediately, we stopped to stretch and get a little weight off. I’m sure it looked ridiculous, as we ended up sorta bending over pretty far in front of whoever was around. Who cares? We were tired and sore as hell at that point. It was an extra nice bonus if we could find something like a window sill to take the weight of the ruck for a bit.

We struck south on Wells to Wacker and struck West to the old post office plaque, which felt like quite a slog. We had some disagreement about where exactly it was, but from what we’d heard and what info they gave us, I was pretty confident the location was about where the map apps said it was, or damned close. The other guys were less so, but I managed to sort of keep them going for it, anyway. When we got close, we settled on, “Let’s spread out and do a quick search.” I spotted it hiding behind a wall after about five seconds. Sneaky thing, but we got it at 14:48 (~ 45.5 miles).

@goruckstarcourse #oldpostoffice

A post shared by Rucking Idiots (@ruckingidiots) on

It took me a little while longer to notice, but I think somewhere around here, the rest of the team was fading mentally. I’m not really sure why I felt like I was doing better, but I felt pretty sharp, my confidence was up, and I felt generally aware of my surroundings. I was doing a big chunk of navigating at this point. I was dragging earlier, so it was good to be able to contribute here. Teamwork and all, rah.

It was a pretty quick shot over to the bean, where we grabbed our photo in the reflection, per the spec (15:11, ~46.5 miles), and then hit up the Art Institute. Here, I dragged the team over to a place where we could get a good Lion selfie w/out being in the way of sidewalk traffic. Again with the awareness. We grabbed our photo at 15:21 (~47 miles), and then waited. The other guys didn’t want to go until they’d gotten the like from HQ (this is how they were scoring checkpoints). The wait cost us quite a few minutes, and while I appreciate the desire not to do any backtracking, at that point, we had no reason to think HQ wouldn’t credit us, since they’d done the rest. Still. Eventually, R got a like on his post for his original team, and I managed to talk S into getting moving again.

@goruckstarcourse #thebean

A post shared by Rucking Idiots (@ruckingidiots) on

@goruckstarcourse #artinstituteofchicago #ithinkwearedone

A post shared by Rucking Idiots (@ruckingidiots) on

Once we were moving, I was keeping an eye on the GPS to figure out how best to get back where we wanted to go. S was definitely fading, ‘cause at one point I had to go “Left left left” to keep him from trying to go straight across a light. Again, I felt pretty solid, so I’m glad I could help. My feet were hurting, but whatever, we had about a mile to go

We got ourselves over to the far side of Columbus Ave eventually, and then we just hoofed it on down to the finish. We got passed by another team in this process, but at that point, we were finishing and we didn’t really give a fuck about pace. We just kept going at a pace we could sustain.

Eventually, we slogged into the finish, about 2 minutes behind the other team. We were clocked at 18:44 for Rucking Idiots and 1811, and then we were done. We were the last team to finish, but we still finished, and nobody was rolling in late — looks like in Chicago, people could tell they weren’t going to make it and dropped as opposed to trying to trudge in late. I ran all my distance numbers w/ Google Maps, and that jives w/ the pedometer on my phone; both come up with about 48 miles for the distance. I don’t know where the other two miles came in. Maybe they revised them out? Maybe they were there and my remembered routing missed something, and the pedometer app miscounted. It could happen.

The after-party was pretty chill. It was a hell of a feeling to finish. We got our patches, I grounded my gear, and there were celebratory hug-handshakes all around. I grabbed a couple of sandwiches and someone put a beer in my hand. I’m not a huge fan of Bud, but it was the perfect thing at that time. I pulled my boots off and pretty much sprawled out on the grass. I left my socks on — not like getting them dirty would matter, but I knew I didn’t want to go through having to resock until much later. Not until I wasn’t trying to put my feet back in the boots.

We hung out for a while, and then eventually we all rolled out. I slogged over to a Starbucks to get some coffee and a refresher tea, ‘cause I needed a lot of caffeine for the drive home. I wanted to use the head, but of course it was a standing-only, no restroom Starbucks. Thankfully, a bag of chips at the Subway next to the garage I parked in was good enough to get me a restroom.

I took my time at the car to relax, get my stuff off, and change into other clothes. It felt very good to have changed, even if I couldn’t shower yet. I switched to flip flops, also very good, even w/ socks on. I think I went back to shoes for the drive home, since I wasn’t taking my socks off yet, and they weren’t quite playing ball with the flip flops.

The drive home was rough. It was about 45 minutes w/ traffic, and I was not as awake as I should have been. I got away with it, but that’s one of the biggest issues w/ coming back from those overnight events: not being awake enough to really drive safely. I probably should have napped in the car first, but of course I felt fine at that point.

Overall, it was a great event. I’d do one again, but not for a while.


I didn’t really train for the event. I had been training for the D-Day Tough/Light two weeks prior, and I feel like that ended up being good mental prep and adequate physical prep, though it definitely didn’t cover some of the extent that 50 miles is. The Tough-Light was about 25 miles total, but broken up w/ PT and breaks and the like, so it was a good distance to know the feet, but not enough to really appreciate the length of the slog that is 50 miles.

Afterwards, walking really sucked for about two days. Sunday was awful, but I dressed my feet and crammed them in some soft shoes to go out and put my feet up at a coffee shop for a while. Monday was less awful. Tuesday was pretty bad, partly because I had to tape up my feet to get them in formal-ish shoes for an interview. That process took maybe 20 minutes, all for 30 minutes of driving and a one-hour interview. By Wednesday morning, though, my feet had finally reached “damned uncomfortable, but not painful.”

A lot of the issue was just keeping weight off the blisters. The heel blisters kinda sucked, and under-the-toe blisters made it tough to find a place to put my feet or to walk decently. I soaked my feet a bunch between Sunday and Wednesday, and that seemed to help. I only had one blister need to be cut off for a while, though several wept a few times. It took a while until the blisters on my right foot went down enough that I could flex my big toe properly. I had one very proud blister on the outside of the right big toe took a while to go down, which was tense for a while, as it was thin skin, and kinda reddish — I didn’t want it to burst, because it felt like it had a high chance of infection if it did. Everything healed up nicely, thankfully. By the next week, a lot of the skin over those blisters had to be trimmed off, but things under them had healed.

My legs were basically good to go on Sunday. Not great, but good to go. I am very impressed with how much high-rep, low intensity can wear you out, but not burn you up.

You can kind of see it in the photos, but my hands started to swell a lot in the latter half of the course. Right hand was worse, since I was wearing a wrist brace to keep it under compression for a while, but both were suffering from having the ruck straps on my shoulders the whole time. Not a _huge_ issue, but I’m glad I didn’t have my class ring on, and you can see that I left my watch unstrapped after a while. Hand-swelling is one of those things I hadn’t though about before the event. I don’t know if there’s anything to do for it.


GORUCK News Post On Chicago Star Course: http://news.goruck.com/event-news/star-course-50-miler-chicago/
Instagram for Rucking Idiots: https://www.instagram.com/ruckingidiots/

But They’re Volunteers!

I have heard this a few times, most especially very recently. In context, the statement goes something like, “We can’t hold them to professional standards, they’re volunteers.” To that I say that, yes, we can hold them to professional standards, and moreover, we should.

For context, I had the pleasure, and honor, of volunteering with the Virginia Search and Rescue community for just about three years. During that time, teams, as a whole, responded to between fifty and seventy state-managed missions a year, in addition to whatever their local communities came up with (event standbys, local rescue squad wilderness rescues, etc). Within that group, there are two (2) paid individuals: the SAR coordinator and Deputy SAR coordinator for the Virginia Department of Emergency Management. They were responsible for being the teams’ primary interface with VDEM, which is the mechanism by which teams were dispatched to missions.

Every other individual in the system was a volunteer. Despite the fact that they were volunteers, they were all held to a consistent, high standard, that left a strong positive impression with the agencies with which they interacted and fostered a sense of unity that left many outside observers unable to discern that multiple regional teams were present. These volunteers provided both timely, efficient, and effective search resources and safe, effective patient care when extracting a subject from the wilderness. In addition, in the cases where subjects were found deceased, these individuals conducted themselves according to best practices of crime scene preservation.

On the whole, these volunteers conducted significant amounts of training in the practice of all aspects of search and rescue. As a result, they were valuable assets to any law enforcement entity that availed itself of their resources.

Similarly, while I was with my local search and rescue team, we worked closely with the local volunteer rescue squad, whose members were also all volunteers (a number of members, including myself, were trained to both standards). Emergency Medical Services standards for volunteers are no different than those for paid providers, so these individuals, again, conducted themselves according to industry standards to provide twenty-four-hour care to both the town and approximately half the county.

Volunteers can be professional, can be held to professional standards, and can enjoy it. I would venture to say that, because they are held to standards, they take great pride in their work. Certainly, the members of my team were a proud, competent, and effective group. The key is to understand that, while you can hold them to standards, you must be mindful of their time. It is completely reasonable to say to a prospective volunteer, “If you want to work with us, you must meet these standards. We will train you.” It is perfectly reasonable for a prospective volunteer to say, “I am interested, but I do not have the time.” That is acceptable. Either you find a less time-consuming area for them to volunteer, or you part ways amicably until such time as they do have the time to dedicate to meeting your standards.

What you should not do is say, “You are a volunteer, therefore I will expect very little out of you.” While it may be the case that some volunteers have little to offer, on the whole, people rise or sink to the level of your standards, so set them where your organization needs them to be.

If your organization has volunteers already and you are setting a higher standard than before, say because your organization has grown and its standards have changed to meet that, be prepared to train your volunteers. Help them succeed. Understand that there will be a transition period. One thing that can help is to understand the scope of what you are asking them to do. Not only will this help you manage your expectations of your volunteers, it will likely provide you with additional information into just how your organization runs.

Further, developing a training program for your volunteers will help you reduce single-person dependencies. A stellar individual contributor is a wonderful asset to have, but if you are not careful, they can become a bottleneck for your organization, and you may start asking more of them than they can give. Do that for long enough, you run the risk of burning them out, and then, not only do you lose the high-performing resource, but you haven’t planned for its absence. Instead, take that stellar resource and reallocate some of their volunteer time towards training new folks in that space.

Finally, determining standards should help you figure out what you want your organization to accomplish, because those standards should be enabling your volunteers to contribute to those goals. There is no point in setting high standards that don’t contribute to those goals, so understand what you’re going for, then set standards that support it. And if you look around and nobody is there yet, then it also helps you figure out how you need to develop your team.

I won’t say it’s simple, or that it’s just a little work, but setting standards that support your organization’s needs, and helping your volunteers achieve those standards, is good for your organization and your volunteers.

Yes, they are volunteers, and yes, they can do it.


My sincere thanks to both the Southwest Virginia Mountain Rescue Group and Blacksburg Volunteer Rescue Squad for the three years I spent with SWVaMRG, and, through them, BVRS. Some of my favorite memories occurred in my SWVaMRG uniform. If you’re living in the vicinity of Blacksburg, Virginia, consider giving them some of your time.

Safari Loses All Tabs on Start

This was a problem that’s been bugging me for a while: Safari quits for some reason or another (restart, upgrade, etc), and when it starts back up, all the tabs I had pop up briefly, then all but the topmost close.

I thought for a while this was some unexpected behavior in Mavericks or Yosemite, but I couldn’t find any evidence of it, and if it was, I wouldn’t have been the only person having the problem. Finally, I ran across a post which suggested selenium web driver might be at fault. A quick check, it was installed and active. Remove it, since if I need a browser for functional testing, I run it through chrome, and bam, things are great again.

So there you go, short and sweet. If Safari is taunting with all the tabs you wanted to have back, then closing all of them and giving you only the one that was active last, see if the Selenium Webdriver is active, and, if so, disable it.

As an aside, it did this per-window, so if you’re a one-tab-per-window person, you’d likely not see this whereas if you’re a multi-window, multi-tab person, like me, you’d get whichever was active last in each window. Fun times!

Git Recovery (or Reverting a Gitpocalypse)

This morning I ran into a minor issue where someone pushed a totally different project into one of our repositories, turning our FreeRADIUS Configuration repository into a functional clone of the FreeRADIUS source repository. As you might imagine, this was…somewhat disruptive. After casting about for a bit, I found that recovery was not as bad as it seemed. There might be some missing branches after this, but as most of them should have been deleted, I’m not feeling too bad.

This works best (at all?) if you have some repositories floating around with recent, good copies of what you want to recover.

From that machine, I did the following:

$ git checkout master
Already on 'master'
Your branch is up-to-date with 'origin/master'.

$ git log -n 1
commit f019fb8e8d15a28e721441d21a3d8a754e0d210d
Author: Jacob M. Dawson <dawson@vt.edu>
Date: Wed Oct 8 10:55:17 2014 -0400

Implemented forgotten correct ldap clients config in load-balancing

$ git push -f origin f019fb8e8d15a28e721441d21a3d8a754e0d210d:master

So that reset the master to something decent (the last update we’d made to it, thankfully). From there, I pushed the branches I cared about, as they’d also been removed:

$ git checkout netadmin
$ git push -u origin netadmin
$ git checkout eduroam
$ git push -u origin eduroam

Etc.

Finally, I went about removing all the bad branches and tags (this snapshot is after I’d already nixed most of the branches and moved onto tags, but the point remains).

$ git ls-remote origin
8bde98501d3657dfb183913be8cbf187769fed56 HEAD
8aca08fe308044c0aacd9d7947600b4f866de1c1 refs/heads/eduroam
8bde98501d3657dfb183913be8cbf187769fed56 refs/heads/master
8a9d093e110f84391f512080daea89fffcac39e0 refs/heads/netadmin
a687717f49aca81d45c96d636eaf42cd5c7b5d94 refs/remotes/upstream/HEAD
c7119ee310ab13d4a526fbdfc50a798622595bf9 refs/remotes/upstream/coverity_scan
a687717f49aca81d45c96d636eaf42cd5c7b5d94 refs/remotes/upstream/master
5f715dba4d2dbdb268bf60fcc656352274930941 refs/remotes/upstream/v1.1.x
6040566cfa969da1bce085ee48b4cd3e433e87d8 refs/remotes/upstream/v2.1.x-apple
7df037e8f4f6d8309a896aed53c360a90d380e34 refs/remotes/upstream/v2.x.x
f46e3f1e4b983d905de956144035bbcaced666c2 refs/remotes/upstream/v3.0.x
15a2d332a02b99fbf04ca4dd41310ea1ab109fbe refs/tags/release_0_9_2
8e6b04132fd49c6fa145851e4ba919385cd0b3ba refs/tags/release_0_9_3
05a08578990a46fb0d3e52c85ab276d462f5511f refs/tags/release_1_0_0
815f3cebf703ed5354211299c3be36d0fde6cc1d refs/tags/release_1_0_0_pre1
ee92544adaea26d89148ea5da7f40730629fd2d1 refs/tags/release_1_0_0_pre2
ab5ebe15a89b5e63914a7b3772a76c35b078055f refs/tags/release_1_0_0_pre3
8c6451806c5af7f5a812098dfc1fef4807c6da42 refs/tags/release_1_0_1
90600a278338ec9d680c43a97e0a636d81b52f2e refs/tags/release_1_0_2
334d34a539e869b054fc473f20ab16a1f5e98493 refs/tags/release_1_0_3
198f900c5d6521f92938f8927f893a9879437b8d refs/tags/release_1_0_4
c13c8bdb58aa100edb6cf678b6c8bdaeefe427c4 refs/tags/release_1_0_5
5b757a36fe84b2cf24df6a367afdaf6294d78997 refs/tags/release_1_1_0
8102de9efd8d6b690bad3aa3ee687fccfbd0a55d refs/tags/release_1_1_0_pre0
6efc0c7c54d93c28c79dcd4b7d45d42774fee2ac refs/tags/release_1_1_1
1c8bd5567bb5e73d28e8350102f4e961d37cb735 refs/tags/release_1_1_2
4a44f2aad41216ae9aa0a9dc49b0b1e093f07143 refs/tags/release_1_1_3
2289360fec804c1b560cbf98f4a06baccea45de5 refs/tags/release_1_1_4
6cdb8bec5014efd32327346c989814bedb4c80be refs/tags/release_1_1_5
ecea7d7baa5b24abd3b0aa016f873ff0a9307dd1 refs/tags/release_1_1_6
2ee0fbe67ef0c8c04e88036c98692079f5179165 refs/tags/release_1_1_7
139e62a134fbaceb28eee001ab87f1d1e3092c33 refs/tags/release_1_1_8
74ef9b64f7cd631b13d7a61bd1588a2bfc75ba39 refs/tags/release_2_0_0
64c447ee26d79773230ddf37631058128fe301fe refs/tags/release_2_0_0_pre1
a22023e192fb491903f1e492d74989b0a4324cb9 refs/tags/release_2_0_0_pre2
dfb32dca4abfaf76ed59b81c6b333bcc91be0ee9 refs/tags/release_2_0_1
db35d2eba513c9aa0fdf127b7e66c5c9bb036bc0 refs/tags/release_2_0_2
7cd6369a90399dc8836242dde3ce8a3e9595cb42 refs/tags/release_2_0_3
ae87fd0cf769498d5ae9a809cc2d703a7494561e refs/tags/release_2_0_4
edf2361c554fe2fe2a1b9a50e81369aaa44a74f9 refs/tags/release_2_0_5
bacf36805f38d059f58c5c62141f91611e8a1bbc refs/tags/release_2_1_0
1c8d4d4cad8a07e96c0898fcf1cda8d2f3982495 refs/tags/release_2_1_1
1d1e9b7372abecfc0942b127e5faf90df547e198 refs/tags/release_2_1_10
34c68ba800632ccca564f6bdcb186e32886684c1 refs/tags/release_2_1_11
70c228536c4a9113caf509fbfeab305ccfcd25c8 refs/tags/release_2_1_12
239ba3f92884be49adc90b1383aa8b54cb150fe9 refs/tags/release_2_1_2
4c44a40e68c08b445123100b39855f36b65bf5f9 refs/tags/release_2_1_3
a2c610854bef0f961573f15022d77b1088e8c819 refs/tags/release_2_1_4
29ce823f72ffdfb2051765a6417126ee91e22552 refs/tags/release_2_1_6
af07ace2815910610c0d39de90e4c0cf0735188d refs/tags/release_2_1_7
4d396a436e73b0331167907e2d84931645b72648 refs/tags/release_2_1_8
7c4c5199e6631d1e93c06025a45e8ba967276986 refs/tags/release_2_1_9
393dd3c3a1a9582040c419c9be35fd4ce56d38cd refs/tags/release_2_2_0
b511525f17d3f40ba28d11d7797a827298df1333 refs/tags/release_2_2_1
96c47460fad08af8822769d75636ab6d5253d3bf refs/tags/release_2_2_2
28e67574dc8011e86c462b7e8204e180a3667ac5 refs/tags/release_2_2_3
127137c63569fbb61555df9f8f9c7364a0fa830d refs/tags/release_2_2_4
b75980dc5b8b38f562948492695b9d6151a2cb94 refs/tags/release_2_2_5
580424ea12feeb5933f1aaac33fd5f9e2fa2ee60 refs/tags/release_3_0_0
335a2add3c5da124b4585bd51afed3681c3c5aea refs/tags/release_3_0_0_beta0
4571cd3cc6150ad61e136bf28de8f47e8fca8459 refs/tags/release_3_0_0_beta1
82961d74ffcbf1ec4a4f13b6cc79ddc35d7e656d refs/tags/release_3_0_0_rc0
484451695676f1d38ecd376c37d7e648731d8d77 refs/tags/release_3_0_0_rc1
9dbdad73ca823f5d2fbb0cbc5c34aec714a9e0d3 refs/tags/release_3_0_1
808a9b3a8ff7ebac794519a1e842507c9a99107b refs/tags/release_3_0_2
3366cf0a98513ee15e1b96e3996f929ba5e611a4 refs/tags/release_3_0_3
7c9d5fbe83a67934bff42c1093d50daacbf1c083 refs/tags/release_3_0_4
3d44fdde2fc3b6d4173747b4cf2e2471688f9651 refs/tags/release_3_0_4_rc0
4039aa19fbbea4503a81be519b0c3703783cb38d refs/tags/release_3_0_4_rc1
7053bedffefec30c8d1a70c12ed47dd0325ab8ca refs/tags/release_3_0_4_rc2

There were quite a few, so after digging around some more, I located a post on how to bulk delete remote tags.

This was most helpful, but I found I needed a little bit of tinkering with the regex to get it to fly, ending up with something like this:

$ git ls-remote --tags origin \
| awk '/^([0-9a-f]+)\t(refs\/tags\/release.*$)/ {print ":" $2}' \
| xargs git push origin

The proposed solution is fairly destructive, so I checked my work:

$ git ls-remote origin \
| awk '/^([0-9a-f]+)\t(refs\/tags\/release.*$)/ {print ":" $2}'

:refs/tags/release_0_9_2
:refs/tags/release_0_9_3
:refs/tags/release_1_0_0
:refs/tags/release_1_0_0_pre1
:refs/tags/release_1_0_0_pre2
:refs/tags/release_1_0_0_pre3
:refs/tags/release_1_0_1
:refs/tags/release_1_0_2
:refs/tags/release_1_0_3
:refs/tags/release_1_0_4
:refs/tags/release_1_0_5
:refs/tags/release_1_1_0
:refs/tags/release_1_1_0_pre0
:refs/tags/release_1_1_1
:refs/tags/release_1_1_2
:refs/tags/release_1_1_3
:refs/tags/release_1_1_4
:refs/tags/release_1_1_5
:refs/tags/release_1_1_6
:refs/tags/release_1_1_7
:refs/tags/release_1_1_8
:refs/tags/release_2_0_0
:refs/tags/release_2_0_0_pre1
:refs/tags/release_2_0_0_pre2
:refs/tags/release_2_0_1
:refs/tags/release_2_0_2
:refs/tags/release_2_0_3
:refs/tags/release_2_0_4
:refs/tags/release_2_0_5
:refs/tags/release_2_1_0
:refs/tags/release_2_1_1
:refs/tags/release_2_1_10
:refs/tags/release_2_1_11
:refs/tags/release_2_1_12
:refs/tags/release_2_1_2
:refs/tags/release_2_1_3
:refs/tags/release_2_1_4
:refs/tags/release_2_1_6
:refs/tags/release_2_1_7
:refs/tags/release_2_1_8
:refs/tags/release_2_1_9
:refs/tags/release_2_2_0
:refs/tags/release_2_2_1
:refs/tags/release_2_2_2
:refs/tags/release_2_2_3
:refs/tags/release_2_2_4
:refs/tags/release_2_2_5
:refs/tags/release_3_0_0
:refs/tags/release_3_0_0_beta0
:refs/tags/release_3_0_0_beta0^{}
:refs/tags/release_3_0_0_beta1
:refs/tags/release_3_0_0_rc0
:refs/tags/release_3_0_0_rc1
:refs/tags/release_3_0_1
:refs/tags/release_3_0_2
:refs/tags/release_3_0_3
:refs/tags/release_3_0_4
:refs/tags/release_3_0_4_rc0
:refs/tags/release_3_0_4_rc1
:refs/tags/release_3_0_4_rc2

Work checked, let fly:

$ git ls-remote --tags origin \
| awk '/^([0-9a-f]+)\t(refs\/tags\/release_[01].*$)/ {print ":" $2}' \
| xargs git push origin

To git@git.it.vt.edu:cns/freeradius-config.git
– [deleted] release_0_9_2
– [deleted] release_0_9_3
– [deleted] release_1_0_0
– [deleted] release_1_0_0_pre1
– [deleted] release_1_0_0_pre2
– [deleted] release_1_0_0_pre3
– [deleted] release_1_0_1
– [deleted] release_1_0_2
– [deleted] release_1_0_3
– [deleted] release_1_0_4
– [deleted] release_1_0_5
– [deleted] release_1_1_0
– [deleted] release_1_1_0_pre0
– [deleted] release_1_1_1
– [deleted] release_1_1_2
– [deleted] release_1_1_3
– [deleted] release_1_1_4
– [deleted] release_1_1_5
– [deleted] release_1_1_6
– [deleted] release_1_1_7
– [deleted] release_1_1_8

Remediation

This was clearly a suboptimal event. Fortunately, remediation steps in this case were fairly easy. Most of the other members of the team for this repo are in the ‘Developer’ role, while only I and one other person are in ‘Master’ or ‘Owner.’ As such, I set the master branch to protected, which will prevent these from surprising me in the future.


As an aside, you’ll notice I chopped up the work a bit. The following pair of tags made git fairly unhappy:

:refs/tags/release_3_0_0_beta0
:refs/tags/release_3_0_0_beta0^{}

Removing the plain boring beta0 took the wonky one with it, as I discovered, so in the end, it worked out ok.

MAGFest 8.5

I’ll be heading out to MAGFest 8.5 shortly to work security for them while they run a smaller version of their main event in order to provide their staff more training in their roles. It should be fairly entertaining, and I might even have time while I’m sitting at the desk to work on a few of the draft posts floating around here.

Using Functions From One Groovy Script In Another

The Problem

A coworker and I spent a while on Thursday evening beating our heads against this issue.  We’d written a few functions in a separate file so that we could get them working without affecting the rest of what we’d done.  Once it was working, we went to use it elsewhere in the project, but were stuck with how to make it available to our script.

Take the following function:

getThing.groovy

def getThingList() {
  return ["thing","thin2","thing3"]
}

We want to use it in another script like this:

badPrintThing.groovy

println getThingList()

The result?

$ groovy badPrintThing.groovy 
Caught: groovy.lang.MissingMethodException: No signature of 
  method: badPrintThing.getThingList() is applicable for 
  argument types: () values: []
groovy.lang.MissingMethodException: No signature of method: 
  badPrintThing.getThingList() is applicable for argument 
  types: () values: []
	at badPrintThing.run(badPrintThing.groovy:2)

Exploration

Obviously, the error message isn’t what we wanted out of this, so we tried the following:

import getThing.groovy
println getThingList()

More of the same. Tried to ingest the file with something I found over on stackOverflow:

evaluate(new File("getThing.groovy"))
println getThingList()

Yet again, no dice.

Solution

Reflecting on the problem that evening, I recalled that every groovy script is more or less a class with the name of the file in which the script resides ((This behavior is hinted at in the Scripts and Classes section of the Groovy documentation: “If you compile the above script to bytecode using groovyc, you get a single class named after the name of the script. e.g. if this was saved in Foo.script you’d get a Foo.class file.  You can run this Java code on the command line (assuming you’re classpath has groovy.jar and asm.jar)  This will execute the autogenerated main(String[] args) method in the bytecode which instantiates the Foo class, which extends the class and then call its run() method.”)). With that in mind, and the observation that all the files in the same folder will be part of the same package and thus available to each other without any work, I ended up with the following, which worked as I’d hoped:

printThing.groovy

thing = new getThing()
println thing.getThingList()
$ groovy printThing.groovy
[thing, thin2, thing3]

Final Thoughts

The naming of the getThing class is bad form, now that we’re actually treating it like a class.  If you’re going to write something like this, keep in mind how you’ll be using it and give the file a name more like ThingGetter.

We ended up using this arrangement several times in the project, which suggests to me that there might be a pattern to tease out of this.  We have a copy of Design Patterns around the office, so this should probably be my next stop.

 

Slightly More Than A Placeholder

I’ll fill this out with more content later.  The plan is to post things I find interesting and even worth sharing.  One of the first things in mind is add some notes on headscratchers I ran into with Groovy recently, as well as some talks about how we’re managing FreeRADIUS at work.