Pew Pew Laser Blog

Code. Glass art. Games. Baking. Cats. From Seattle, Washington and various sundry satellite locations.

What I'm Looking For in a Talk Proposal.


I'm curating CSS Day at CascadiaFest, and earlier this month we finished our speaker selection process. Since I've evaluated hundreds and hundreds of proposals for CascadiaFest, I thought I'd share what I'm looking for when I evaluate a talk proposal. At CascadiaFest, our selection process is masked; we do most of the evaluation before revealing the identity of the person who wrote the proposal. Naturally these thoughts are only about my process, and do not represent any other curators or selection committee members.

Setting Up User Styles in Firefox


While reviewing talks for CascadiaFest, I wanted to find a way to hide comments on the talks until after I'd formed my opinion of the talk. I figured this would be pretty easy to do with user styles - the browser's base set of CSS rules that are followed for every site. In Firefox, these styles are stored in `userContent.css` in your profile folder.

Doing so proved a little more complicated than I anticipated, because Google's search results seem to interpret "userContent.css" as "userChrome.css". As you can imagine, this made it a little difficult to find information on userContent.css. Here are the two references that I did manage to find:

Here is what went into my user styles:

@-moz-document domain( {
  ul.comment-list { opacity: 0 !important; }
  ul.comment-list:hover { opacity: 1 !important; }

The @-moz-document domain "selector" allows me to limit these styles to pages delivered from a certain subdomain. I then hid the elements using opacity, and showed them when they were hovered over. Opacity isn't always the best way to hide things with CSS; but in this case I did want the elements to take up space on the page, and for their children to also be invisible. And a user stylesheet is a fine place for !important - I always want that style to apply, even if a higher specificity selector would override it.

After editing userContent.css, you have to restart Firefox for the changes to take effect.

Who to Send to Conferences.


If you're trying to hire software developers (and who isn't?), then local developer conferences (and even meetups) can be really great recruiting opportunities for you. Mozilla, npm and IBM have done pretty well for themselves at CascadiaFest and JS Conf in the last year.

To a degree, this depends on who you send to the event. At a developer conference, attendees probably aren't particularly keen on talking to another recruiter; but many would be open to hearing front line stories about your deployment process or upcoming projects. Send members of your technical teams to developer conferences.

Don't send jerks or dudebros. A few months ago, I was at a SeattleJS meetup and happened to be sitting near two fellows from a large and well-respected company. One of them (who really had enough salt in his hair that he ought to have known better) was fooling around with his skateboard in the office meeting space. He insisted that his colleague "video my kick flips"; and inevitably smacked other peoples' chairs when he lost control of his skateboard. Don't send that person. Send your outgoing and thoughtful developers, who can talk in detail about your organization's work without insulting other technology choices.

Do remember to compensate your people with time off if these events fall outside normal working hours. Your developers shouldn't have to do free recruiting work in their off-hours.

Git Tips - Diff.


Let's talk about how to refer to previous commits absolutely using a hash/sha; or relative to your working directory, master, or previous commits.

Here's quick reference on some cool things you can do with Git's diff command:

git diff
The standard form of git diff will show all differences between your current working directory and the index (the files that Git is watching and has staged for your next commit).
git diff --cached
Just the differences that you've staged (files added to the index); what you would be committing if you run "git commit" without "-a" option.
git diff --name-only
Show just the names of files that are different between your working directory and the index (last commit). Or, pass in two hashes to compare files from those two commits.
git diff master --name-only
Show all files changed between master and your current working directory. This is great for reviewing what changed files you're actually going to commit.
git diff HEAD
Both staged and unstaged changes in your repo; what you would be committing if you run git commit -all.
git diff HEAD~1
Compare current files to the ones from the previous commit. Also git diff HEAD^ HEAD.
git diff HEAD master [file]
Show differences between the working directory and master for one file.
git diff [hash]
Diff between current and previous commit.

Note that hash is that long string which identifies a commit if you do git log.

How to Make a Pee-Wee Runt Rover with Johnny-Five


Runt Rover Nodebot Way back in May of 2015, I attended JSConf US to help with Bocoup's JS IRL Nodebots event. The robot kit was designed by Rick Waldron, and Rick and Francis Gullota soldered pin headers to all the the motor controllers before the event. We helped around 100 attendees build a nice little Nodebot, and everyone got to take home their kit. If you want to build your own, here's what you need:

Once you've got the running, there are a number of ways to extend it. Here's one that's controlled with an Xbox 360 controller (code).

Kimmy Schmidt - Unblockable


Kimmy Schmidt - Unblockable. A Dice Masters team with Kobold - Greater Humanoid, Stirge - Epic Beast, and Human Paladin - Lesser Emerald Enclave, and Anger Issues I've been using this strategy in unlimited tournaments since I discovered the core mechanic (and improved it with the help of my opponents) last summer. Since I've seen other folks playing variations on this a few weeks ago, I've decided to write about it. I call this team "Kimmy Schmidt", because the Stirge is unblockable. Here are the important cards:

You can fill out the rest of your team however you like. You'll want something with some blocking strength for when your opponent's characters start coming at you. Power Transfer is nice if you've got it, but your opponent can use it to swap Stirge's attack to something lower. Try to avoid lots of characters cycling through your dice bag so that Swarm will remain effective. Bringing another unblockable character is a good plan; or something with a strong attack that can take advantage of the Anger Issues action.

In tournament play, I found that this setup took a little too long to get up and running to be truly deadly. There are also a few specific threats be aware of:

Homemade Stock - A General Theory.


One of the longest-lasting artifacts of a home-made Thanksgiving dinner is the turkey stock. After roasting and carving a whole turkey, it feels very efficient to also utilize the neck, bones and other leftover bits to make something, and then use it throughout the year. When successful, the stock is a thick or even gelatinized liquid that adds flavor and a smooth thickness to dishes. We use the turkey stock throughout the year as a replacement for water when making making cous cous, wild rice, or any time chicken stock could be used. There's no strict recipe for stock - it's more of a set of general guidelines. Here's how it's done:

Collect cleaned vegetable trimmings and any vegetables that are about to go bad. Stash them all together in a gallon-size plastic zip bag and store it in a corner of your freezer. You can collect stock ingredients for a few months - more is always better - though we usually only end up doing it during the Thanksgiving effort. Most ingredients are fine, but there are a few things to keep in mind:


Do keep these things in your stock bag and add them to the stock pot: Carrot skins (washed), beet stalks (the green part), leek trimmings. All left-over meat bits (bones, giblets, necks, et cetera); roast them if you like and you can use any the drippings from the roasting. You many want to break the larger bones into smaller pieces with a large knife to they'll fit better in the pot. It's fine to mix poultry with beef or pork or whatever; or even omit the meat if you're aiming for a vegetarian stock. Don't sweat it of you're missing anything from here.


There are a few things to avoid adding to the stock. Kale, spinach, cabbage, Brussels' sprouts, and broccoli will turn too bitter. Beets and tomatoes will turn the stock red in color. Potato peels are too cloudy. Oily fish will be too fishy; most lamb is too fatty, and drained bacon fat is just too fatty. Also avoid salting the stock; it will be too strong if added at the beginning and it's best to season when the stock is already incorporated into the final dish.

Throw all "good" stuff into a stock pot (you'll probably need one which can hold at least 2 gallons). Then add:

Add about a gallon of water; enough to cover most of the solid bits. Simmer the pot for a while; a little boiling won't kill the stock, but it can cause cloudier stock, and more impurities to strain / skim off. Check the pot occasionally to make sure the majority of solid parts are covered with liquid; add more water if not. You want to cook the stock for as long as possible - more time equals more concentrated flavor and more deliciousness - but it can be done in just 3 hours (especially if crack the bones).

Strain the solid chunks out of the stock and cool it. For the ultimate cooling mojo: put an empty pot into your sink, and then fill the sink (but not the pot) with ice and some water. Add about a tablespoon of salt to the ice water. Then pour the hot stock into that pot in the sink. Stir the ice-water once in a while. For long term storage, freeze the stock in muffin cups or ice cube trays for easy portioning.

For a professionals take on stock, see Freezer-Bag Quick Stock from Lynne Rossetto Kasper.