2008 Headshot

The Life Unwired

with Ben Combee

Random Shotbottery
2008 Headshot
I had my second one-on-one session with TechShop's ShopBot Alpha tonight, and I hit a few obstacles. My first time was using 3/4" MDF and it worked out very well. This time, I was using 3/4" pine, and I had a bit of unevenness with the depth of cutting.

My first problem was setting the wrong Z dimension in my original file. I had Z=0 at the bottom of the part, not the top. This caused a lot of confusion with setting the zero point on the table, and I ended up using an offset to get things right. However, I was guessing at it, and may have been off in my calculations a little.

My second problem was not tightening my collet enough to hold my endmill. I thought it was adequate, but my depth kept changing during my second cut, and when I stopped the tool and checked the tightness, it had loosened a lot.

My third problem was holding the wood to the table. I'd used the composite nails to good effect, but with a couple of false starts, my final work was far enough down on the wood to be beyond my last nail. I think this was responsible for the exterior cut gouging the surface a little. Fortunately, it was a small cut and the TechShop DC gave me a pass, but I really want to avoid this problem in the future.

My last problem was using too high of a plunge depth. I had to adjust VCarve Pro's tooling database to add the 1/8" endmill I was using, and while I correctly updated the diameter, I forgot to update the depth, and I think that let to too deep of an initial cut which then led to having the uneven bottom surface.

My final part was OK, but it will need a bit of manual work to clean up parts, and I already had some chipping from the pine in part of a relatively thin interior wall.

Lessons learned:

1) remember to run VCarve with Z=0 set to the top of the part.
2) when adjusting your endmill settings, make sure you adjust all of the parameters
3) when using natural boards, it's probably a good idea to plane them first to ensure a uniform thickness
4) when affixing the board to the surface, go a little overboard with the composite nails. Why use four when six or eight would work?

Moving On from LG
2008 Headshot
(originally posted to the enyo-development mailing list)

Hello, Enyo developers.

Friday was my last day with LG Electronics; I've left to pursue a new opportunity with Roku working on new product development here in Austin, TX.

I consider Enyo to be a great product, a result of excellent architecture work by the original developers and a very thoughtful and innovative evolution of features. I'm really proud of what we did in the last year under LG, and I'm looking forward to the Enyo and webOS-powered LG SmartTVs hitting the US market soon.

The good news is that LG is still fielding a great Enyo team with a bunch of great developers that are keeping the work going, including Gray Norton, Kevin Schaaf, Cole Davis, Blake Stephens, Aaron Tam, Jim Tang, and Lex Podgorny, as well as the LG teams from TV Lab in Korea. Look for their input here as part of our public Enyo conversation; I expect great things to come.

I'd also like to recognize all the wonderful input from the community; your pull requests and questions have made Enyo development much more enjoyable, and I'll miss working with you.

I'm still going to follow this email list and check up on things from time to time, but I'm no longer speaking in my role as project lead, just as team member emeritus. My day-to-day work is going to involve firmware development for embedded hardware, so I won't be spending too much time in the web development world.

Thanks, and best wishes to you all!

More Trotec Laser Cutting Tips
2008 Headshot
One good way to get horizontal symmetry is to set your document width to match the exact size of the material you're using, then select all of your objects, group, and center horizontally in the document.

If you're doing a double sided design where symmetry is important, be sure to do a horizontal flip before printing in Corel Draw to make sure things line up. I learned this the hard way working on the Enyo ornaments.

When you do your test run, look for overdraws and edit those out using the Corel object editor. Auto-trace can often leave these in, and they just end up causing longer jobs and scorching.

When you're mixing engraving and cutting, make the engraved bitmap the black color. For some reason, Trotec's software just wasn't seeing non-grayscale as something that could be etched, even though Job Control allows setting that up. It's OK to use lots of colors for all your cutting layers.

When possible, use multiple colors for your vectors to order cuts. This is important if you're cutting small features out of larger shapes and using plywood that has a tendency to be uneven, so if you cut the larger features first, you may be out of focus for the interior ones if the work material has dropped.

Always use the job estimation feature in Job Control. Not only does it show about how long the laser will take, but it lets you know quickly if the software isn't understanding your layers.

Some Laser Cutting Settings for the Trotec Speedy 300
2008 Headshot
I've been spending more time at Austin's TechShop lately working on projects... my creativity has been desperately needing some outlets. One project involves making molds out of plywood for vacuum forming, and I'm using layers of laser-cut plywood for this, since I need some pretty precise heights.

The standard TechShop laser here in Austin is the AWESOME Trotec Speedy 300, far more powerful than the Epilog 40W laser that we had at Resistor. However, that's meant having to adjust my settings for various materials with a lot of trial and error.

Here's some values that worked pretty well:

5.2mm birch plywood: for cutting, use one pass 100% power, 0.70 velocity, and 1000 PPI. For relief engraving, use 60% power, 20 velocity, and 1000 PPI.

1/4" MDF board: this took a lot of tries, as it's very dense with lots of layers to cut through and also tends to smoke and flare up. I would end up having to do run after run which would scorch the material. No fun. What ultimately worked for cutting was 100% power at 2.0 velocity for five passes, each one adjusting the Z-axis offset 0.05". That was fast enough to not flare up as badly, and adjusting the height kept the laser cutting the bottom layers of material instead of just burning the sides.

A Few Skills Needed to Maintain a Modern JS Framework
2008 Headshot

While working on my talk at this year's OSCON, I brainstormed a list of skills that I used in my day-to-day job of keeping the Enyo JS framework going. It got to be a lot larger than I thought:

  • know JavaScript front and back
  • track evolving work in the JS standards world
  • follow interesting techniques from other libraries and tools
  • watch interesting language work that can build on JS (CoffeeScript, TypeScript)
  • plan future direction of your own library
  • understand web browser implementation
  • be aware of quirks and differences between common web browsers and versions
  • understand CSS
  • follow interesting work in CSS standards
  • follow new developments in applications of CSS
  • watch development of tools to enhance styles
  • understand algorithmic complexity
  • understand memory allocation systems
  • be an expert of profiling systems for CPU and memory usage
  • develop your own tools
  • have a working knowledge of front-end build systems
  • understand language minification
  • understand node.js for its use in building tools
  • understand HTTP and follow future HTTP work
  • understand XmlHttpRequest, its various versions
  • understand cross-domain issues and be able to specify how to handle them from client & server
  • understand WebSockets and follow its work
  • understand web security issues and be able to audit your code for problems
  • understand code coverage tools
  • understand test frameworks and testing strategies
  • understand and use continuous integration systems
  • have a good working knowledge of current GPU hardware and its capabilities
  • have a knowledge of Linux systems and how to measure whole-system performance
  • understand the DOM rendering, layout, and painting loop for WebKit
  • have good personal skills
  • be interested in helping other developers with their problems
  • have knowledge of social software systems (forums)
  • have expertise on version control software
  • have expertise on using GitHub to manage a software project
  • have expertise on usign JIRA to manage issue management
  • understand compilers and the limits of what a JIT system in your JS engine can do
  • have working knowledge of various coding standards and defendable opinions
No wonder I feel like I don't have much free time!

TechShop project ideas
2008 Headshot
As I've been taking classes at TechShop and getting trained on the various tools, I've been trying to catalog some project ideas. Rather than keeping them all in my mind or on scraps of paper, I'm going to post them here. If you like something, let me know and I might move it up my list.

Laser-cut chess board

I've started design files on this, making a 8" by 8" chess board surface. This was inspired by noticing a feature of Corel Draw called "Postscript Fills", which are procedurally-drawn patterns that can fill a curve. Unfortunately, so far I can only get those to raster, so I might need to do some coding to have the same kind of line patterns turned into hairline curves that will cut nicely into the wood. I'm thinking of something like a nice space-filling curve or spiral will go into the dark squares, with the light ones being left uncut. Then, you'll finish the surface using sanding on the edges and some sort of wood oil.

Metal ball-bearing labyrinth

This is inspired by the kinds of cuts that are easy to make on the milling machine.  The original class project was making a business card holder out of aluminum, which involved cutting a half-inch notch horizontally across the surface, then deepening it by making more passes at different z-heights.  This project would involve a small aluminum blank where you'd surface the sides, then mark out a maze pattern on the surface.  The mill would then cut into the aluminum about 3/8th of an inch and you'd use the X and Y controls to cut out the maze pattern.  You'd then match this up with an appropriately sized ball bearing and have a little puzzle.  I've not yet figured out the best way to get a rounded track, but there may be end-mills that curve at the end that could be used.

Urban Patchwork vinyl car stickers

I've already tried out making some vinyl stickers for a office door sign.  This involves taking the Urban Patchwork logo (a chicken on a shovel head), prepping it as a cutting curve, then using Corel Draw to run the vinyl cutter.

Baby room letter stickers

Another vinyl cutter idea: Letters for the wall in both the Latin and Cyrillic alphabets.  I need to find some cute fonts that will look nice as wall decorations.  This might also work better with some wallpaper so we don't have to do layout directly on the wall, but instead can make borders and then put them up as one group.

Metal trash can handle

We have a steel trash can in our kitchen that has a floor pedal to open the lid.  However, usually I just pull the top up manually.  I've though about making a magnetic handle that will stick to the top providing an easier way to open it.  I can do this with rare-earth magnets, but I need a way to embed those magnets into the handle so they won't escape but will hold things together.  This feels like something that already exists as a product I can buy, but I've just not seen it yet.

AC-Sensitive Radio Remote Control

Off the wall idea.  Our AC is run by our Nest thermostat which sends information about its current state to the nest.com website.  Have a client on the Chumby go and pull down current status, and when it sees the AC fan turn on or off, use that to adjust the volume on our clock radio up or down a few clicks via a IR transmitter.  I could use some other device, but the Chumby has the advantage of having wifi, a Linux shell, programming via Perl, and a free USB port.

Microsoft's Surface Not Suitable for Commercial Use
2008 Headshot
I'm very curious about Windows RT and the new Surface device, and I expect I'll be testing one as soon as they start shipping for my Enyo work. However, one item on Microsoft's Surface pre-order page has me a bit concerned. In small print at the bottom of the page is the note:

[2] Microsoft Home and Student 2013 RT Preview edition installed. Final Office Home & Student version will be installed via Windows Update when available (free download; ISP fees apply). Some features and programs unsupported. Office Home & Student 2013 RT Preview and the final version are not for use in commercial, nonprofit, or revenue generating activities. Commercial license options available (sold separately). See http://office.com/officeRT.

So, it looks like all those business users won't be able to actually use the installed Office suite for any business activity. The restrictions are pretty strong -- I expect that looking at a work email attachment on a Surface would violate the "no commercial" aspect of this. Obviously, MS does want the surface to become a back-door replacement for enterprise PCs with their expensive bulk-purchased commercial Office suites, but this seems like a very strong limitation for a mobile device.

Cross-Origin Requests, and the user/password arguments of XmlHttpRequest.open
2008 Headshot
Documenting this so it can be found if other people hit it in the future.

While tracking down a Enyo bug, https://enyojs.atlassian.net/browse/ENYO-645, I found an odd quirk of how cross-domain requests are done. Traditionally, you couldn't make a XHR request from a site on one domain into a site on another. However, browsers in the last few years have implemented a new scheme called CORS, short for

HTML5 Rocks has a great tutorial on it at http://www.html5rocks.com/en/tutorials/cors. For a simple GET request, all you have to do is add a header to what the server sends and your gold.

Things get more complicated if you want to do HTTP basic authentication with CORS. By default, a CORS request won't send credentials like cookies or the Authentication header. However, if you set the "withCredentials" property of the XmlHttpRequest object to true, they will be sent. However, that also triggers a pre-flight check from the browser where it makes an OPTIONS request without the credentials to verify that it will be able to actually make the second request. This is to prevent passing on credential data to a server that's not expecting CORS requests.

So, normally to do HTTP basic authentication, you can pass a username and password in your call to xhr.open. However, in the XHR level 2 spec, as seen at http://www.w3.org/TR/XMLHttpRequest/#the-open-method, using those arguments in a cross-origin setup will cause a failure. In Firefox 14, I didn't get the exception immediately, but instead it came when I used xhr.send(). I spent a long time trying to figure this out. What did work was directly specifying the "Authentication" header via xhr.setRequestHeader. I can only guess that the error flag gets set before any use of withCredentials can reset it back.

On the server side, I ended up needing these headers all to be returned in the OPTIONS request for this to work:

  • Access-Control-Allow-Origin: **exact value of request Origin header**
  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Methods: GET
  • Access-Control-Allow-Headers: Authorization

Webduino update
2008 Headshot
I took a few hours today to get back to an old open-source project of mine, the Webduino HTTP server library. Since I last touched it about 18 months ago, a few developers have forked it over on GitHub and even done some pretty cool projects. Martin Lormes has been writing at about his changes, including favicon.ico support to keep browsers from making extra requests and supporting HTTP basic authentication. I also saw a Christmas tree that had its lights controlled by a Webduino-powered form.

I've got my own fork going over at GitHub too now, and just checked in a bunch of small fixes that I'd been saving up. I've not had a chance to do tests yet, as I've got to dig up some of my hardware from where I left it after my September trip to New York City.

Ending the "My Tweets" experiment
2008 Headshot
I just deleted all the "My Tweets" posts from this LJ account. I thought it would be useful, but it ended up just annoying me, especially since they still hadn't fixed the bug where the text around the tweets was Russian instead of English. However, now that we're working on releasing webOS as an open source project, I do plan on writing a bit more here about what's going on. I'm also working on a big revamp of my personal website that I'll publicize when ready.