Monday, October 15, 2018

Bringing a Bic Lighter Back from the Dead

I found not one, but three discarded lighters while running yesterday. I picked one up, planning to convert it to a handy Spark Lite fire-starter knock-off. Rather than grab a needle nose pliers and other tools, I decided to see if I could do the conversion using whatever items I had on my keychain. My thinking: if I ever needed to turn an empty Bic Lighter into a sparker in the field, I probably wouldn't have the benefit of a toolbox to rummage around in.

I used a P-51 can-opener to gently pry the metal cover off. From there, I used no tools, just gentle pressure to unsnap the rest of the components. The tricky part was getting the tiny flint back into the spring-loaded chamber. I managed to launch both the spring and flint into the air, and spent most of the the build time on my hands and knees looking for these fly-away parts. I used my keychain tweezers to help set the flint back in place.

For just a couple of bucks, it's hard to imagine a more glorious piece of gear than the Bic Lighter. Even out of fuel, it still has much utility to offer.

Sunday, October 14, 2018

Hiking Frankling Mountain State Park - Sunset Loop Trail

Yesterday we completed a delightful hike through Franklin Mountain State Park. We attempted to follow the Sunset Loop Trail but wandered off it a couple of times. The desert landscape was truly gorgeous, and the generous cloud-cover meant that we never suffered under the heat of the sun.

We saw almost no wildlife (unless you count trail runners as wildlife), just a few birds and a few bugs. Comparing one of those bugs to this infographic tells me that we may have found an Arizona Bark Scorpion. He was hiding under a random rock I picked up to inspect. I assumed he was a harmless baby, but the web tells me otherwise. Apparently Bark Scorpions are the most dangerous scorpion in the US, and the venom is quite poisonous. So yeah, be careful which rocks you pick up while in the park.

Here's a few tips that I'd wish we had known about the Sunset Loop Trail before starting it:

  • While the trail does connect the Lower and Upper Sunset Trails, it starts on the Bike Loop trail. To begin the hike, head North West from the parking lot to find the Bike Loop Trail.
  • I missed that the trail incorporates Bike Loop and started us off by taking a trail down from the Overlook near the parking lot area. That trail took us to Lower Sunset Trail, it's just not what the hike calls for. We were able to re-join the recommended hike by following the Lower Sunset Trail North.
  • Nearly all the trail junctions lack usable signage. Most contain no signs, some contained numbers that didn't mean anything to us. There's also no blazes or trail markings to be found. So do be careful that you don't wander off trail.
  • Despite being named the Sunset Loop trail, the route leaves the Lower Sunset Trail and heads off into territory that the map shows no trail for. We found trails to follow out there, but they required Shira keep an extra close eye on the GPS to make sure we were on course.
  • The Upper Sunset trail is appropriately named, as it takes you up onto a ridge. This makes the last mile or so of the hike physically more challenging than all the previous miles. The views from the Upper Sunset trail are well worth the effort. The trail never gets especially technical and my fear of heights never kicked in.
  • The route is marked as Hard, and I'm not entirely sure it deserves that rating. The lack of blazes and the fact that the route leaves established trails does make this one trickier to follow. And the Upper Sunset Trail will get your heart pounding while climbing onto the ridge. But there was nothing technical or terrifying about this hike, and it wasn't especially long.

All in all, it's a great hike and was a terrific way to soak up some desert rays!

Thursday, October 11, 2018

A Travel Photography Checklist

Inspired by my Digital Packing Checklist, I decided to make a similar one for photo gear.

Deliberately walking through this checklist, I've found I can sidestep a number of photography traps. From the annoyance of DSLR pictures with incorrect timestamps, to the agony of capturing important photos with the quality setting set to low, to a smattering of issues in between, this list has me covered.

I'm careful to review this list for each camera I'm bringing, though obviously some steps don't apply to some devices.

  • Clean lenses and look for damage.
  • Consider replacing UV filters used to protect lenses.
  • Insure batteries are fully charged, and noted as such.
  • Insure the date and time is properly set.
  • Set the timezone where you'll be shooting pictures. Insure the daylight saving option is correctly set.
  • Review photo quality setting, insure the highest quality setting is selected.
  • Review the age of SD cards and consider replacing them.
  • Purge SD cards of old photos.
  • Purge backup areas of old backups.
  • Run your photo backup procedure, insuring all cards are backed up.
  • Check cloud backup settings to insure 'Original' photos are being saved. Review Roaming and Upload over Cellular options.

Happy shooting!

Wednesday, October 10, 2018

Courage, Bravery and Life Before GPS

I'm making my way through Phantom Warriors, a series of stories about Long Range Reconnaissance Patrols that operated during the Vietnam War. It's hard to overstate how remarkable these stories are. Take your most riveting, white knuckle adventure movie, add it to the most courageous, brave and skilled characters you can imagine, and you still won't match the tales in this book. It's that good.

One observation I've had while reading this book is how modern a war Vietnam was. The soldiers have relatively reliable communication systems, air support from helicopters and fighter jets, on-demand artillery and plenty of on-person fire power. One obviously lacking piece of tech: GPS. While in the field, soldiers had to depend on map, compass and protractor for their navigational needs.

Under ideal circumstances, this meant navigating thick jungle for days without established routes. But these soldiers never operated under ideal circumstances. Walking in a straight path was a recipe for being ambushed, so they followed strategies to randomized their path. To avoid discovery, they avoided well known trails. The consequences of getting it wrong could be deadly; from a missed landing zone to calling in artillery fire on your own position. And all of this navigation needed to be completed under massive stress. It's one thing to subtract two angles in a classroom, it's altogether a different prospect when someone is shooting at you.

Like I said, these guys had mad skills.

Inspired by the living history community's philosophy that hands on activities are the best way to understand the past, I downloaded FM 3-25.26, the Army Land Navigation Manual, grabbed a few paper maps and started playing around. What better way to appreciate the challenge of map and compass navigation than to try it out?

Here's a few take-aways from this experiment:

Margin notes are key. In classic bureaucratic style, FM 3-25.26 lists 23 different pieces of information that are contained in the margins of a military map. Can you think of anything more mundane? Yet, to my surprise the physical maps I'd grabbed off the shelf had many of these same pieces of information. And more importantly, many of the notes were quite useful. I'd never stopped to consider them, writing off much of the text as fine-print legalese.

Latitude and longitude math is painful. One of the table top exercises I went through was deriving coordinates from a position on a map and finding a position on a map given a set of coordinates. I did this using the Monongahela National Forest map, which is marked off in 0°7'30" intervals. I found myself needing to answer questions like: What's 5/11ths of 0°7'30"? The answer: write some code to find out.

I grabbed my cell phone and coded up a quick Scheme library to work with degrees, minutes and seconds (DMS). You can find the code for the library here. Here's an example of me using this code to derive coordinates that are 5cm above, and 3.75cm to the left of a particular point on the map:

 (let* ((grid-size (dms->sec '(0 7 30)))

        (lat (sec->dms (+ (dms->sec '(38 52 30))
                          (* grid-size (/ 5 11)))))

        (lng (sec->dms (+ (dms->sec '(79 37 30))
                         (* grid-size (/ 3.75 8.5))))))

   (string-append (dms->string lat "N") ", "
                  (dms->string lng "W"))))

While this exercise is simple math (it's all based on proportions), I found every possible way to screw it up. Which leads me to my next point.

The UTM grid is awesome. After futzing with latitude and longitude, I quickly came to appreciate the value of the UTM grid. Being able to work in meters, rather than DMS values, is such a win. The Military Grid Reference System, which sits on top of the UTM, is also quite clever. I love the notion that you can lop-off digits from a series of coordinates to give a rougher, yet still valid, description of a location.

As I've poked around maps, I've also come to appreciate that UTM Grid isn't the only game in town. The USGS Virginia Map, for example, notes the presence of the Virginia and Maryland Coordinate System which is marked off in 100,000 foot increments. This tidbit is in that fine print I'd normally gloss over.

My little experiments may expose a bit of the how these soldiers were able to accomplish their task, but the fact that they did it so routinely, and under such difficult circumstances only underscores their remarkable skill and courage.

Next up: I need to get out into the field and try some of these techniques. Preferably without someone shooting at me.

Tuesday, October 09, 2018

Wait, That Can't Be Right. Can it?

Over the weekend, while walking along the Mall, the group I was with spotted this guy:

I do believe that's an albino squirrel! It even had red eyes to match its white fur. Apparently, seeing white squirrels in DC isn't unheard of, but still they're rare. I'd certainly never seen one.

There was a family next to us, and as if to check my own sanity, I asked them if they'd ever seen a white squirrel. Their response: we're from Australia, until last week we'd never seen any kind of squirrel.

The next day, while driving across the Woodrow Wilson Bridge I spied a distinctive looking plane along the Potomac river:

Given the color and size of the plane it seemed like it was almost certainly Air Force One. But, and I double checked this to be sure, there's no runway anywhere near where it was parked. And even if there was one, what would it be doing there?

A quick Google search explained the mystery. What I was looking at was a replica of Air Force One, not the real one. Still, I'm surprised that I could recognize this plane from so far off.

Apparently, starting on October 19th, you can tour the replica and get a sense of what it's like to truly travel in Presidential style.

Thursday, October 04, 2018

A Little Mid Flight Color Hacking

While I work with colors all the time while building apps, I still have questions. What's the best algorithm for fading between colors? Is there an optimal way to randomly select a color scheme? How can you programmatically decide what color text is legible on a given background?

I used one of the flights this last summer to build a small JavaScript library to let me investigate these questions. Because I was mid flight while building this code, it meant that I was programming this on my Galaxy S9+ phone without the benefit of the Internet. This library was less about building a production tool and more about fully understanding a topic.

While planning out the library, it occurred to me that I could get by with two core components: an abstract representation of colors and a classic 'fold' function. Implementing a representation would let me stop thinking of colors as hex sequences (#A23F40) and start thinking them as a cluster of red, green and blue values (say, 63% Red, 18% Green, 25% Blue). The fold function is also a no-brainer, as it lets you implement map, filter, for-each and countless other functions by cleverly providing a different function and init value.

In terms of implementation, given the graphical nature of the task, it seemed programming directly in JavaScript would be ideal. But that led me to one of my first challenges: how can I get the browser on my phone to effortlessly load a particular JS file?

A solution came to me in the form of the utilitarian, yet powerful, kWS web server. This app turns your phone into a web server, hosting the directory of your choice on the port of your choice. In my case, I configured the server to show /sdcard/Projects on port 8080:

With the server running, I created a simple bootstrap HTML file:

I was able to execute main.js by visiting: http://localhost:8080/color_hacking/. Thankfully, there's no caching, so every change requires only a simple browser reload to view it.

With the development strategy figured out, I went to work building my library. First off, I tackled the representation issue by implementing cpack and cunpack. This let me write code like so:

var bg = cunpack("#A23F40");
var inverted = { red: 1 -, green: 1 -, blue: 1 - };
var hex = cpack(inverted);

cfold was even easier to write. This function takes in a start and end color, a number of steps to transition the colors, an initial value and function which is delivered each of the color steps. Here's an example of generating 100 different colors between #0000AA and #FFAA00:

var html = 
  cfold("#00 00 AA", "#FF AA 00", 100, "",
       (html, color) => {
        return html + "<div style='height: 3px; background-color: " + cpack(color) + "'></div>\n";

You can find the complete source code for the library here.

This was a fun exercise. While I still have my questions from above, I've got a clearer understanding as to how I might solve them, and I've got a handy library to help. If nothing else, working with kWS has added a new tool to my mobile-development toolbox.

Here's some screenshots that were generating using my library:

Wednesday, October 03, 2018

Dave Chappelle - From Cruel and Insensitive to Brilliant and Thought Provoking

Dave Chappelle's How Old is 15 Really? starts off irreverent and gets downright cruel from there. But wait for it, he delivers a surprisingly poignant bit of commentary by the end:

This video is as relevant today as it was when it was posted 9 years ago. And while we may be living in the golden age of comedy-as-education-vehicle, it's still impressive when this is done right.

Put another way: want to change the world? Use what got. And as Chapelle shows us, if you've got jokes, that will do nicely.

Thursday, September 27, 2018

Review: Drawing with Children

I reluctantly checked out Drawing with Children by Mona Brookes from the library. I've experimented enough with sketching to be confident that what's holding me back isn't a particular skill or bit of wisdom, but the commitment to practice, practice, practice. At least, that's what I assumed. Still, I have a firm policy when visiting the library: if a book sparks even the slightest interest, I check it out.

When it comes to learning to draw, I'm a fan of Danny Gregory's approach. I'm oversimplifying here, but it essentially works like this: learn a few basic concepts and then practice daily. Eventually, you'll start creating drawings you're proud of.

As I perused Brookes' Drawing with Children I realized that her method falls on the other end of the structured-learning spectrum. She covers topics from creating an art-friendly environment, to specific language students can use to analyze subjects. She provides exercises and specific works to draw that maximize a learner's chance of success.

Some may chafe under this regimented approach, but I've grown to see it as something quite positive. Through carefully planning Brookes has flattened the learning curve of drawing. If, for example, I had the opportunity to teach my niece to draw I'd almost certainly use Brookes' approach.

But the impact of Drawing with Children on me didn't stop there. It provided me with nothing short of a sketching epiphany. On page 114, in classic Brookes style, she spells out a 20 step algorithm for creating a drawing. This starts with warm-ups and ends with finishing touches. In her recipe she instructs students to start with a central point and build out from there. You see this approach in the sample drawings in the book. For example, one still life starts by drawing the knob which sits on top of the tea pot, which is one of the primary objects in the scene.

I realized this is exactly the opposite strategy I've been using for drawing. I've been attempting to draw the bounds of the scene and fill in detail from there.

Consider these objects:

I'd normally attacking this drawing like so:

The problem with this strategy is that I need to maintain a mental map as to how the contour lines I've drawn correspond to the scene. Compare that to Brookes' method, which focuses on drawing the focal point and building out from there:

I had assumed my frustration with drawing was lack of practice and general anxiety about failing. Instead, I realized I'm just trying to hold too many complex ideas in my head at one time. Using Brookes' approach, I was able to finish the sketch with relative ease:

The contour-approach I started above clearly has value. I think the proportion between the phone, medicine bottle and Lego-character is more accurate than my second attempt. But what good is accurate proportion if the process is mentally exhausting?

Perhaps I'll graduate away from Brooke's approach, but for now I'm telling you, this is a game changer.

Friday, September 21, 2018

micro:bit + Espruino + Android = The Cutest REPL You'll Ever Interact With

If you have an Android Phone and a micro:bit, then have I got an experiment for you. Grab your micro:bit, phone and a USB Host on the Go adapter.

On your phone, install the Serial USB Terminal app. On the micro:bit install the espurino JavaScript interpreter by coping the relevant hex file to your board. Using the adapter, plug the micro:bit into your phone. If you have the correct type of USB cable, you should see a screen like this:

Launch the Serial USB Terminal. Under settings, make sure that the USB device is detected and 9600 baud is selected:

Now press the reset button on your micro:bit and you should be greeted by the following message in the terminal:

Your micro:bit is now playing the role of a JavaScript REPL! As noted here you can trivially turn on LEDs, detect the state of buttons, interact with the compass and accelerometer and generally hack away like you would on any other JavaScript console. But the code is being executed on your micro:bit! Here's me playing with the following code:

> i = 0;
> tick = function() { };
> setInterval(function() { tick(); }, 200);
> tic = function() { show(i++); }

I'm amazed at how easy to install and functional espruino is, and I'm impressed that the Serial USB Terminal Just Works. Using this setup I can program my micro:bit on the go, no desktop environment or compilation system needed.

There's obvious room for improvement. Serial USB Terminal forces you to enter code in terms of lines which is a limiting environment to code in. In an ideal world, I'd interact with the USB serial port via Termux and emacs, then I'd be in programmer heaven. The micro:bit is also a tiny platform to be working on, though that can be addressed by upgrading to a ESP32 chip. This chip is far more robust (WiFi anyone?) and runs Espruino as well.

I've always wanted a mini-me sized stand alone computer that I can program in the field. And now I do!

Thursday, September 20, 2018

Cheering on Yorktown Football

Yesterday we cheered on M. at his first home football game. Yorktown almost pulled out the victory, but was unable to close the gap in the final seconds.

Go Patriots!

In other news, check out M.'s height advantage over Shira!


Related Posts with Thumbnails