Sunday, July 16, 2017

A Sailboat in our Microwave - Adventures in Sneaky Art

We have a good friend's 8 year old visiting us, and before his arrival I checked out Sneaky Art: Crafty Surprises to Hide in Plain Sight. Shira had to step out for part of today, which made it the perfect time to put the book to use.

The idea behind Sneaky Art is to create whimsical little projects that will bring a smile to an unsuspecting individual. Just like this guy did at the entrance to the Pentagon. The book offers 24 different ideas to get you started on your career as a sneaky artist.

The first project we tried was crafting a tiny sailboat. We cheated a bit, opting to use rubber bands and tape instead of glue to hold everything together. But the result was, after just a few minutes, a craft ready to set sail. After mulling over our hiding options, we decided to float the S.S. J.J. in a bowl of water in the microwave for Shira to discover. Action shot!

We tried a few of the other projects too, with the cupcake wrapper fortune cookies being another hit:

These were even easier than the boat to make: fold cupcake wrapper, tape and stuff in a strip of paper with a fortune written on it. For bonus points, add some lucky numbers on the back of the fortune.

We had fun both making the creations, and watching Shira discover them. We haven't yet experimented with leaving art projects for the public to find, that's up next.

While I'm a fan of nearly any kind of crafting, I think Sneaky Art is really on to something. When the topic of art comes up, we often focus mainly on mastery of technique. Sneaky Art gives kids (and really, anyone) a chance to focus on impact: how did your creation make a loved one or stranger feel? This is huge as it frames art as a tool to effect change, not just something you work to get good at. In other words, it's not just a tiny sailboat floating in a microwave, it's the seeds to change the world through the power of art.

Thursday, July 13, 2017

Indoor Ballistics: The catapult you need to build today

Did you know that you're only 14 craft sticks and a handful of rubber bands away from having a functioning catapult? It's true! The source for this project is 101 Kids Activities That Are the Bestest, Funnest Ever! (thanks Elana for getting the book for me!), but you can find versions of it all over the web.

Here's what our version came out looking like:

And here's an action shot!

Destruction was never so much fun!

If anyone asks, we built this as a STEM project, and not as a tool for bringing down the Tower of Doom used by Pirates and Ninjas.

Wednesday, July 12, 2017

Weekly Discoveries - On Location Guitar Awesomess, Create your Own 8-bit Music and a 9 Minute Rock Fest

The last couple weeks have been crazy, so here's a twofer: last week's Weekly Discoveries and the week's before. Enjoy!

Apparently dragging a guitar, amp and other equipment out to a beautiful location and playing ambient music is a thing. And it's an awesome thing at that. Check out these examples: Ambient Song #22, AMBIENT GUITAR XIV - Garden #3 and Your Head is a Living Forest. You'd think that once you heard one droning guitar in the wilderness you heard them all, but this isn't so. These videos are both relaxing and quite interesting. It's a genre worth checking out.

Along this theme, check out Arli Ambient Guitar Soundscapes Looping Pedal Demonstration, which shows how one guy can make incredible sounds using a guitar, looping pedals and a few accessories. His on the fly creation is quite remarkable.

I know it's so mainstream, but I'm loving Thunder by Imagine Dragons. OK, the video is a bit too wacky for my taste, but the song is awesome. They keep producing awesome rock-out-music. How do they do that?

Apparently I'm a sucker for clever dancing music videos, and K.Flay's High Enough delivers in that department. The fact that the whole video plays out in a cramped camper only increases my respect for the dancers involved.

I'm not using a fan of 9 minute songs packed with guitar, keyboard and drum instrumentals, but Death of a Coyote Woman by All Them Witches is getting me to re-think my position. This song rocks. It shouldn't work for me, but it does.

You should really take the time to listen to all of Chuck Cannon's songs over at EOP Live. There's plenty of creativity in his songs, and he's got the voice to make them sound great. It was a toss up as to which song to add to last week's Weekly Discoveries. Ultimately, I chose Money Don't Matter, but I could easily have picked half a dozen others. At the moment, Money Don't Matter has 35(!) views. In a universe where a song can have millions, if not hundreds of millions of views, it's easy to forget that there's plenty of music out there that isn't getting much of any love at all.

This last week's discoveries include two videos that talk about creating 8-bit music. One takes the approach of using a JavaScript library, and the other uses beepbox.co. If you're interested in creating 8-bit music (of course you are!), then these two videos provide a simple, non-musician friendly way, to get in the game. Beepbox.co is an especially clever solution, because all you need is a browser window and you're off an running. See, here's what you get if you spend 20 seconds creating a tune. Cool, right?

Check out all the discoveries here and here:

Tuesday, July 11, 2017

TRS-80 Model 100 Hacking - Getting Connected

While it was fun firing up my Dad's TRS-80 Model 100 and writing a bit of code for it, I was left with a choice: leave this as a fun little experiment, or continue hacking away. After weighing the alternatives, I've opted for the latter: let's hack on the Model 100!

I made this decision for two reasons. First, I've always had an interest in playing with small systems. I could easily imagine an Arduino chip and simple form of output (maybe an LCD, maybe just a bunch of LEDs) that would let me run Forth or Lua in an embedded way. It would be sweet to see how much functionality I could wring out of such a small platform. Heck, the pieces are almost there to make this a wearable. Just imagine it: a watch running on your wrist that was little more than a Forth interpreter? Alas, the devil is in the details, and I've never found quite the right combination of hardware to justify jumping into this project.

The TRS-80 Model 100 is one form of this this hardware dream. Think of it as a computer, and it's a joke. Think of it as microprocessor, plus a simple LCD screen and a keyboard, and it's exactly what I describe above. Why build my own embedded system when I have one right in front of me?

Maybe one day I'll get to that Lua or Forth powered watch, but for now, I've got plenty I can learn about embedded systems right from the Model 100. Heck, the Model 100 is powered by an Intel 8085 processor, which was apparently used in the Mars rover Sojourner. If it's good enough for NASA, it's good enough for me.

The other reason to continue to hack on the Model 100 is more philosophical. In some many ways, the computer is a collection of constraints: it has a tiny amount of RAM, a terribly slow processor and is powered by horrendous programming language (line number BASIC). But, as any Haiku author or Twitter novelist can tell you, constraints bring out creativity. My hope is that by learning to operate in such a hostile environment, I'll stretch my skills and change my perspective as a programmer. At the very least, I'll be more thankful for the modern hardware and programming languages I have at my disposal.

OK, so I'm doing this.

The next challenge to tackle was finding some way to hook the Model 100 up my computer to transfer files. I figured if I could set up a basic serial connection, then I can be confident that I can use the Model 100 knowing that I can publish and save my work with relative ease. A google search on the topic came up with some interesting leads, but it was ultimately this article that saved the day: Surfing the Internet… from my TRS-80 Model 100. Sean Gallagher had a more audacious goal than me: he want to surf the web from his Model 100. I just wanted to send bytes back and forth to another device.

The invaluable recommendation in his article was to suggest that you can buy the necessary null model cable to connect a Model 100 serial port to a USB device at RetroFloppy.com. I headed over there, and at 12:26am dropped an e-mail to the company asking for advice. I specifically linked to Sean's article.

12 minutes(!) later, I had an e-mail back in my inbox. David at Retro Floppy told me exactly what I needed, and even confirmed the cables used in the article. Now that's customer service! I bought the cables and waited.

A few days later, the cables showed up, and I was eager to see if I could get my Mac and the Model 100 to exchanges some bytes. Everything fit when plugged in. That was a good sign.

This StackOverflow article suggested a few apps for doing low level serial communication on a Mac. From the command line, I ran:

sudo screen  /dev/tty.usbserial-A105ZB14 9600

On the Model 100 side, I opened up Telecom. It took a few tries, but I was able to use the Stat command to setup the device in use. I typed Hello World on my Model 100 keyboard, and text appeared in the screen session! It was corrupted, putting some junk between each character, but it worked!

Rather than debug this further, I downloaded and kicked off Serial. It allowed me to select the USB serial port and showed me what settings to use (9600.N.8.1). I set those values on the Model 100, and tried connecting both again. Success!

We've got the world's most primitive data connection!

That's all I had time for today. Next up, I need to figure out a reliable way to transfer files between the two devices. And once I've done that, I can start on my first hacking project: doing music creation on the Model 100.

Thursday, July 06, 2017

Review: Flying Lessons and Other Stories

A few weeks back, at around 2am, I was done programming but too wired (if you'll pardon the pun) to fall asleep. So I did what I often do and opened up Overdrive, rented an audio book and set it to play for 30 minutes while I dozed. I've done this in the past, and I usually try not over-think what book I listen to. I grab the first one that looks interesting, and it's usually good enough.

Imagine my surprise and delight when I randomly picked Flying Lessons and Other Stories and fairly quickly discovered that I had stumbled on a gem. As is my usual practice, I skipped listening to the introduction, and just jumped into the book.

It didn't take long for me to realize that I was listening to a collection of short stories. After more listening, I realized that they were all targeted to kids. And finally, in the credits of the book, I learned that this book was published in partnership with WeNeedDiverseBooks.com. Sure enough, all the stories involved kids who would be defined as some sort of minority (be it based on skin color, ability or something else).

One of my favorite joys is starting a random book and slowly having the story come into focus. With this collection of short stories, I got to experience that effect over and over again. And in all but one story, I found myself truly loving the tale. At the end of each story I kept thinking, man, how did the author do that? I felt totally invested and connected to these characters, and yet, these were all short stories. Whatever devices the authors used to give the illusion of a sweeping story arc worked well.

Amazon reports that this book is targeted to ages 8 to 12. I'd quibble with that, because as an adult I thoroughly enjoyed it. But still, on the surface it seems that writing short stories for kids wouldn't be that tricky. They're short, after all? And they're kids, how much depth can they expect from a story?

And yet, even a cursory examination of this task makes you appreciate how tricky it is. As I mentioned above, these short stories don't feel short. That means that the author needs to work overtime to make a brief text seem much longer. And theme wise, targeting kids isn't so easy either. Go too light, and kids will recognize it as patronizing and uninteresting. Go to deep, and you'll loose kids. The stories in this collection seemed to nail this aspect. There's traditional kid themes, like fitting in at school and dealing with a crush. But there's also dense topics, like racism, poverty and the death of a parent to deal with. Whether it's the lighter stuff (which, to a kid, isn't light) or the heavy stuff, the book manages to find the right balance of treating these themes with respect, yet, keeping it age appropriate.

The diversity aspect of this book is another tightrope to walk. Do you shun all stereotypes, or embrace them? Again, the book seems to find a good balance here, both rolling with, ignoring and at other times challenging stereotypical behavior.

In the closing chapter of the book, where I got confirmation that diversity was a key theme in the stories, I learned about the work of Walter Dean Myers and a pivotal op-ed he published in 2014: Where Are the People of Color in Children's books? I'd highly recommend taking a few minutes to read the op-ed. Meyers makes a strong case for how diversity in books isn't just important for minorities, but for those kids who count themselves in the majority.

I've already picked up a copy for a friend's 7th grader who remarked to me that he didn't yet have firm reading plans for the summer. I'll have to get him to give me his own take on the stories and share them here.

Wednesday, July 05, 2017

A Digital Walk Down Memory Lane: Hacking the TRS 80 Model 100

Any list of Greatest Computing Devices of All Time needs, in my opinion, to feature the TRS 80 Model 100 near the top. My Dad had one of these laptops growing up, and it was truly revolutionary. It was remarkably light (especially when compared to the Luggable of the day), ran for 20 hours on 4 double AA batteries and had an exceptionally high quality keyboard (even by today's standards). It included a built in 300 baud modem, which meant you can shuffle data on and off the device either by serial port or telephone line. In exchange for these remarkable features, you had to deal with a screen that was a measly 8 lines, and a system with 32KB of storage. (Though apparently, both of those limits were hackable to some degree.)

A couple of weeks back my Dad gifted me his original Model 100. In my experience, most computing hardware doesn't age well. What was once cutting edge tech, turns into bulky, plastic junk through no fault of its own. But not the Model 100. Slipping it from its black leather-like case, I couldn't help but feel like I was still holding a premium piece of computing tech.

(The banana is provided for scale)

I popped in 4 AA batteries, flicked the on switch, and the device immediately snapped to life. Oh yeah, I had forgotten that the Model 100 had nearly instantaneous 'on' with effectively no noticeable boot procedure.

I'd always thought of the Model 100 as the ultimate writer's tool, as it provided a high degree of portability with nothing to distract the author.

But, having spent a little over an hour playing with the device, I have a new found respect for it. This is a geek's dream. The computer appears to be essentially a Basic powered Read-Eval-Print-Loop. Sure, there's a text editor, and some sort of address and scheduling app, but really, this computer is little more than a Basic interpreter. There's no shell of any kind, just a Basic prompt. Want to delete a file? Use a Basic expression. Want to set the current time and date? Again, execute some Basic.

The quick reference guide for using the computer is a Basic programming reference manual, which hearkens back to a day when you really had to read the manual.

The Basic interpreter wasn't just a crude OS shell. As books like 44 Programs for the TRS-80 Model 100 Portable Computer show, it was intended to let you whip up little apps like you might find on your computer and phone today. Want to do cash flow analysis, calculate earnings on your investments or keep track of your running? A little Basic program was the answer.

I typed in the 'Daily Codes' program from the above text, and sure enough, it worked:

The codes program generates random numbers which can be used by a business as a 'secret' code for the week. Man, it must have been sweet to spend a few minutes typing this program in and then have the compute take over this tedious task.

I also experimented a bit with having the computer generate tones. I had high hopes of having it generate some musical tunes, but alas, I got stuck on it and decided I'd sleep on the problem for now.

After having fiddled with Basic for an hour, I have to say that using a line-number based programming language seems like an exceptionally idiotic choice. Either forth or lisp, both of which existed in the 1980's, would have been an infinitely better option than Microsoft Basic. There's a certain simplicity to GOTO 250 I suppose, but there's almost no support for modularity of any kind, which means that the system simply can't scale.

But the real demise of a programming environment as Kill App has to be the spreadsheet. Even the most primitive spreadsheets could trounce Basic (and other programming languages) in terms of ease of use and business-problem-solving bang for their buck.

Despite Basic being a nightmare, I'm still impressed with the device and what the makers were trying to accomplish.

But what's the next move? Do I find a way to hook up the Model 100 to my desktop or cell phone over a serial connection? Getting data on and off the laptop is going to be essential to using it. Once I can do that, I can install forth on it and potentially have a far better programming environment at the ready. And then? Oh, who knows.

Regardless of how functional the Model 100 is today, I'll say that it's definitely been an interesting glimpse in the past of computing and no doubt still has room to inspire.

Monday, July 03, 2017

All-Business - An info first watch face (including my wife's current mood)

A couple of weeks back I heaped major praise on WatchMaker for being a sweet development tool for Android Wear watches. My first attempt at building a watch face for my Zenwatch 3 showed that I could write modular and interesting code that ran effortlessly on my watch. What it didn't do is provide me with much of a usable watch face.

With a bit more work, I was able to correct that. I give you my very first usable watch face: All Business. Let's walk through it (clockwise, of course):

690 - The current number of steps I've taken according to my phone's pedometer. The Zenwatch 3 has a pedometer built in, and WatchMaker allows easy access to this value, but the numbers seem absolutely random. I'd walk 50 steps and the watch wouldn't recognize any movement, or I'd be sitting at the dinner table and notice that I'd taken 6 steps. The algorithm the Zenwatch uses may ultimately be OK. Perhaps over a day, it's reasonably accurate. But my LG G6's pedometer is scary accurate. Walk 10 steps, register 10 steps. To power this number on the watch, I use Taser. Effectively, every 10 steps taken on the phone, I push the value to the watch.

Pressing the number of steps clears it. This allows me to use the step count for individual activities, and effectively makes the watch face interactive.

2017 - The current year.

11:22 - The current time in UTC. Useful for dealing with other programmers I work with overseas. My initial instinct was to add an AM/PM designation to the time, but as a Pebble watch face taught me earlier, I don't really need it. I don't tend to wake up in windowless rooms without any idea of what time it is.

20:37 - The time the sun will set this evening. Pressing this value triggers a Tasker Action which sends Shira my current location. Useful if I get abducted by aliens, or if I'm running late.

99% - My phone's current battery level.

Sun Icon - The current weather graphic as provided by WatchMaker. Pressing this icon explicitly refreshes the weather data on the watch.

99% - My watch's current battery level.

85°F - The current temperature in my location.

7:22 - The current time. Again, there's no AM/PM designation to save space.

Mon Jul 3 - The current date. Pressing this value launches OK Google on the watch. I'm still figuring out the fastest way to get answers from the watch, and this may very well be it.

While not especially sexy, I've found that the above cover most, if not all, my watch informational needs. But wait, there's more!.

While I was describing my new watch face to Shira, she suggested I build something in where she could send me an emjoi to feature in the background of the watch. I couldn't think of an easy way to do that, so I went a different route. I've setup a web page that uses AutoRemote and Tasker to allow Shira to set the background color of the watch at any time. In other words, she can express her current mood on my watch face, whether she's next to me or 2,000 miles away.

My original plan was to pickup the color via an SMS message. However, Google's SMS replacement (RCS) is apparently not compatible with Tasker's SMS handling. The result is that when Shira would send me a text message, it would be invisible to Tasker. Ultimately, I think using AutoRemote is a better solution anyway.

So there you go, a fully functional watch face with a few extras.

I still think WatchMaker is a sweet tool, and I'm really impressed with how effortlessly it integrates with Tasker. If you can imagine it, Tasker and WatchMaker can turn it into watch face.

Friday, June 30, 2017

Weekly Discoveries - Electro Swing, Amazing Dance Moves and Kosher Spam

Zebra Corner's take on popular commercials, like Chevy's Millennials is just too perfect. I found the video randomly and it could a couple of watches to realize that he was using Chevy's footage verbatim. Too funny.

I managed to find myself in the world of Swing Music last week, and spent quite a bit of time rocking out to Electro Swing.

One of my favorite videos from the Swing genre has to be Catgroove by Parov Stela. This video is remarkable: to the untrained eye, it appears to be some dude dancing to music in his basement. His dancing is good, I'll grant you that. But what's amazing is that the video has 40 *million* views. I love that I live in a world where someone can amass 40 million views by dancing on lime green carpet with wood paneling in the background.

It's interesting to see how quickly you connect the dots from swing to dubstep; it's all about having the moves.

The tune Bei Mir Bist Du Schoen is a solid one, but the story behind it is even more impressive. The creators of this Yiddish song apparently sold the rights to it for $30 (which they split evenly, as a couple of mensch's would no doubt do). The song was eventually performed by the Andrew Sisters, who turned it into a hit and in the process were the first female vocal group to earn a gold record. The song grossed $3 million dollars. OK, not the most brilliant business decision ever made by a couple of yids.

Say My Name by Peking Duk opens with the pick up line: On a scale of one to America...how free are you tonight?, so yeah, you know it's going to be good. And it didn't disappoint.

The Hilltop Hoods, an Australian Hip Hop Group, has an awesome sound. Check out Higher for a great example. Their song Cosby Sweater is also a solid entry, though Higher seems a bit more serious.

Meet the Canjo, tin-can powered, single string, banjo. What an awesome instrument. This video shows how one can be created in a mere 20 minutes. It's really impressive to watch some spare parts be turned into a music instrument and then listen as a beautiful tune is extracted from it. Here's another great example of this instrument in action.

Not only did I get an introduction to music theory and a better appreciation for how string instruments work, the Canjo also introduced me to Breef - the Kosher variant of Spam. Apparently using a Spam can is pretty common for Canjos, and in doing a bit of research I came across mention of a Kosher version of Spam.

In May 1946, the Chicago Kosher Sausage Manufacturing Company — a Winnipeg-based company — registered a word mark with the Canadian patent office for a canned meat product called Breef.

Neil Feinberg, 74, the last owner of the Feinberg Sausage Co. in Minneapolis, says he’s well familiar with Breef.

"That was the best quality product of the bunch” among kosher canned meats, he says.

“Canned corned beef is like Spam — very similar texture,” explained Feinberg, 74, who is retired and living in Palm Springs, Fla. “Only it was made of beef and had a corned beef flavor to it,” an effect achieved by using the same seasoning from the company’s regular corned beef.

Canned Kosher corned beef, now that's innovation.

See all the videos here:

Thursday, June 29, 2017

Making Toasted Corn Sludge - A Superfood Of Its Day

After having successfully survived eating year old home-made hardtack, I was psyched to see that Jas. Towsend and Son had a new series for me to try: preparing and cooking parched corn.

Parched Corn, like pemmican and hardtack was a super-food in its day. Not because of it was so nutritious or tasty, but because it was cheap to make, relatively nutritionally dense, quite portable and had a long shelf life.

Here are two sources that describe how parched corn was used. First, from American Indian Corn Dishes by Muriel H.Wright:

Botah Kapussa (Cold Flour) : Shell corn from the cob when the grain has reached the stage where it is firm but not dry. Place the shelled corn in a large pot of hot ashes, keeping the pot over coals of fire until the corn is parched a golden brown, in the meantime stirring the grain to keep it from scorching. Put the corn into the fanner, and clean off the ashes. Next pound the corn in the mortar until the husks are loosened. Again clean out the husks from the grain in the fanner. Beat the clean corn into flour in the mortar. This parched corn flour may be sweetened with enough sugar to taste. Add enough water to dampen a small serving, and eat as a cereal. A small amount of botah kapussah will go a long way as food.

In tribal times, the Indian hunter took a small bag of this unsweetened food with him on long expeditions, often traveling many days with nothing else to eat except botaic kapussuh, a little at a time generally mixed with water. This cold flour was a boon on a long hunting expedition because a small amount was nourishing, and a bag of it was light and easy to carry.

And here's one from encyclopediavirginia.org:

For travel, some Indian families carried dried venison, but most preferred rockahominy: dried parched corn that was beaten into powder and thus easily carried in a bag. A few handfuls of rockahominy, with water scooped out of trailside streams, served as an entire meal. (Europeans would later add sugar to the mix for palatability.)

Tales like these had me convinced: I needed to parch some corn, and perhaps add it to my hiking / backpacking diet.

Parching corn didn't look that hard, you take dry corn, toast it and then grind it up. But where does one find dried corn? Fortunately, I found this citified recipe on the web. It called for taking frozen sweet corn, dehydrating it, and then tossing it into a frying pan to parch it. So that's what I did.

While dehydrating took hours, it wasn't really a lot of work. What was surprising was that when I was done, the dehydrated corn was pretty much inedible. This wasn't looking so promising.

I then grabbed a frying pan, sprayed a bit of olive oil Pam in it (probably too much) and dropped in some dry kernels. I then turned on the heat and waited. That was a bad idea, because I definitely ended up over-cooking the first batch. But once I got the hang of shimming the pan around, I could see how you could toast the corn without burning it.

When I was done with the parching process I had two batches. One of these batches I dropped into our hand blender's chopper and zapped it for 30 seconds or so. Here were the results:

Over the next couple days I noshed on my creation. I mixed boiling water with the powder to make a sort of sludge, while the larger kernels I just ate by the handful.

The good news is, parching the corn made the inedible dehydrated kernels quite edible. And they were nice and dry (minus any extra olive oil), so I could see how this could resist spoilage. In terms of taste, it was OK. The sludge was definitely palatable, and if I were eating it at the end of a long day of hiking, I'd have rated it a 10 out of 10. But in my kitchen, it was just OK. Nothing special. It was like eating toasted corn sludge, which of course, is all it was.

Snacking on the larger kernels grew on me. Again, they weren't heavenly, but I could totally see paying a ridiculous sum of money at Whole Foods for the privilege of buying a bag of this stuff.

Will it get added to my backpacking menus? Hard to say. But I can report that this was an awesome culinary experiment and recommend you try it. That, and I have even more respect for the Indian hunters who lived off a handful of this stuff a day.

Wednesday, June 28, 2017

Surprisingly Simple: From Cassette Tape to mp3

A few weeks back I re-discovered a few mix tapes that Shira had made for me back when we were dating. While mix tapes were definitely a thing while we were growing up, I was never into music enough to think to create my own.

I do, however, have a dim memory of the neighborhood kids sitting around with a tape record placed next to a radio. When the song came on that we wanted to add to our musical collection, someone would quickly hit the record button and we'd be good to go. It was Napster before there was Napster. In this dim memory, I recall hearing Fast Car, by Tracy Chapman being over-played on the radio (yeah, they did that back then, too). Wikipedia tells me this song was released in April of 1988, when I would have been 12 - so that sort of all checks out.

Anyway, I had these now precious cassette tapes in front of me and I realized that our anniversary was fast approaching. I thought man, wouldn't it be brilliant to digitize these bad boys for the big day.

My first thought was: how on earth can I ship them to a conversion company in the short period of time I have? Then I quickly remembered, uh, this is a cassette tape, I can probably pick one up at Goodwill for less than $10. And then I realized I was still overthinking this: I bet in my ancient hardware pile I probably have a cassette player.

Sure enough, I did:

I even had the right audio cable to connect the output of the player into the microphone of the computer.

In fact, the only thing I was missing to get this setup going were C batteries. So off to CVS I went to buy a 4 of them.

I popped in the batteries and slid in one of the tapes. I hit the rewind button and the machine whirred to life. I then waited. And waited. Good lord, how long does it take to rewind a tape? With a loud click, the machine announced it was done. I hit play, and the tunes of over 19 years ago breathed to life.

I then plugged in the tape player to the computer. I was on my Mac so it took a few minutes to learn how to record audio. The short answer being: launch QuickTime Player; go to File » New Audio Recording. I then hit record on the computer and play on the cassette player. And again, waited.

When I was done, I had a 71 meg m4v file containing 30 minutes of music. I ran ffmpeg -i side_a.m4v side_a.mp3 and I was left with an mp3 file.

The whole procedure couldn't have been simpler. I can't get over how tactically satisfying it is to use a real tape player. Everything feels so, well, real. Given how easy it was to record this content, I'm going to have bust this old school tech out for my nieces and nephew and see what they think of it. Will they get a kick out of the limitations of life on cassette, or will they roll their eyes and ask to use YouTube?

Today's our anniversary and we celebrated early by listening some of the recordings last night. Mission accomplished.

Happy 19th babe!

Monday, June 26, 2017

On The Potomac Heritage Trail: A Giant Leopard Moth and Other Trail Oddities

This weekend we had the chance to log some delightful miles on the Potomac Heritage Trail with friends. Check out the amazing Giant Leopard Moth that Shira discovered as we were hiking along. I'm not sure what type of spider that is, but I definitely gave him his distance.

The raspberries were out in force and I ate my way along the trail. I can't recall catching bushes that were so ripe and hadn't already been picked over by other creatures. I also noshed on the daylilies, though I did so more sparingly, as they weren't as plentiful as the raspberries. Next year I really need to plant a heap of daylilies so I can properly enjoy their tasty flowers.

Also, we discovered various skeletal remains along the trail. Ooooh, spooky.

Definitely a fun time.

Friday, June 23, 2017

A Habit and a Hack: Adding a Heads Up Display to my Offline TODO List

The Habit

I've added another piece of my offline, index card based TODO list tracking system. On Sunday evening, I bust out a fresh card, a small ruler and make myself a grid for the week:

(The last 'W' stands for weekend)

I then pour over my stack of TODO cards and come up with a high level schedule for the week, picking one or two large items to work on every day:

At the start of a given day, I usually fill in more items that I want accomplish that day.

This little exercise, including the arts and crafts component of drawing out the grid, has been surprisingly effective. It's one of those habits that's so obvious that you can't imagine how you lived without it for so long.

The Hack

The large binder clips danging off my standing desk are doing a good job of organizing some key essentials. On the other end of the spectrum, I've found a new use for the tiniest binder clips I own. This was strictly an accidental discovery. I picked up a a few rare earth magnets the other day only to find out that they were *too* powerful for the task I wanted to use them for. At one point, I had the magnets on my desk and I was fiddling with them. Turns out, the tiny binder clips I use to keep my TODO stack together are ferromagnetic (that is, they stick to magnets). And the same was true for the outside border of my monitor.

It took some experimenting, but I eventually arrived at this arrangement:

Two small neodymium magnets stacked on top of each other firmly hold my entire stack of TODO list items, while one small magnet easily holds the weekly schedule card.

The result is a heads up display that shows me both the task I'm currently working on, as well as my weekly overview. The system is surprisingly robust, with the cards staying firmly in place yet easily accessible. And besides, there's something magical about magnets that make them a tactile joy to use.

My suggestion: pick up some neodymium magnets and see what sticks.

Thursday, June 22, 2017

Android Wear's WatchMaker: A Hacker's Delight

A Little Kvetching, A Little Inspiration

My ZenWatch 3 came with an impressive number of watch faces pre-installed. And many of them look quite cool. But alas, that's also the problem: they just look cool. On my list of needs from a smart watch, aesthetics is near the bottom while functionality and hackability are at the top.

While pondering this dearth of appealing watch faces it hit me, why don't I build my own? I make use of Tasker and AutoWear to expand my watch's capabilities, perhaps I can do the same thing with a custom built watch face?

I hit Google and found various articles that talked about getting into the custom watch face game. This article recommended WatchMaker, which seemed like a good fit. While WatchMaker has a massive gallery of watches, you can also build your own. Without having a clue, I created a blank watch face and started clicking around. As I browsed hrough the list of elements I could add to my creation I noticed the option of adding an 'Expression':

Clicking on this option took me to list of various types of data I could add, such as the time or weather information. As I scrolled down further I saw there was Tasker support (whoo!) and ultimately, the list of expressions finished with a statement explaining that "WatchMaker uses Lua, a scripting language used in..."

They had me at scripting language. Building a watch face would be nice. Programming one, well, that would be awesome.

Learning Lua in 24 Hours

Off to the WatchMaker Wiki I went, where I learned that WatchMaker is full powered by Lua. My entire knowledge of Lua is this: Lua is a programming language. But still, this was hugely promising. If I could run arbitrary scripts in WatchMaker, then I could effectively treat WatchMaker as an interpreter just waiting for me to writing interesting code. Before I could get too excited, I needed to get the low down on Lua.

Getting oriented with Lua was surprisingly easy. First off, I installed QLua on my Android device. This gave me access to a Lua interpreter and editor. Then I visited the online version of Learn Lua and browsed through the first few sections. I was pleased to find that QLua executed all the sample code without complaint. My iClever keyboard, LG G6 and QLua made for a hassle free learning environment.

I still don't know much about Lua, but I know that I like it. It has a Scheme feel to it, with it's small set of language constructs, reliance on a single data type for many data structures and first class functions. The embedded nature of it reminds me of TinyScheme and it's relationship with Gimp.

After about 24 hours, I had enough Lua to jump back into WatchMaker to see if I could hack something together.

Let's Get Building!

For my first WatchFace I wanted to demonstrate the ability to invoke a function that I hand coded. Turns out, that's not a tall order. At the watch properties level, there's a chance to provide a 'script.' So I wrote up a trivial version of the Factorial function and stuffed it into that field. QLua was handy in helping me verify my code outside of the WatchMaker environment.

function fact(x)
  if(x == 0)
    return 1
  else
    return x * fact(x-1)
  end
end

I then added a new layer to the watch and wrote this expression:

  {dmo} .. "!=" .. fact({dmo}) -- {dmo}

{dmo} is a magic variable that represents the one's value in the current number of minutes. In other words, if the time is 3:06, {dmo} is 6. Why did I choose {dmo}? Because it's a value that changes relatively often. I know, all this talk of functionality, and my first watch face does nothing but calculate a factorial of a useless value.

The -- {dmo} is a work around as prescribed here. I should note that the WatchMaker UI seems extremely polished. This is clearly an app with some serious development behind it.

I figured I should make my watch face at least a little usable, so I also added another layer that showed the current time.

It took a few iterations to get all this working, but when I was done I was blown away: I had programmed my first watch face. It showed the time and the result of my factorial function. To some, this may seem like a silly exercise, but to me, this shows that I can use WatchMaker as a hacking environment for the ZenWatch. The possibilities are endless!

While I was on a roll, I thought I'd broaden my horizons just a bit. Browsing the WatchMaker wiki I can across a recipe for changing color dynamically. I decided I'd incorporate this functionality into my watch face. The idea: at the start of the hour (say, 3:02) the watch would be green, as the hour progressed it would fade to purple (at say, 3:55). A quick glance at the color of the watch would show me how far through the hour I am.

Programming this was surprisingly simple. First, using QLua I coded up a function that maps a value from 0 to 1 to a color. 0 would be green, 1 would be purple:

function percent_to_color(percent)
  return string.format('%.2x%.2x%.2x',
                       percent*255,
                       (1-percent)*255,
                       percent*255)
end

After adding the above to the scripts section, I changed the background color of my watch face to this expression:

  percent_to_color({dm}/60) -- {dm}

{dm}, is as you guessed, the number of minutes in the current time. It's quite impressive that fields like background can take arbitrary expressions. To me it shows that while WatchMaker has a slick UI, it's also got serious geek cred to back it up.

Finally, here's some shots of the watch face in action:

And here's some screenshots of WatchMaker:

It isn't often that you find an app that's a game changer, but I believe that's what WatchMaker is. For anyone who wants to experiment with the world of wearable computing, or quickly develop interesting watch apps, or is just looking for a fun way to learn to program, WatchMaker belongs in your toolbox. Simply put: it's a Lua interpreter on your wrist; what more could you ask for?

Wednesday, June 21, 2017

Eating Hardtack / Ships Biscuit - An Experiment A Year In The Making

Nearly a year ago I cooked up a batch of Ships Biscuit or, as landlubbers and Civil War soldiers would have called it: hardtack. In many respects, ships biscuit / hardtack was the original super food. Not because it contained impressive amounts of nutrition, or because it was only found in tiny, expensive grocery stores. No, it earns a special place in the food universe out of pure utility: it's super easy to prepare and can go months, perhaps years without, refrigeration. This made it the ideal food for ship crews and soldiers alike.

Sure, you can read about how soldiers and sailors subsisted on this food. Or better yet, you can bust out some flour and water and mix up a batch. That's what I did.

I marked the batch with the date and expected to come back to in a few months to do a taste test. Instead, I totally forgot about it. That was, until a couple of weeks ago. And just like that, a year had passed! My cooking test was going to be more authentic than I'd imagined.

In preparation for chowing down my little experiment I did some research. I found excellent accounts of how Civil War soldiers dealt with hardtack here, here and here.

As I read through tales of hardtack being tooth-cracking hard, and being infested with weevils, I grew more and more concerned. This was beginning to feel like I was on an episode of Survivor.

This morning I brewed up a cup of black tea and busted out my ships biscuits:

I was relieved to see no sign of bug infestation. But man, were those biscuits hard. We're talking little hockey pucks. I managed to crack off a piece and dip it in my tea. I took a bite. Not bad. Not great. But not bad. I dropped another piece of the 'bread' into my tea and left it. I then continued to nosh. Hardtack is nothing but flour and water, so it basically tastes like eating four. But even after a year, it wasn't rancid flour, so that's a good thing.

Finally, I extracted the piece of 'bread' that I dropped into my tea and crumbled it up as best I could. I then dropped it into some scrambled eggs. I generously doused the eggs and hardtack with sriracha and ate up. Again, not bad. The hardtack is really pretty neutral, with the tea giving it a little flavor.

I can see why soldiers would have dunked their hardtack in coffee. Hot chocolate would have been even yummier. I can also imagine that dropping soaked hardtack into a frying pan with meat, or cooking it up in a soup would also work well. Basically, it's just calories.

I'm counting this culinary experiment as a success. I got to see hardtack / ships biscuits super powers on display, just about a year in storage without refrigeration and I got to connect with my ancestors who no doubt cursed the stuff. Will this staple find itself included in my next backpacking trip? Probably not. But who knows, maybe I'll go super-old school in which case I dare not step out into the woods without being properly equipped.

A special thanks to Jas. Townsend and Son for inspiring me to eat my way into understanding history.

Tuesday, June 20, 2017

Gotcha of the Day: Deploying a git non-master branch to WP Engine

I have a number of clients who host sites on WP Engine, and I've become a fan of the service. What you give up in flexibility that a vanilla hosting account provides you more than gain back in performance and robust WordPress tools. The fact that I've been able to talk with a knowledgeable rep on live chat with almost no wait time has been a nice bonus.

WP Engine has git based deployment support. While I still prefer subversion over git, this solution does elegantly solve the problem of deploying content to server with a minimum of confusion.

My standard practice is as follows: after a release I fork off a release branch that is used to host urgent bug fixes. The fixes are eventually merged back into master. At the next deployment, I fork off a new release branch, discarding the old one. And repeat. This approach has served me well for years now.

A week ago, I ran into a significant gotcha: I needed to deploy a fix that had been made on the release branch. However, WP Engine assumes that all deployments are associated with master. In other words, I could make changes to my branch release-2, and I could push that branch to WP Engine, but it wasn't going to actually deploy those files.

After much Googling I arrived at the following recipe:

  git push -n  production release-2:master

That is, push release-2 to master on the remote named production.

This worked. Every once in a while, git surprises me with actually simplifying matters, and it did so in this case. It's still too early to tell how this work-around is going to play for the next release. But at least I got my bug fix deployed in an orderly way. The alternative was to drop back to using sftp and that's no fun at all.

Monday, June 19, 2017

Weekly Discoveries

Norah Jones's version of Black Hole Sun is definitive proof that her voice can turn any piece of music into something sultry and poetic. I haven't listened to Norah in some time, and now I'm reminded why she was so popular back in the day.

It turns out the band OK Go, a band I'd never heard of until last week, is the definitive champion of music videos. For me, it all started with The One Moment Video, which is an impossibly timed creation. I then started poking around their account and learned that this amazing video is merely par for the course. A few other examples: Upside Down & Inside Out and I Won't Let You Down. Seriously, how do they do all that sans green screens and CGI? My only criticism of OK Go: their videos aren't ideal to work to. To appreciate them, you've got to give them your full attention. But man, is it worth it.

Bleacher's Don't Take The Money and Big Data's Dangerous, are both way over the top videos that are hilarious and remarkable creations in their own right. Dangerous is definitely leaning towards earning itself an R rating, but it's just too perfectly executed to not include it on the list.

Aaron Lee Tasjan's Hard Life contains the perfect line: They give you loose gravel and call it rocksteady. I'm not exactly sure what genre Tasjan falls into: country? folk? I don't suppose it matters, all the does is that he's a fun listen.

Nikki Lane, for me, had two notable songs: Jackpot and Forever Lasts Forever. The first is a fun tune about winning at the gamble of love. The second tune, despite what the title suggests, is a sad song about divorce and the end of a relationship. While the latter may be a better song, I can't help but put the former on my discoveries this week. What, with my wedding anniversary coming up, it seems to apply quite well.

Listen to all the discoveries here.

Friday, June 16, 2017

Weekly Discoveries

Snow Patrol's Called Out In The Dark is a great example of a song that works far better for me because of the video. Had I just heard it on the radio, I wouldn't have given it a second thought. But the video is so endearing, I can't help but appreciate the tune itself.

Last week we were out to dinner at our favorite Etheopian place and I was taken by the music in the background. I asked the waiter about it, and apparently they had a Michael Belayneh CD running. Of course, Michael is on YouTube. He's got quite a few tunes up, and they seem to span genres. This one has an EDM vibe to it, while this one feels almost country. My favorite of the bunch so far is Ashenefe. My Amharic is a bit rusty, so I've got no idea what he's actually singing about. Let's hope it's good things.

Kudos to Michael Franti & Spearhead for their tune I'll Be Waiting. He managed to work the lyric the best things in life aren't things into his song. Truer words have never been spoken. When you need a little pick me up, I'll Be Waiting is exactly what you want to listen to.

On the non-music side, check out Peter Hochhauser's This is not a beautiful hiking video. If this doesn't want to make you grab a backpack and head out on a multi-month adventure, then you have no soul. He does a great job of compressing the highs and lows of walking 2,650 miles(!) into 10 minutes of video.

And for all you foodies out there, check out Jas. Townsend and Son's Parched Corn Videos. Watching a video on parching corn should as exciting as watching paint dry, yet the folks at 17th Century Cooking found a way to make this terrifically interesting. Who knew there could be so much history behind one simple ingredient?

Watch all the videos here:

Thursday, June 15, 2017

Putting the Murse on a Diet - Applying Ultralight Principles to an Every Day Carry Bag

Despite how positively goofy it no doubt makes me look, I've definitely been a fan of regularly carrying a bag full of extra goodies. (As a side note, said bag needs a better name. Murse? Man Bag? EDC Bag? Who knows.) The problem with any gear setup is that carrying too much is almost as bad as carrying too little.

There's both a physical and mental penalty for overdoing it, whether we're talking about a man bag, your fishing tackle box or your Yoga kit. On the physical side, carrying extra stuff literally weighs you down and can limit mobility. On the mental side, carrying too much means it's hard to keep track of what you actually have. The result is that you can be thinking you're carrying X, when you aren't. Or worse, think you don't have X, but you do.

So while I like having some essentials on hand to solve problems and deal with the curve balls life throws my way, I also wanted to skinny it down as much as possible.

In my latest attempt to do this, I took a page from /r/Ultralight, the Reddit community obsessed with trimming weight from backpacking gear. While I'm not as hard core as many of the users over there, I do appreciate their methods and philosophy (to a point) and was glad to take a few pages out of their playback to help me lighten my load.

In the world of ultralight backpacking there are two ways you can trim weight: carry less stuff and replace your stuff with a lighter version. I applied both of these ideas to my daily setup.

On the 'carry less stuff' front, I found it helpful to be disciplined about carrying items that met two criteria. Either the item had to be used frequently (like my little Flip & Tumble shopping bag I use all the time) or have relatively high value (you may not use Imodium often, but when you need it, you absolutely positively need it). The less frequently I use something, the higher value it should have. So it only makes sense to carry a Res-q-Me that I plan never to use, because it's of such high value. Carrying stuff 'just in case,' where the case is likely never to happen, is a trap I wanted to avoid.

Like any gear related pursuit, the selection of what gets carried is always in flux. Still, I did some pairing down and was happy with the results. I was pretty confident that I was carrying stuff I'd use regularly, or would be worth its weight in gold should it be needed.

That brought me to step two of the process: replace heavy items with lighter versions. For this, I followed closely in the footsteps of /r/Ultralight, and busted out the food scale. I then made a spreadsheet of what each piece of gear weighs:

I then went through and noted what the heaviest items were. In my case, the portable keyboard, backup battery and bag itself were the chief weight offenders. I then cloned this spreadsheet and went to work searching Amazon for possible replacement items. By using weights mentioned on Amazon or elsewhere, I was able to get a sense of what my weight savings would be if I went ahead and made these purchases.

Here's what I arrived at:

This simulation step turned out to be surprisingly valuable. Considering replacing items on an individual basis, wasn't especially compelling. But, simulating the changes showed just how big an impact I could have. At the end of the day, I realized I could drop nearly 1.3 pounds. That may not seem like much, but that's dropping more than a quarter of what I carry.

Here's a quick tour of the substitutions I made.

Our first stop, my beloved Perixx 8051 keyboard. For most folks, carrying a keyboard around everywhere is probably a mistake. It's exactly the kind of "just in case item" that weighs you down and doesn't have a lot of value. But in my case, because I'm a computer programmer who owns his own business, my keyboard is essential. Using it and my phone, I can fix customers issues from nearly anywhere. With a browser and ssh, I can program my way out of quite a few problems. Ultimately, the keyboard may be heavy, but its far lighter than carrying around a laptop, which would be the alternative.

Because of both the frequency and value of carrying a full size keyboard, I knew I wanted to keep it in my rotation. But, I supposed it made sense to look for a lighter version. I was pleased to discover this iClever ultralight version. Check out how it stacks up against the Perixx:

It's less than half the weight, nearly half the thickness and maintains the full size keys. It has a improved keyboard layout (finally, the arrow keys are in a sane location!). Time will tell if I like or hate the ergonomic angle on the keys; though may every-day keyboard has this style. The keyboard does everything I could ask for, including automatically turn on and off when you open and close it. The only issue: like my Perixx, it doesn't lock open. This means that using it to type on my lap is a pain. I need to find a solution to that.

Next on the chopping block, my Anker 10,000mAh portable battery. This thing is an absolute game changer. This item alone nearly justifies carrying a man-bag. Having it means being able to keep my phone alive. And with my phone, I practically have super-powers, from important tasks like using Google Maps or making an emergency phone call, to more mundane things like turning an hour long wait into a virtual trip to the movie theater.

While I knew the Anker was heavy, I appreciated the plush safety net it gave my phone. The 10,000mAh version of the battery charges my phone nearly four times and has two ports. With a little research I learned that I could drop down to a 5,000mAh battery and save nearly half the weight and nearly half the thickness:

Time will tell if cutting down to a 5,000mAh battery is the way to go. It still provides quite a bit of cushion for my phone, as I can charge it just about twice. But still, we'll see if it's the right trade off to make.

And finally, the biggest weight offender was the bag itself. I really like the iBagBar small messenger bag. It's big enough to hold essentials, yet small enough that you're not carrying a full size messenger bag *everywhere*. I also very much like the fabric flip lid - it's a simple design and totally quiet. I like the canvas styling because it's neutral and in my imagination gave off a bit of an Indiana Jones vibe.

But man, is it heavy. And also, by downsizing, it was getting too large for the items I was carrying.

Amazon has a billion bags to choose from, many of which have free return shipping for prime members. In fact, I found that some bags had colors that were free return shipping while other colors weren't. For example, the lime green version of this bag has free returns, while the other (more appealing?) colors don't.

I went ahead and picked out a few bags on Amazon that claimed to be lighter weight and that had free-returns and pulled the trigger on them.

Out of the bunch, the winner was the Wsdear Sport Small Crossbody Bag. It checked nearly all the boxes. It's lightweight, coming in at 158 grams versus the 588 gram iBagBar and has good organization. I can use the main compartment to hold most of my items, there's a slot in the main compartment which nicely fits my keyboard and battery, and there's a front pocket which holds essentials like hand sanitizer and tissues. Best of all, it has a big slot in back that I can drop my phone into, rather than having to shove it in already full pockets. There's even a tiny pocket in front that fits my wallet, which is handy when I'm wearing gym shorts without any pockets.

The main shortcomings of the bag are quality and style. The zippers just seem so fragile. Part of that is probably a good thing and contributes to its weight, but I won't be shocked if the bag doesn't hold up. At $16.00, I'm fine just calling this an experiment to try.

And then there's the style. I can't say it's ugly, but it does feel very, shall we say functional? Gone is my Indy vibe, and now I'm a lot closer to the 80's fanny pack style. Scary, I know. Like I said, it's an experiment. Ultimately, a guy carrying a bag of any kind around here looks wrong, so I just need to accept that and move on.

Whew. So it's done. I've got a lighter bag. And the thing is, I'm happy with the result. The setup is noticeably lighter and didn't give up much in the way of functionality. Of course, this is always a work in progress, so I assume I'll look back at myself in 6 months and laugh at my naivete. Such is the joy of being a gear head.

Update: And for completeness, here's a snapshot of what's in the bag:

Wednesday, June 14, 2017

WP All Import and Google Sheets - Best Buddies, and Worth Mastering

One of, if not my favorite, plugin for WordPress is WP All Import. Specifically, I love that it's able to slurp a Google Spreadsheet into a series of well formatted posts. WP All Import doesn't care if the data was hand entered into a Google Sheet, or if it was entered via a Google Form. The latter allows you to create a crude data entry interface and then publish that data in a WordPress site with minimal effort.

Here, let me show you what I mean.

WP All Import in Action

Suppose I wanted to publish the data collected in this Cool Tools survey. Getting the data into a Google Spreadsheet is trivial. I did that here. And publishing that data so that the world can see it is easy, too:

Jumping over to the WordPress side of things, you can import this data into posts with relative ease:

The above sequence shows entering the download URL, then selecting entry as the element that WP All Import should use to demarcate posts. And finally, you construct the post by dragging and dropping the available fields in to the editor. There are tons of options during the process, so you can attach an image, add categories and tags and choose whether posts should be drafted or published automatically. It takes some time to learn, but with a little practice you can do really clever things without having to write a line of code.

And Now, The Catch

If you were paying attention to the above process, you'll notice that there was one key step I glossed over. That is, where the heck does the download URL come from?

This URL is a special one, and not at all obvious. You can use command line tools to figure it out, but that put this solution out of reach for many users. In short, the entire process of converting a spreadsheet to a series of posts is code-free, *except* for figuring out the download URL. Until now.

The Solution

This question of what a sheet's download URL is, came up often enough that I developed a web page to answer this question. Check it out here (and the source code is here, enjoy!). And here it is, in action:

This web page requires that you enter the public URL to the spreadsheet, in this case https://docs.google.com/spreadsheets/d/1eyDNkv5BfsgzTEQZA5Sprgwj5mjyBhviXX2IN590ux0/edit#gid=563082240, and it does the reset.

I can see from this, that the data URL is: https://spreadsheets.google.com/feeds/list/1eyDNkv5BfsgzTEQZA5Sprgwj5mjyBhviXX2IN590ux0/o9b8tei/public/full.

If your spreadsheet has multiple tabs on it, then each tab will get its own download URL, which the tool will report.

Really, This is Cool

If you haven't considered populating posts from Google Sheets, let me give you one more example. A while back I collected up various testimonials from clients. As they came in, I dropped them into a Google Spreadsheet as that was the natural place to track them. We're working on a website re-design, and I wanted to incorporate those testimonials into a custom post type. Could I have hand entered each testimonial into WordPress? Of course, but it was far faster to just slurp in the sheet full of testimonials. By establishing a unique identifier during the import process, it's even possible to re-import updated data later on. This makes sense for my testimonials, as I can edit these small bits of text far faster in a Google sheet than going one by one in WordPress.

The bottom line: WP All Import rocks, you just need to keep your eyes open for where managing data in a spreadsheet is faster than managing it directly in WordPress.

LinkWithin

Related Posts with Thumbnails