blog

Skotch.app

Like many, I haven’t been very pleased with the recent 2.x versions of Skitch. My main use for that app was to be able to right click an something — generally a screenshot — upload it to a remote server, and have the resulting URL put onto my clipboard so I could paste it into a chat channel or an email message. The new version doesn’t really support that workflow, and, further, the URLs have gotten incredibly ugly. Finally, while I use Evernote, I really don’t want my temporary scratch pastebin files getting imported into the same app where I keep stuff I want to annotate and search long term.

I realize I’m not alone in this position, as there’s been a moderate amount of grumbling on Twitter and in $WORK’s chat channels about the deficiencies of the new 2.x Skitch. Several replacements have been proposed, but none of them really had the ease of use I was looking for, and so one afternoon I finally broke down and wrote some Applescript. (I know, I know, I took a shower immediately afterwards.) Since I’m lazy, I’m really leveraging Sartak’s nopaste script to do all the hard work. I call the resulting conglomeration Skotch. (Insert your own “taped together” joke here.)

Skotch has two parts, an Applescript based app and a shell script that calls nopaste with the appropriate environment variables set. If you’d like to play with Skotch, grab the two pieces of code from this gist. Use ‘Applescript Editor’ to save the first code as ‘Skotch.app’ (and make sure to change the ‘File Format:’ dropdown to ‘Application’, and uncheck the two checkboxes). Use a plain text editor to save the second chunk of code as .skotch in your home directory. Modify the environment variables to match your path and server names, make sure you have the nopaste utility installed, and, finally, make sure you have SSH key-based auth working so you don’t get prompted for a password.

In order to get ‘Skotch.app’ to appear as an option in the ‘Open with…’ context menu, you need to modify the Contents/Info.plist file inside the application bundle. Add additional <string> sections inside the <key>CFBundleTypeExtensions</key> array (see here for background.) You may need to restart the Finder to get new entries to be recognized.

I was also asked for the recipe for the tomato balsamic soup I made for dinner last night. Here it is:

Creamy Tomato Balsamic Soup

(originally from Pinch Of Yum, but currently AWOL…)

Ingredients

  • 2 cups beef broth
  • 3 tablespoons brown sugar
  • 6 tablespoons balsamic vinegar
  • 2 tablespoons soy sauce
  • 1 cup coarsely chopped onion
  • 8 garlic cloves
  • 4 (28-ounce) cans whole tomatoes, drained
  • 1 cup heavy cream
  • Cracked black pepper

Directions

  1. Combine 1 cup of broth, sugar, vinegar, and soy sauce in a small bowl.
  2. Place onion, garlic, and tomatoes in a 13 x 9-inch Pyrex dish coated with cooking spray.
  3. Pour broth mixture over tomato mixture.
  4. Place dish onto foil-lined cookie sheet and bake at 500°F for 50 minutes or until vegetables are lightly browned.
  5. Place contents of dish, including all juices, into soup pot (4 qt is sufficient).
  6. Add remaining 1 cup broth and cream, and process with stick blender until smooth. (You can use a conventional blender or food processor if that’s all you have; if you do, you probably want to strain any remaining solids out before serving.)
  7. Top with grated cheese and garnish with cracked black pepper to taste.

Chili

| No Comments | No TrackBacks

This time of year, I end up making a big pot of chili about once a week. It’s great, because it keeps well (in fact, it gets better as it sits in the fridge) and it makes for a quick and easy to reheat lunch. A couple of people have asked for my recipe, and I keep saying, “Oh, I’ll post that on the blog!” and I never do — so here we are.

I don’t really have a “recipe” for this as much as a decision tree — “chili” as a dish composes a very wide variation of preparations, so there’s a lot of room to play around. Generally I’m working in the ground-meat-plus-tomatoes section of the chili realm, so that’s what I’ll focus on here. My decision tree was heavily inspired by both Ürb’s chili con carne recipe and The Clothes Make The Girl’s “My Favorite Chili” recipe.

Genehack Chili

Ingredients

  • Meat: you want around 2 pounds of ground meat of some sort. I generally use a pound of chorizo pork sausage and a pound of whatever strikes my fancy and/or is on sale at the grocery store that week. I’ve tried beef, chicken, turkey, and more pork, and it all works. Still on the todo list: buffalo, lamb, ostrich…
  • Tomatoes: I use Muir Glen organic canned tomato products; you could use fresh but that’s generally more washing, slicing, and dicing than I’m looking for. You want somewhere between 20 and 40 ounces of tomatoes and juices. I generally use one 28oz can of whole peeled plum tomatoes, roughly chopped plus one 14 oz can of fire roasted diced tomatoes with garlic OR two 14 oz cans fire roasted diced tomatoes with garlic and/or green chiil OR one 14 oz can of diced tomatoes plus one small can of tomato paste
  • Beans: Some people have strong opinions about beans in chili; I tend to alternate between with beans and without. Depending on taste, add in one or two cans of black and/or pinto beans. Drain beans before use and rinse well. You want to rinse them until all the can juice is gone and the foamy stuff has rinsed away.
  • Other veg: One or two medium to large white, yellow, or sweet onions, roughly diced. Red onion would probably work too, if you have some you need to use up. A seeded, diced yellow or green bell pepper or two can provide some color and texture. Garlic to taste — which for me is somewhere between 4 and 10 cloves, minced. I also generally throw in 2 to 6 hot peppers — jalapeños, seranos, poblanos all work well. Make sure to remove all seeds and cut into a fine dice. You may want to wear gloves for this step.
  • Other ingredients: Depending on how much liquid you like in your chili, and what your tomato composition was, and how long you’re planning on simmering the chili, you may want to add some additional liquid — any where from 14 to 28 oz of a combination of beef broth, water, and/or wine generally works well.
  • Spices:
    • 2 to 4 heaping tablespoons chili powder
    • 2 to 3 heaping tablespoons ground cumin
    • 1 teaspoon oregano
    • salt to taste (i generally give a pretty good sprinkle)
    • black and/or red pepper to taste

Directions

The basic procedure here is: brown the meat, add in the veg, mix in the spices, add any additional liquid, bring to a boil, then drop to a simmer. I generally do this all in one pot, a 4 qt cast iron Dutch oven. If you’re planning on a long simmer, make sure you have a lid.

  • Brown meat: if you’re using a low-fat meat, add a tablespoon or two of coconut or olive oil to your pre-warmed pot, then brown the meat. Since I almost always have a pound of chorizo in the mix, I generally start cooking that first, and then add the other meat once some fat has come out of the pork. You could stop and drain the meat at this point, but I don’t — all that fat is going to help fill you up on small portions.
  • Add veg: chuck all your vegetables in the pot and stir it up
  • Add spices: toss in all the spices and stir everything up well
  • Add extra liquid: if you’re adding in extra broth, water, or wine, it goes in now
  • Bring to a boil: I generally just crank the burner all the way up. Give it a good stir every 3 or 4 minutes, particularly if your pot isn’t well-seasoned yet
  • Drop to a simmer: Once you’ve been at a boil for a minute or two, crank the burner down, put the lid on the pot, and let it be. You can stir it up every hour or so if you think you need to, but it’ll mostly be okay just sitting there on the stove

You can simmer this anywhere from 2 hours to overnight — I’ve gone as high as 25 hours once, due to a scheduling mistake (started chili going when we had a previous dinner engagement that evening, and just let it go until the next day). For longer simmers, depending on what you put in, you may want to adjust the liquid levels to keep things from drying out — you can always chuck in a cup or two of water. As it gets closer to serving time, if you find it’s too liquid for your tastes, uncover and elevate heat as needed to reduce.

Serve with grated sharp cheddar, raw white onion, additional hot sauce, and/or sour cream, to taste. Goes well in a bowl, over hot dogs, or with tortilla chips. Keeps well, can be frozen.

Here’s last night’s dinner. Based on popular demand — okay, based on one person asking — here’s the recipe:

Ingredients

  • 3-4 strips thick-cut bacon
  • 3 boneless skinless chicken breasts
  • 1 can whole peeled tomatoes
  • 1 small onion, diced
  • 1-4 cloves garlic, minced (to taste)
  • 1 tsp basil
  • 1 tsp oregano
  • 1 pkg mozzarella cheese

Directions

  1. Cook bacon in cast-iron pan over medium-low heat, turning as needed, until well-done and crisp. Remove to paper towel to drain.
  2. Brown chicken in bacon fat with chopped garlic and diced onions.
  3. Puree tomatoes and bacon in blender.
  4. Put chicken in baking dish with lid. Add oregano, basil. Pour pureed tomatoes over chicken. Top with thick layer of mozzarella (I use most or all of a 16oz package).
  5. Bake, covered, at 350° for 45 minutes or until chicken is done
  6. (Optional) Finish for ~5 minutes under broiler to brown cheese
  7. (Optional) Garnish with basil leaves

Notes

  • If you don’t have bacon, don’t eat bacon, or would rather save 10 minutes off the front end, you can just brown the chicken in butter or oil (or use some saved bacon fat)
  • I’ve substituted garlic scapes (chopped fine) for the minced garlic, and it works out fine.
  • I’ve used white and yellow onions in the past; not sure it makes a difference
  • If you omit the bacon, add some taco seasoning to the chicken when browning, swap out the mozzarella for a cheddar/jack blend, and garnish with chopped scallions instead of basil, you have the “Mexi-Melt Chicken Surprise”.

As of earlier this afternoon, everybody that needed a 1-on-1 delivery has been talked to, and I’ve been cleared by @MrsGenehack to talk about this more widely. So here’s how our summer just got a whole lot more interesting and chaotic.

First, in the “interesting to me and a few other people, but probably not so much you” category, I’m thrilled to announce that effective Monday, I’m working for Infinity Interactive. I think it’s going to be a whole lot of fun and I’m expecting to learn bunches of new stuff. From external appearances, not a whole lot will change; it’s still a work-from-home programming pants-optional-unless-meeting-clients type of gig, just like the one I’m leaving.

Second, the much bigger news, is that due to a change in @MrsGenehack’s employment — hit her up for details, she’ll share more if she wants to, I’m not going to say more than she has a new job that she’s just as excited about as I am about mine — we’re going to be re-locating to the Salem, OR area, ideally before the start of the school year there (basically the first of September).

We will certainly be seeing all our local friends as much as possible before we leave — amongst other fun things like selling our house, finding some place to live in Salem, and dealing with the logistics of moving stuff, cats, and kinder across the continent — so if you’re a local friend, please bug us about having dinner, getting a drink, seeing a show, or otherwise spending some time together while we’re still in the area.

Not to get overly maudlin’ — still plenty of time for that — but while we’ve loved our time in the DC area (very much more than either of us expected, I think), we’re ready for our next adventure and very grateful to all involved that we’re getting this great chance to kick it off.

And week 4, the haul looked like this, and consisted of:

  • 2 tangles of garlic scapes
  • 1 bunch tatsoi
  • 1 bunch asparagus
  • 2 heads leaf lettuce
  • 1 head red romaine
  • 1 bag red chard
  • 1 bunch of kale
  • 2 heads of broccoli
  • 1 jar applesauce
  • 1 box strawberries

(The last two items are from our fruit share, which started up this week.)

The menu plan:

  • Wed: chorizo/kale/collard/garlic scape stew (yes, leftover from last week’s menu, I said we went off the rails…)
  • Thu: salad with radishes, mushrooms, leaf lettuce, red romaine, cherry tomatoes, garlic scape balsamic vinaigrette
  • Fri: grilled half chickens and grilled prosciutto-wrapped asparagus
  • Sat: garlic scape-chard pesto pasta with grilled chicken breast
  • Sun: chilled wilted tatsoi salad with ginger-sesame dressing and stir-fried tofu with broccoli

and then Monday and Tuesday we have evening activities that will keep us out of the house — but we should be mostly out of CSA produce at that point anyway…

From the better-late-than-never department…

Yes, week 2 is lost to the ages, but here’s week 3:

  • Head of romaine
  • Bunch of kale
  • Bunch of collard greens
  • Box of cremini mushrooms
  • Tangle of garlic scapes I have decided that “tangle” is the collective noun for garlic scapes…

  • Bunch of radishes

  • Bunch of spinach
  • Bag of greens
  • Bag of endive
  • Box of strawberries

Our planned menu was:

  • Wed: grilled chicken Caesar
  • Thu: endive with garlic scape vinaigrette
  • Fri: warm spinach salad with egg and bacon dressing
  • Sat: eating out
  • Sun: bok choy / beef / garlic scape / ginger stir fry
  • Mon: lettuce salad with radishes and mushrooms
  • Tue: collard / kale / chorizo stew

(A few of these things were left over from week 2…)

Unfortunately, I say “planned” menu because we went a little off the rails over the holiday weekend… ho hum.

This one time, at band camp in #moose:

11:23 < sartak> 7% of CPAN directly depends on Moose
11:24 < sartak> 1655 dists of 23,808
11:26 < genehack> sartak: what's the percentage that indirectly depends?
11:26 < sartak> dunno. I'd like to know though
11:27 * sartak got those numbers from http://mapofcpan.org/ and quick inspection 
      shows that it's counting only direct dependents (see the Dist::Zilla territory)
11:32 < genehack> that seems like something that should be trivial for somebody 
      who knows the MetaCPAN API well...
...
17:32 < genehack> sartak: 2334 dists have direct or indirect Moose deps
17:33 < genehack> that's 9.8%
17:34 < genehack> (at least if my stupid abuse of the metacpan search API didn't 
      have a thinko.)

(code here)

Update on 26 May 2012: Ran the same code for Moo and Mouse — they have 263 and 270 dependents, respectively. That’s approximately 12% of CPAN, all told, depending on one of these modules…

Yesterday was our first Sandy Spring CSA pickup of the year — we’ve got 24 more before we’re done, running through October 22nd. I don’t know that I’ll stick with doing this every week (Historical Record Magic 8-Ball sez: “HAHAHAHAHAHAHA”), but here’s what we got and what I’m planning on doing with it:

First, what was in the box, in no particular order:

  • 1 bunch baby scarlet turnips
  • 1 bunch red radishes
  • 2 bunches collard greens
  • 1 bunch scallions
  • 2 heads of lettuce (1 “butterhead”, 1 “green leaf”)
  • 1 bunch purple mizuna
  • 2 heads baby bok choy
  • 1 bunch of carrots

(There was another big head of bok choy in the box, but I swapped that for a second bunch of collard greens out of the Swap Box.)

Here’s my menu list for the next week, which manages to use everything except the greens from the carrots, radishes, and turnips (and even those will probably migrate into a salad mix at some point…)

  • Wednesday: lettuce salad with mushrooms, radishes, cherry tomatoes, grilled chicken, and balsamic vinaigrette
  • Thursday: collard green stew with chorizo and garlic
  • Friday: hamburgers, roasted turnip fries with Parmesan
  • Saturday: carnitas tacos con guacamole y pico de gallo (requested by @MrsGenehack for Mother’s Day…)
  • Sunday: bok choy / mizuna / tofu stir fry + cooking down chicken stock (this is where the carrots are headed)
  • Monday: lettuce salad with mushrooms, radishes, grilled steak, and balsamic vinaigrette (and maybe some additional greens)
  • Tuesday: mexi-melt chicken surprise

(Wikipedia has a nice CSA article if you’re all “WAT.”)

This morning, I was finishing off my coffee and reading the morning email -- as you do -- when I came across a bug report for Git::Wrapper, a module I maintain. It turned out that a recent change I'd made to my workflow (archiving older releases in my working tree) had resulted in the archived releases being included in the version of the software I'd packaged and put on CPAN for distribution.

Whoops! I needed to fix the problem and get a new release uploaded to CPAN as soon as possible, and since it was a quiet Saturday morning and I had about an hour free before I needed to run some errands for @MrsGenehack, I didn't expect it would be a big deal. I use Dist::Zilla to help me package up Git::Wrapper for distribution, so I figured it would just be a simple matter of tweaking the configuration in the dist.ini file in my working copy and then releasing a new version to CPAN. How long could it take, really?

(Enter First Yak, stage right, with bouffant rampant...)

I tried a couple of different approaches to changing the configuration so that it would do what I wanted, and couldn't quite get the syntax right. Instead of continuing to pound my head into a wall, I hopped onto the #distzilla channel on irc.perl.org and asked for help. RJBS (author of Dist::Zilla, current Perl pumpking, and generally nice guy) quickly pointed out where I was going wrong and got me on the right path.

I was working on the problem in a MultiTerm buffer in my editor, Emacs. I'm giving a talk on editor tweaks for more effective programming at YAPC::NA this year, and as part of prepping for that, I'm trying to do as much work as possible inside my editor. This was working great for this particular problem -- I could make changes to my dist.ini file and quickly jump over to the terminal window to run dzil commands and verify the distribution was getting built correctly.

This was working really well, except that I kept getting distracted by some highlighting irregularities -- and since the talk was on my mind, I realized I wasn't going to be able to present at YAPC with those ugly background glitches present. Obviously, taking a couple of minutes to clean that up would be time well spent...

(Enter Second Yak, stage left, somewhat hirsute than previous yak...)

Since most of the highlighting problems seemed to be around the color highlighting in the output of the ls command, I spent a while poking at the dircolors config file I use. I copied this from someplace on the Internets and I've never really taken the time to understand it -- it just worked -- so this was mostly poking of the "change something, see what happens" variety. After a few minutes of failing with this approach, I started to wonder if I was barking up the wrong tree. A bit of DuckDuckGo-ing later, I made a quick tweak to my Emacs config, which fixed the highlighting problem.

(Exit Second Yak, now smooth and free of hair)

That taken care of, I returned to the issue of the Git::Wrapper distribution problem. Before I got diverted by the Emacs shell issue, I'd noticed a few other things in the dist.ini file that I could improve. I took care of that, built a new release, and uploaded it to CPAN. I let the bug reporter know, and closed out the ticket.

(Exit First Yak, now also denuded.)

One of the changes I'd made to the dist.ini was updating the metadata to point to the new Git::Wrapper homepage and to the issue tracker for Git::Wrapper on Github. The MetaCPAN site uses this information to set up the links in the sidebar on the Git::Wrapper release page, so I hopped over there to verify that I'd done everything correctly.

All the links were working correctly, but a Github specific popup was appearing over my homepage link -- which seemed wrong. I jumped on the #metacpan channel to see if this had already been reported, and ended up having a short conversation with MST that resulted in me opening an issue ... which I ended up assigning to myself. (MST: manipulating people into open source contributions for fun and profit.)

(Enter Bonus Yak, descending from the rafters and bearing a strong similarity to MST, at least on the hairdo level... )

I looked at the issue briefly, but as I'd now used up about 1.5 hours of my free hour, I had to let it sit briefly while I took care of those errands. Once I got back, I spent another 30 minutes figuring out the issue. After I was sure I'd got it taken care of, I sent in a pull request, which has since been merged -- the bug is no longer visible on the MetaCPAN site).

(Exit Bonus Yak, freed of hair and looking not unlike MST would have if he hadn't backed out of the "transparent" option when losing the Iron Man Perl challenge...)

Anyway, that's my Saturday morning - three yaks shaved, 2 patches to open source projects, 1 editor config tweak, and some good raw material to fold into my talk. Hope you enjoyed the tale...

(For those of you wondering about the yak thing, "yak shaving" is a geeky way to describe what happens when you're trying to accomplish one thing, but get diverted off on solving a chain of seemingly unrelated problems instead.)

(Hat tip to Josh paperbits DiMauro for the title...)