A decade of writing this stuff? Seriously.

In tinkering with my blogging platform and playing with different technologies, I’ve just realized that I’ve been writing online for well over a decade now.

It started a long time ago, when I was writing personal stuffs on a public Open Diary back in 1995, under an alias, which for the life of me, I can’t recall. The site is currently unavailable, and I was curious to see if they still indexed old entries, and see if I could dig anything up from back then.

It was a place that I tossed out whatever I had in mind, a place to jot down the ideas running through my head, a place for a creative outlet with the safety of knowing nothing would ever come back to me, since I lived behind the veil of anonymity (since back then, PRISM was just a dream…), and I was able to express whatever I wanted, in a safe-like place.

After writing there for a couple of years, I was witness to the 1997 Ben Yehuda Street Bombing – I was at a cafe off the street with some friends, when it happened, and went to offer whatever help I could, having had some First Aid training. After spending some 2 hours dealing with things that I’ve pushed far to the back of my mind, I was gathered by a friend, carted to his house, and sat in shock for a few hours, before making my way home.

The next day, I wrote about it on OD, and referenced my friend by first name only.

A couple of days later, a comment came on my post, asking if my friend was ‘So-and-so from Jerusalem’, and if so, that they knew him, and agreed that he was a great help. We began discussing our mutual friend, and eventually met in person.

This was the first revelation I had – you’re never truly anonymous.

We became pals, hung out a few times, and continued to stay up to date with each other for a while.
I did notice that after a while, my writing dwindled, now I knew that there is someone out there who knew who I am, not that I was saying anything outrageous, but the feeling of freedom dropped.

During my time in the Air Force, I wrote extremely rarely, since getting online was near impossible from base, so after discharge in 2000, I pretty much had stopped writing altogether.

In 2003, my friend Josh Brown invited me to the closed community (at the time) of LiveJournal, where it quickly grew into the local social networking site, where we could post, comment, and basically keep up with each other’s lives.
Online quizzes were ‘the thing’ and posting your results as an embed to your post was The Thing to do.

After spending 4 years on LJ, they began providing additional customizations, added features for paid-only users, and I didn’t want to spend any money on that, rather I wanted to host my own site.

So I did, for a while. In 2006, I built my own WordPress 2.0 site (history!), hosted it on my home server (terrible bandwidth) and began on the journey of customized web application administration. Dealing with databases, application code updates, frameworks, plugins, you name it.

I think I actually enjoyed tinkering with the framework more than actually writing.

Anyhow, I’ve written sporadically over time, about a wide variety of things, both on this site, and elsewhere.
The invention of Facebook, twitter, and pretty much any social network content outlet has replaced a lot of the heavier topic writing that went on here.

But it does indeed fill we with some sense of happiness that I’ve been doing this for a long time, and have preserved whatever I could from 2003 until now, and continue to try and put out some ideas now and then.

My hope is that anyone can take the to express their creativity in whatever fashion they feel possible, and share what they want to with the rest of us.

The Importance of Dependency Testing

Recently I revisited an Open Source project I started over a year ago.

This tool is built to hook into a much larger framework (Chef), and leverages a bunch of code many other people have written, and produce a specific result that I was looking for.

This subject is less about the tool itself, rather the process and procedure involved in testing dependencies.

This project is written in Ruby, and as many have identified in articles and tweets, some project maintainers don’t adhere to a versioning policy, making it hard to ensure working software across multiple versions of dependencies.
A lot rides on the maintainer’s adherence to a versioning standard – one very popular one is Semantic Versioning, or SemVer for short.

This introduces a few other questions, like how frequently should a writer release new versions of code, how frequently should users upgrade to leverage new fixes, features, etc.

In any case, my tool was restricted to running the framework’s version 10.x, considering that between major versions, functionality may change, and that there is no guarantee that my tool will continue working.

A new major version of Chef was released earlier this year and most of my existing projects are still on Chef 10.x, as this is still being updated with stability fixes and security patches, and the ‘jump’ to 11 is not on the schedule right now, so my tool continues functioning just fine.

Time passes, and I have a project running Chef 11 that I want to use my tool with.

Whoops. There’s a constraint built in to the tool’s syntax of dependencies that will report that “you have Chef 11, this wants Chef 10.x and not higher, have a nice day”.

So I change the constraint, install locally, and see that it works. Yay!

Now I want to commit the change that I made to the version constraint logic, but I want to continue testing the tool against the 10.x versions, as I should continue to support the active versions for as long as they are alive and in use, right?

A practice I was using for the tests that I had written was: given a static list of Chef versions, use the static entry as the Chef version for installation/test.

This required me to update the static list each time a new version of Chef was released, and potentially was testing against versions that didn’t need testing – rather I wanted to test against the latest of the mainline release.

I updated my constraint, ran the test suite that I’ve written, and whoops, it failed the tests.

Functionality-wise, it worked correctly on both versions, so the problem must be in my test suite, right?

I found a cool project called Appraisal, that’s been around for a while, and
used by a bunch of other projects, and you can read more about it here.
It allows one to specify multiple version constraints and test against each of them with the same test suite.

Sure enough, passes on version 10, not version 11. Same code, same tests. #wat

So now it’s time to do some digging. I read through some of the Chef ChangeLog, and decide there’s too much to wade through there, rather let’s take a look at the code my tool is using.

The failure was triggering here, and was showing a default value.
This meant that Chef was no longer loading the configuration file that I provide here correctly.

So I took a look at the current version of the configuration loader, and visually compared it with the 10.x version.
Sure enough, there’s one small change that’s affecting me: Old vs New

working_directory? What’s this? Oh, it’s over here, just a few lines prior.

Reading the full commit, and the original ticket, it seems like this is indeed a good idea, but why are my tests failing?

After further digging around in the aruba test suite extension I’m using, I realize that the environment variable PWD remains set to the actual working directory of my shell, not the test suite’s subprocesses.
Thus every time it runs, the chef_config_dir is looking in my current directory, not the directory the tests are running in.

After poking around aruba’s source code, and adding some debugging statements during test runs, I figured out that I need the test suite to change it’s PWD environment variable based on the test’s execution, which led to this commit.

Why is this different? Well, before, Ruby’s Dir.pwd statement would be invoked from inside the running test, loading the config from a location relative to Dir.pwd, where I was placing the test config file.
Now the test was trying to load the config from the process’ environment variable PWD instead, and failing to find the config.

Tests, pass, and now I can have Travis CI continue to test my code with multiple dependencies when it changes and catch things before they go badly.

All in all, an odd behavior to expect in a normal situation, as my tool is mean to be run interactively by a user, not via a test suite that mocks up all sorts of other environments.

So I spent about 2-3 hours digging around to essentially change one line that makes things work better and cleaner than before.

Worth it? Completely, as these changes will allow me to continue to ensure that my tool remains working with upstream releases of the framework, and maintain compatibility with supported versions of the framework.

TL, DR: Don’t skimp on testing you project against multiple versions of external dependencies, especially when your target users are going to be using more than one possible version.

P.S. Shout out to my girlfriend that generously lets me spend time hacking on these kind of things 😀

Chatting with a robot

Here I am, sitting calmly, trying to figure out the reasoning for the universe, and I get a GChat notification that someone wants to chat with me.

Here’s the transcript:

10:29:12 AM caitlyn ball: hi
10:29:17 AM miketheman: hi
10:29:24 AM caitlyn ball: hey whats up? 22/F here. you?
[email protected] is now known as caitlyn ball. (10:29:27 AM)
10:29:41 AM miketheman: totally bored.
10:29:49 AM caitlyn ball: hmm. have we chatted before?
10:30:15 AM miketheman: probably not, since you just added me to your list
10:30:24 AM caitlyn ball: oh ok. i wasnt sure. anyways.. whats up?
10:30:35 AM miketheman: not much, working. you?
10:30:45 AM caitlyn ball: im like so boreddd…. there is nothing to do
10:31:00 AM caitlyn ball: ohhh wait! i got a great idea. have you ever watched a sexy girl like me strip live on a cam before?
10:31:18 AM miketheman: no, I don’t believe that I have.
10:31:25 AM miketheman: And that seems to be a great idea.
10:31:29 AM caitlyn ball: wellllll….. you could watch me strip if you would like?
10:31:43 AM miketheman: possibly.
10:31:56 AM miketheman: Or we could discuss the nature of the desire for people to watch other people remove their clothing
10:32:00 AM caitlyn ball: yeah? ok well my cam is setup through this website so that i cant be recorded so you have to signup there.
10:32:09 AM caitlyn ball: it only takes a minute and it is free. ok?
10:32:13 AM miketheman: That doesn’t seem likely.
10:32:28 AM caitlyn ball: http://<removed> go there then at the top of the page click on the goldish JOIN FREE button.
10:32:33 AM caitlyn ball: k?
10:33:00 AM miketheman: Are you sure you don’t want to debate the reasoning behind the attraction with exposed bodies?
10:33:16 AM caitlyn ball: also it does ask for a credit card but thats how they keep kids out. it does not charge the card. k?
10:33:34 AM miketheman: Of course it does. Are there wizards with hats on the site as well?
10:33:50 AM caitlyn ball: ok babe well hurry up and when u get logged in then u can view my cam and we can have some fun!
10:34:03 AM caitlyn ball: i also have some toys but u have to tip me some gold or join me in private to see those.
10:34:08 AM miketheman: Again, probably not going to happen.
10:34:19 AM caitlyn ball: hey lets talk on there babe. my messenger is messing up.
10:34:36 AM miketheman: I believe you completely.
10:34:52 AM miketheman: You must have reached the end of your loop.
10:35:03 AM miketheman: Bye!

So it was a fun little distraction, and the the URL provided resolves to <obviously> girlcamz [net] – haven’t visited, since there’s no point, really.

I was hoping the bot would be a little better than a simple responder to the next input. But alas. Developers of sex marketing spam bots are probably less inclined to put some real engineering efforts into their crap.

Making a Mac actually work

I recently got a MacBook Pro from work, and wanted to see how extensively I could get it to do the things I want to.

A lot of tools I like to use are from the Linux world, command line and peppered with dependencies. A lot of Linux distributions have package management systems, like RedHat/Fedora/CentOS use RPMs and yum, Debian (and derivatives like Ubuntu) use DEB and apt.

Mac has Fink and macports, but I’ve heard differing opinions on them. So when it came time to get something for myself, I decided to try an alternative called Homebrew.

Unfortunately, almost all of these solutions require you to download some 4GB of Apple’s Xcode software, and that means you have to register, etc. But once it’s done, it’s done.

Installing a new package is as simple as running:
brew install <packagename>

It figures out the heavy lifting stuff and Just Works.


A random chat with a coworker

As a lot of hi-tech companies do, we also communicate via chat. After you’ve been chatting with people for more than a year,  and are friendly with them, you tend to derail the technical conversation into weirdness.

Here’s the tail-end of one such conversation that I had this morning. I have no idea where this came from.

(10:16:12 AM) chris: thanks for the understanding Mr sensativity
(10:16:34 AM) mike: hey, I’m not the guy the gals turn to for a shoulder to cry on.
(10:16:56 AM) mike: I’m the one who made them cry
(10:17:05 AM) mike: by running over their cat in a driveway or sometrhing
(10:18:20 AM) chris: nice, you are one of the nicest guys I know
(10:18:31 AM) mike: except when it comes to cats
(10:18:41 AM) mike: then I turn into the hate-mongerer
(10:19:20 AM) mike: Actually, I haven’t decided if it’s that I hate the cats, or that I love to see a gal cry.
(10:19:28 AM) chris: twisted
(10:19:36 AM) mike: I’m so confused and emotional about this time in my life
(10:20:09 AM) chris: well if you need a hug, I heard JP is giving them out
(10:20:28 AM) mike: ewww.. You might get more than you bargained for with him.
(10:20:54 AM) mike: like some weird Canadian STD that nobody ever heard about, has no visible symptoms, and cannot be detected in any way.
(10:21:05 AM) mike: That has no cure
(10:21:07 AM) chris: ohhh!
(10:21:12 AM) chris: or ewwww!

To jump, or not to jump?

Today I was waiting for the train, and some young guys were tossing a football, back and forth.

At some point, one must have dropped it, as it bounced off the floor, on to the track below.

They seemed to deliberate jumping down there to retrieve the ball, and I had a shutter waiting to catch that, but they must have thought the better of it.

When would you risk jumping down there? Other than the obvious, you know, screaming baby and such. What would drive you to taking that kind of risk?

Supernatural in my pocket!

One of the oddest things happened today.

I went to the gym – and to those of you jumping up, no, that was not the odd thing – and as usual, when I leave the house, I lock both locks, and drop the keys into a very small inside pocket in my jacket.

After my workout, I gear back up and head home, and when I reach the front door, I go for my keychain (it’s a cool black one, a great present from my man Dan!) and notice that one of the keys is missing. Odd.

I dig deep into the little pocket and find the missing key.

How does a key “escape” the confines of a circular metal ring?

My new remote control

So I don’t usually do any kind of prouct reviews, and tell you what I’ve bought, but this one takes the cake.

As some of you may know, I’m incredibly lazy. In fact, so lazy that the idea of having to look for the remote corresponding to the activity I’m looking for tires my mental faculties.

Most of you out there that have a television typically know the scenario I describe:

You have a TV remote, that does the cool functions that your awesome TV can do. You have a cable/satellite set-top box that has all sorts of specialized functions, particular to your provider. You may have a DVD-player, gaming console of some sort, and more (I have an XBox 360).

So having all these remotes and controllers gets annoying, and your couch side coffee table gets cluttered, and you have to find the remote you want whenever you want something, and then the TV needs a screen tweak, so you have to find THAT remote, etc. Some remotes offer a little cross-functionality, for example: my cable box remote can be programmed to use the basic (power, volume, mute) functions of my TV. But not everything.

Did I mention that I’m lazy? 🙂

So the people over at Logitech have probably figured out that I exist, and so do many others like me, and created a whole line of remotes under the branding of Harmony remotes. That’s cool. And they went one step further and made a special one for my Xbox 360.
I bought it for a great price of $79.99 at J&R, and it took me less than 20 minutes to pop in the software CD, for it to update itself and the remote with upgrades, and download device profile lists off the ‘Net.

The guide was nice and simple, and walked me through a simple series of questions and answers, that I believe anyone of any technical ability could do. Then it took my devices and made a list of typical activities that I might use the devices for and built “Activities” – which run multiple commands, such as “turn on TV, set to Channel X and turn on set top box” all with one click. Nice and simple.

It works surprisingly well, and I just put all other remotes into the drawer for now. Hopefully I’ll forget that they are there!

Fresh Salt! Get yer Fresh Salt here!

I may have written about this place before, but I’m going to again.

Sunday night, I headed over a couple blocks towards the South Street Seaport, and on the way, there’s this nice little place that’s pretty unobtrusive, a great little neighborhood place.

Fresh Salt is its name, and it has great little neighborhood feel, in an area that has precious little neighborhood feel to it.

Once there, comfortably at the bar, I ordered a beer from Maggie, a lovely young 20-something behind the bar. She was running the iPod playlist with great music, some oldies but goodies, some more modern, and then fell into a complete album of Sweet, which was enjoyed by all.

She had mentioned that her friend Katie would be coming by later, and had requested that Maggie mix her a cocktail, including tequila and grapefruit juice. So she consults Mr. Boston, and comes up with a couple of drinks – neither of which sound all that great.

So after another few minutes of contemplation, I offer up a mix of my own, on the spot creation, as I have been known to do before.

  • 3 parts tequila
  • 1 part Cointreau
  • 3 parts grapefruit juice
  • top off with Sprite/tonic/seltzer (to individual’s sweet tooth level)
  • splash of Grenadine

She made a taster, and liked it enough to make a couple for Katie and Annie when they arrived.

So I met the two ladies, now drinking “The Katie” and they were joined by a couple of other guys, and then I was regaled with not one, not two, but three great stories from the three ladies. One was about Katie’s neighbor – Rick something – and how he’s pretty odd. Then Maggie told us about the time her roommate passed out and locked her out of her own apartment. Finally, to close off the evening, Annie told one about a friend (?) of hers that had crapped his own pants, bought a new pair on the way home, and managed to lose both of them while trying to change pairs in between moving subway cars.

Ah, the memories.

Now, at this point I had probably too much to drink, so I proceeded to close my tab, and stumble off home.

Here’s to next Sunday!