Pew Pew Laser Blog Hand forged code from Seattle, Washington. Gaming - analog and digital. Glass artistry. Baking. And a few pictures of cats. en-us Pew Pew Laser Blog Jim's Artichoke Spinach Dip. Tue, 25 Apr 2017 00:00:00 PDT Artichoke spinach dip in a casserole dish I've got a friend named Jim who is pretty skilled in the kitchen. I've stolen and modified this recipe for artichoke spinach dip from him; it's a creamy warm dip which I often make when hosting friends for the yearly gluttony and football game extravaganza. Reminder to self - many of the ingredients can be bought at Trader Joe's.

Katie Kurkoski
The STEMTera Breadboard and Johnny-Five's <code>five.Leds</code>. Fri, 07 Apr 2017 00:00:00 PDT The STEMTera Breadboard is a nifty combination Ardunio (Uno R3) / breadboard. It has a Lego-compatible backside and it's available in black, white, and pink. When I got mine, of course the first thing I did was get it set up to run with Johnny Five. The StemTERA breadboard with some resistors and LEDs installed.

Basic Functionality / Hello world

Making an LED blink is the Hello world! of hardware. It's common to just use an Arduino's onboard LED on pin 13. Here's what you do to get up and running from scratch:

  • Make sure Node, npm, Johnny-Five, and the Arduino app are all installed and updated.
  • Connect the StemTera breadboard to your computer.

    Protip: Be sure to use a USB mini cable that supports both charging and data transfer. I've been fooled more than once by a charging-only cable. When I tried using a charging-only cable to flash the Arduino, I'd see the "On" LED turn on, but the Arduino app didn't report the device on any port. I've since purged my supplies of any charging-only cables, hopefully.

  • In the Arduino application, from the Tools menu, select Port and set it to whatever is newest (something like /dev/cu.usbmodem1441); the Arduino app should detect the port that your breadboard is connected to. Then from the Tools menu, set the Board to Arduino/Genuino Uno. Then from the File menu, choose Examples, then Firmata, and finally Standard Firmata. Then from the File menu, choose Upload. When the upload is successful, you can close the Arduino app.
  • Open up your terminal / command line and create a new file called blink.js. Navigate to this file's location. Put this code in the file and then save it:
    var five = require("johnny-five");
    var board = new five.Board();
    board.on("ready", function() {
      led = new five.Led(13);
      led.strobe( 1000 );
      this.repl.inject({ // make led available as "led" in REPL
        led: led
  • From the command line, type node blink.js and then hit enter or return.
  • Your onboard LED should start blinking on and off every second - yay!
  • In the new prompt from Node (called the REPL), you can interact with the board's LED. Try any one of these:
    • led.stop();: The LED will stop what it's doing, and stay at it's current state.
    • led.strobe(3000);: The LED will blink on and off every 3 seconds. You can change the 3000 to the number of milliseconds you want the LED to blink at.
    • led.on();

Red and Green LEDs

Fritzing diagram of StemTERA breadboard with LEDs and resistors installed. Now let's add external LEDs (and protective resistors of course). Build your circuit as shown here, using 2 330? resistors, two 3mm LEDs, and two jumper wires. This is the magic of the StemTERA breadboard - the circuit doesn't need to hop back and forth between the breadboard and the external Arduino.

Here's the code - store it in a file and run it as with the first block of code.

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {

  // We can address them separately, or together in leds
  var red = new five.Led(6);
  var green = new five.Led(5);
  var leds = new five.Leds([red, green]);;

    leds: leds
    // leds.stop() // Stop the strobing
    // // Turn them both off
    // leds.stop().off(); // Combine!


You should see the red and green LEDs alternating between on and off every second, and only one of the LEDs will be on at a time.

The interesting thing about this code is that it uses the Leds class - which allows us to control all the LEDs at the same time. At first, the green LED is off, and the red one is on. Then we blink the leds class; flipping the on/off state of each LED at the same time. You could use this to easily control many more LEDs.

Katie Kurkoski
Things that Matter To Me As a Speaker. Mon, 20 Mar 2017 00:00:00 PDT Beyond the basics such as an enforced code of conduct and covered travel and lodging, there are a few things that I really appreciate as a speaker:

  • Speaker dinner / lunch / hangout time. Getting a chance to talk to other speakers in a non-public situation is great for conquering my imposter syndrome. Even if they're super famous, we're still sharing food and I can get a chance to connect as peers.
  • Recommended lodging. I've already got to write a speech - do I really have to track down the best hotel too? Having the majority of the conf stay at the same venue can lead to powerful chance meetings between attendees.
  • Video of speech. This is such a great artifact for a speaker to have. This can be a powerful tool for finding the next speaking opportunity.
Katie Kurkoski
Sublime Text ColorHighlighter Tips. Fri, 24 Feb 2017 00:00:00 PST Sreenshot demonstrating ColorHighlighter for Sublime Text ColorHighlighter is a pretty nifty package for Sublime Text which can display the color of CSS colors values right in the text editor. Here are a few usage and configuration tips if you want to use it yourself.

  • There are two different settings for how to display the colors:
    • ha_style: The style at any time.
    • style: The style when that text has focus (line 7 in the image above).
    Here's an example of the ColorHighlighter.sublime-settings file which results in the image above:
      "ha_style": "underlined_solid",
      "style": "filled"
  • You can convert colors to different formats such as rgba, with "Convert Color" from the context menu. Enter sharp6 for old-fashioned hex colors. This is quite useful for converting CSS named colors.
  • You can open your operating system's color picker with "Choose Color" from the context menu.
  • Dashes in the names of variables for colors produce weird results.
  • For the colored circles in the gutter, ImageMagick needs to be installed.
Katie Kurkoski
Print vs. Online Products. Thu, 02 Feb 2017 00:00:00 PST Let us take a little time to compare and contrast printed products with their online counterparts - such as a printed newspaper and the same newspaper's website.

The printed version is tangible and tactile. Once printed, it can't be revised by the creator, though the user can make notes on the paper. Since it's a tangle product, the user must find a way to dispose of the used product; which may be repurposed as combustion or packing material. Each newspaper will probably only be used by one or two users.

The online version is interactive: searchable and sharable. It is easily updated. The website is much more likely to be seen by users outside of the physical area of the newspaper. Many users will use the same "version" of the paper, which can generate comments and discussions.

These are completely different products, even though they share the same content.

Katie Kurkoski
Creaming in Baking. Tue, 10 Jan 2017 00:00:00 PST Creaming is one of those weird terms you see in baking recipes. It does have a specific meaning though, and doing it correctly can really improve your baked goods.

Creaming means mixing the butter (or the main fat of the recipe) and sugar (white or brown) until "light and fluffy". This process puts a bunch of tiny bubbles into the proto-cookies, which help with leavening. You should see the volume of the mixture increase by about a third, and has lightened in color, due to all that air. You shouldn't be able to see any sugar granules, but you should be able to feel them if you rub the creamed mixture between thumb and forefinger. Creaming will take somewhere around 3 minutes with a mixer (I like to use a paddle with a scraper or edge beater in my stand mixer), and just about forever if you're mixing by hand.

Katie Kurkoski
Real Talk About Conference Speaking. Tue, 20 Dec 2016 00:00:00 PST Not to be a downer, but that "free" trip you got by having your conference talk accepted is pretty far from free. TANSTAAFL, and all that. Here some additional "costs" you may have to consider. (Organizers: think about the huge commitment your speakers are making when they agree to speak. Try to make things as easy for them as possible.)

  • Time off. Some companies are happy to consider conference-attending as work days. But if your company isn't, or if you're self-employed or a student, or have already done a lot of speaking this year and your company can't really cover any more, then you'll be using your PTO or otherwise covering these days yourself.
  • Travel costs. Even if the conf offers reimbursement for travel costs, most do so within a few days of the actual conference. If that's the case, you're going to have to float the money until the paperwork and funding goes through. And unfortunately it's not uncommon to have to "remind" the organizers to process the reimbursements. This can be reduced by having the conf book (and pay up front) for as much as possible, but not all confs offer this and this isn't an option if you're traveling with a SO and want to sit together on the plane.
  • Travel hassles. Travel can suck, particularly if you're going via airplane. Your odds of encountering that suck increase with every layover and international border.
  • Eating. If you're traveling, you'll probably be eating out. There is almost never a per-diem covered by community conferences, so be sure you've budgeted for your food. Also consider any tourism costs if you'll be combining the conf with a few actual vacation days.
  • Talk preparation time. How much do you value your time? Somewhere between minimum wage and your hourly rate? If you have a talk accepted, your new hobby is preparing that talk. Writing and researching and coding demos and practicing in front of people. Some magicians can write a 25 minute talk in 3 days. I sure can't. My talk preparation is like water in a pothole - it expands to fill all available time and space.
  • Partner time. If have a partner traveling with you, odds are they won't attend the conference with you. But you'll probably plan to spend time with them; perhaps dinner each day and a few days touring after the conference. Be sure to work this all out ahead of time so that all expectations are met.


Katie Kurkoski
Git History. Wed, 02 Nov 2016 00:00:00 PDT Want to take a spin in the good old git time machine? Here are some useful ways to do that.

git show --name-only [sha]
Show which files have changed between the referenced [sha] and the current HEAD.
git log --grep=[stuff]
Show any commits where the commit message matches the regular expression [stuff].
git log -p [filename]
Show the log (commits and changes) for a the file [filename]. You can add any log arguments to this, such as 25 for only the most recent entries in the log: git log -p -25
git grep [stuff]
Use the power of git to search for any matches of the regular expression [stuff] in the repo.

Piping Output

  • If the results are too difficult to read in your terminal, you can pipe the results to your test editor. For example, to pipe the output to Sublime from OSX's Terminal: git log -p -2 | subl.
  • Or you can pipe those results to a file to save them. For example, to send the results to a file in Windows' Command Line: git log -p -25 > file.txt
Katie Kurkoski
Finding Projects for Open Source Contributions. Sun, 09 Oct 2016 00:00:00 PDT Have you been thinking about contributing to open source projects, but didn't know where to start? Here are a few ways to get started. find projects which are actively welcoming new contributors by highlighting their "starter" issues - bugs which are small in scope or otherwise make a good introduction to the project.

Katie Kurkoski
How I Got Involved With CascadiaFest. Mon, 12 Sep 2016 00:00:00 PDT I feel very lucky to have been invited to organize CascadiaFest for the past two years - first as Browser (JavaScript) Day Curator, and this year as CSS Day Curator. Sometimes people have asked me how I got involved with CascadiaFest in the first place, so I thought I'd tell that story.

Way back in 2013, I decided that it would be good for my professional development to attend some conferences. I had just started a new job, with some savings left over from unemployment time, and so I had some budget to attend conferences on my own dime. I had met Carter Rabasa (founder and long-time organizer of CascadiaJS) by attending the SeattleJS meetup in the previous year. So I arranged a trip to Vancouver, BC for CascadiaJS in November. On the Hacker Train up from Seattle to Vancouver, I met Tracy Hinds, who had organized the Hacker Train all the way up from Portland.

CascadiaJS 2013 was an absolute blast. The talks were interesting and educational, and I met a bunch of new (and now long-time) conf-friends and even got mistaken for a speaker! I followed new friends on Twitter, and CascadiaJS on Github. Not too long after coming home, I wrote up and posted some of my notes and published them on this blog. I knew I would be ready to do it again in 2014.

And I did. CascadiaJS 2014 was in Portland, and I bought a ticket and lodging nice and early. Beyond being excited about attending, I had even begun to think I might be able to speak. I had even submitted a talk. It was pretty awful, but that's the first step. 2014 was just as wonderful as the last year - I made sure to thank Tracy and Carter (head organizers for that year) personally, since I knew it was a ton of work to organize something so big and so lovely. (Organizing a conference is kinda like organizing a wedding, once a year.) Since I followed the CascadiaJS repo, I was able to observe many parts of the organization process, and contributed some (hopefully!) helpful thoughts for the next year.

By early 2015, I'd had some success with my talk proposals, and had managed to speak at 2 other conferences. Thus I felt qualified to help other people with their talk proposals and I volunteered to do so; and also to help with CFP out-reach - something I feel passionate about. But Tracy responded asking would I be interested in becoming a core organizer and curating JavaScript Day? After only a little thought, I responded "absolutely yes"!

So, there you go. I got involved by attending first, providing useful feedback to the organizers, and participating in the community.

Katie Kurkoski