<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>The greatest blog in the world.

  var _gaq = _gaq || [];
  _gaq.push([‘_setAccount’, ‘UA-605’+’807-11’]);
  _gaq.push([‘_trackPageview’]);

  (function() {
    var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;
    ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;
    var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);
  })();</description><title>Bryce Kerley</title><generator>Tumblr (3.0; @bryceblog)</generator><link>http://blog.brycekerley.net/</link><item><title>How to enable Google Hangouts for your Domain Account</title><description>&lt;p&gt;Google&amp;#8217;s &amp;#8220;Hangouts&amp;#8221; feature change this week broke it for Domain/Apps/Business accounts. Get your Google domain administrator to do this to get it back:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Go to &lt;a href="http://google.com/a/"&gt;http://google.com/a/&lt;/a&gt;&lt;em&gt;YOURDOMAIN.EXAMPLE&lt;/em&gt; (make the appropriate substitution).&lt;/li&gt;
&lt;li&gt;Log in.&lt;/li&gt;
&lt;li&gt;Click the &amp;#8220;Settings&amp;#8221; tab.&lt;/li&gt;
&lt;li&gt;In the left column, click&amp;#8221; Talk&amp;#8221; under the &amp;#8220;Services&amp;#8221; header.&lt;/li&gt;
&lt;li&gt;
  Click the &amp;#8220;Enable the new Hangouts&amp;#8221; radio button in the &amp;#8220;Hangouts&amp;#8221; section.
  &lt;br/&gt;&lt;img src="https://www.evernote.com/shard/s148/sh/48bb5a4f-b674-4f55-921d-8c0895515606/9fbb682e43fdfbbf7330f372ca89fc0b/deep/0/Google%20Apps.png" alt="screenshot of steps"/&gt;&lt;/li&gt;
&lt;li&gt;Tick the &amp;#8220;I have read and acknolwedge&amp;#8221; check box.&lt;/li&gt;
&lt;li&gt;Click the &amp;#8220;Continue&amp;#8221; button.&lt;/li&gt;


&lt;p&gt;It would be nice if Google emailed domain administrators when new features become available and require administrators to configure them.&lt;/p&gt; &lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/50731216949</link><guid>http://blog.brycekerley.net/post/50731216949</guid><pubDate>Sat, 18 May 2013 10:53:12 -0400</pubDate></item><item><title>Thoughts from 37,000 Feet</title><description>&lt;p&gt;&lt;em&gt;These thoughts are things that occurred to me during my travels home from Scottish Ruby Conference. They haven’t been checked for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;So I noticed that Weird Twitter really picks up at about midnight in California. Is that when the Burger Kings that weird twitter work at all close?&lt;/li&gt;
&lt;li&gt;It sucks when you get on a plane after running your out-of-shape ass and a bunch of luggage through Heathrow and can’t get water right away.&lt;/li&gt;
&lt;li&gt;It doesn’t suck when airline and airport staff have procedures to get you to your flight even when your inbound connection is delayed an hour.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;In Time&lt;/em&gt; tries really really hard to be preachy but it’s still a watchable action movie.&lt;/li&gt;
&lt;li&gt;Curry shrimp is not my first choice for airplane food. It was tasty though.&lt;/li&gt;
&lt;li&gt;It’s weird as hell how much you miss your cat after a week.&lt;/li&gt;
&lt;li&gt;Shoulda set up ACE editor when I had an internet connection. Can’t build it without having pre-downloaded a bunch of stuff ‘cause it doesn’t look like I can just &lt;code&gt;cat&lt;/code&gt; some files together by hand.&lt;/li&gt;
&lt;li&gt;The Rockwell Collins in-flight moving map could stand to be as good as the iPhone’s map interface from 2007. A higher resolution and the ability to show both &lt;/li&gt;
&lt;li&gt;this movie about bikes is cool&lt;/li&gt;
&lt;li&gt;well it was until main character skidded over a set of skid marks obviously from a previous take&lt;/li&gt;
&lt;li&gt;Sipping single-malt whisky while crossing the Atlantic is almost as cool as sipping it while hanging out with @tef and @ryanstenhouse.&lt;/li&gt;
&lt;li&gt;I wonder if my luggage is on board? The agents at LHR said it wasn’t, but who knows?&lt;/li&gt;
&lt;li&gt;Wine and cheese. Yes.&lt;/li&gt;
&lt;li&gt;Does Daniel Craig’s James Bond live in a world where no James Bond movies exist? Or where previous James Bonds didn’t exist? I bet he’d really like some kind of suitcase helicopter during the intro to Skyfall but those don’t exist in our world and obviously don’t exist in his.&lt;/li&gt;
&lt;li&gt;“This is 40” has one of the funnier pre-title-sequence openings I’ve seen this flight.&lt;/li&gt;
&lt;li&gt;This really could be “Thoughts from 40,000 feet” because I just noticed that on the Rockwell Collins in-flight moving map on the big screen for the cabin.&lt;/li&gt;
&lt;li&gt;Just “got” a joke about gout.&lt;/li&gt;
&lt;li&gt;Nothing like a well-timed fart joke.&lt;/li&gt;
&lt;li&gt;When did Judd Apatow become a good director? I’m thinking “Pineapple Express.”&lt;/li&gt;
&lt;li&gt;How the hell did this become such a romantic movie?&lt;/li&gt;
&lt;li&gt;Never mind.&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.brycekerley.net/post/50615671289</link><guid>http://blog.brycekerley.net/post/50615671289</guid><pubDate>Thu, 16 May 2013 20:42:47 -0400</pubDate></item><item><title>Lessons from LessConf</title><description>&lt;p&gt;&lt;em&gt;LessConf 2013, the last LessConf event, was a few weeks ago. This is a few short things I&amp;#8217;ve learned; more details in a future post.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Everyone at the conference is cool. Don&amp;#8217;t just talk to people you know. Talk to everybody.&lt;/li&gt;
&lt;li&gt;Is somebody standing alone and looking bored? Talk to them immediately!&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re getting up from a table to get something for yourself, you&amp;#8217;re getting stuff for the rest of the table too.&lt;/li&gt;
&lt;li&gt;Have cards. Have stickers. Using smartphones to move contact info around is still awful.&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t be afraid to pop your shirt off.&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.brycekerley.net/post/49050155229</link><guid>http://blog.brycekerley.net/post/49050155229</guid><pubDate>Sat, 27 Apr 2013 20:46:30 -0400</pubDate></item><item><title>How I Got Into Ruby, Part 2</title><description>&lt;p&gt;I learned Ruby and Rails in 2005 after several years puttering around in other programming environments. Ruby stuck with me because it&amp;#8217;s easy to make programs do what you want: the builtin and standard libraries have lots of sensible methods, and the universe of Gems is comprehensive and ever-expanding. What doesn&amp;#8217;t yet exist is usually easy to build.&lt;/p&gt;

&lt;p&gt;I got bored of performing the same security audits week after week and hearing the same excuses/mitigations for why clients weren&amp;#8217;t passing the audit. The most enjoyable parts of my work were building software. I took a couple days&amp;#8217; vacation to go to acts_as_conference 2008 in Orlando, and met Brennan Dunn, who was looking for Rails talent to work with him in Miami. I expressed interest, scheduled an interview, and moved to Miami.&lt;/p&gt;

&lt;p&gt;I wasn&amp;#8217;t ready for the pace of that job. Getting requirements was a lost cause, because I&amp;#8217;d figure out out the right way to implement them, and then they&amp;#8217;d be different. This, the buildup of technical debt I wan&amp;#8217;t mature enough to handle, and the apparent ease of success to be had doing Rails consulting caused me to leave for a contract gig.&lt;/p&gt;

&lt;p&gt;The first customer I had went too far in the other direction. The first work I did was to optimize a slow page by making the algorithm to draw it use hashes instead of arrays (going from O(n) to O(log(n)) on each row of a table), a ten line change. This was followed by a frustrating introduction to design reporting, design reviews, change reporting, and of course change review meetings; a process that added hundreds of pages and dozens of wasted hours to an afternoon&amp;#8217;s work. However, the checks cleared, and I was still having fun.&lt;/p&gt;

&lt;p&gt;Once that wrapped up, I worked with another client on an e-commerce site for a year, and found that work terribly frustrating, especially when it came to contracts, delivery, and getting paid. During that year, I also took over the Miami Ruby Brigade, and found out that I really enjoy teaching and talking about programming.&lt;/p&gt;

&lt;p&gt;One of my neighborhood friends, Matt Heitzenroder, informed me that Basho, makers of the Riak distributed database, were looking for a Ruby developer to help clients build web applications using their database. Since the independent route wasn&amp;#8217;t working out for me, I interviewed, and started at Basho in September, 2011.&lt;/p&gt;

&lt;p&gt;Basho has been a fantastic place to work so far. Processes tend to be simple and functional, I&amp;#8217;m surrounded by&lt;sup&gt;1&lt;/sup&gt; smart and friendly coworkers, and we work on cool stuff.  At the same time, I&amp;#8217;m happy with how far the Miami Ruby scene has grown; having weekly meetings leads to stronger meetups, and three of us are now teaching a ten-week Rails course at the LAB Miami coworking space.&lt;/p&gt;

&lt;p&gt;Ruby&amp;#8217;s done quite a bit for me over the last six years, and I’d like to extend many thanks to the Ruby and Rails communities, past and present, for helping make me productive while still enjoying the act of building software.&lt;/p&gt;

&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;&amp;#8220;surrounded&amp;#8221; figuratively; I believe I&amp;#8217;m the southernmost Basho employee.&lt;/li&gt;&lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/47870868842</link><guid>http://blog.brycekerley.net/post/47870868842</guid><pubDate>Sat, 13 Apr 2013 12:00:29 -0400</pubDate></item><item><title>How I Got Into Ruby, Part 1</title><description>&lt;p&gt;I&amp;#8217;ve programmed computers since I got a TI-83 graphing calculator for high school algebra; learning TI-83 BASIC in high school, figuring out the &amp;#8220;right&amp;#8221; or at least &amp;#8220;best&amp;#8221; ways to work with it was a fun challenge. After that, I learned the typical PHP/MySQL environment during the general-education years of college, and Perl from coworkers at a job.&lt;/p&gt;

&lt;p&gt;During this time (2003-2005), I also picked up a book about Python, on the recommendation of friends online. It remained unopened, as PHP was easy to get deployed and the Python book didn&amp;#8217;t immediately launch into making and deploying web applications.&lt;/p&gt;

&lt;p&gt;I found a job working for Prof. Jennifer Collins, a meteorology professor at USF, doing general/light software work. Prof. Collins ran a rooftop weather station, and wanted to make this weather data, along with images from RADAR and satellite services, available on a screen in the building&amp;#8217;s lobby. The first thing I tore in to was the TCL and PHP setup that served weather images, current conditions, and historic data. Images came from the McIDAS software, data from a directory full of tens of thousands of CSV files (one for every ten minutes the weather station ran).&lt;/p&gt;

&lt;p&gt;At the same time, my good friend Sam Stephenson recommended that I learn Rails, then in an early pre-1.0 version. Writing the application was easy and quick, however the CGI process for serving each page was not. I got to experience the &amp;#8220;joy&amp;#8221; of configuring FastCGI on 2005-era Fedora Linux, and eventually got to use Zed Shaw&amp;#8217;s fantastic Mongrel app server (once it supported directory prefixes, which he released literally the second day I was working with it).&lt;/p&gt;

&lt;p&gt;Since then, I&amp;#8217;ve worked with Ruby nearly constantly, even in extremely hostile/incompatible situations. I worked for a little over a year performing security audits for a large enterprise-y client. In one research project for auditing, I needed a VBScript file to scrape configuration information from a Windows machine. Instead of suffering VBScript (a truly awful language,)  I wrote the bare minimum to load a few different configuration entry types, and templatized the rest to be driven by a Ruby application.&lt;/p&gt;

&lt;p&gt;In the next installment, I&amp;#8217;ll go into how I developed this into a career.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/47786561113</link><guid>http://blog.brycekerley.net/post/47786561113</guid><pubDate>Fri, 12 Apr 2013 12:00:22 -0400</pubDate></item><item><title>Ruby 2.0: Keyword Arguments</title><description>&lt;p&gt;Ruby’s had nice method arguments for as long as I’ve been using it: optional arguments, grabbing arguments into an array, automatically compressing a trailing hash into a single argument:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;opt "okay", lets: 'do it'
# call method "opt" with first argument "okay" and second argument {:lets=&amp;gt;'do it'}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;New in Ruby 2.0 is a rather enviable Python feature, keyword arguments:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def kw(x, y: "default y")
end
  
kw "hello", y: "hasta la vista"
# kw called with x="hello" and y="hasta la vista"

kw "oops"
# kw called with x="hello" and y="default y"

kw "hello", "friends"
# #&amp;lt;ArgumentError: wrong number of arguments (2 for 1)&amp;gt; raised
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is sometimes better than hash compression. Frequently you’ll end up setting a bunch of defaults for missing hash entries&lt;sup&gt;1&lt;/sup&gt;; keyword arguments simplify that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/bkerley/5268037"&gt;I put some sample code on Gist&lt;/a&gt; and owe quite a bit to Urabe Shyouhei for their excellent &lt;a href="https://speakerdeck.com/shyouhei/whats-new-in-ruby-2-dot-0"&gt;“What’s New in Ruby 2.0” slide deck.&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;Some increasingly-worse ways to set defaults from missing hash entries can be found on &lt;a href="http://stackoverflow.com/questions/5931313/ruby-method-with-argument-hash-with-default-values-how-to-dry"&gt;Stack Overflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/46557214732</link><guid>http://blog.brycekerley.net/post/46557214732</guid><pubDate>Thu, 28 Mar 2013 22:09:00 -0400</pubDate></item><item><title>to be totally fair, this isn't my joke</title><description>&lt; bryce&gt; a topologist is somebody who doesn't know their ass from a hole in the ground, but does know their ass from two holes in the ground</description><link>http://blog.brycekerley.net/post/46382381786</link><guid>http://blog.brycekerley.net/post/46382381786</guid><pubDate>Tue, 26 Mar 2013 21:01:43 -0400</pubDate></item><item><title>FIVE-YEAR-OLD DISCOVERS DINOSAUR, NAMES IT AFTER HERSELF, DROPS MIC FOR THE REST OF HER LIFE</title><description>&lt;a href="http://grist.org/list/five-year-old-girl-discovers-dinosaur-has-it-named-after-her-can-safely-not-accomplish-anything-else-for-the-rest-of-her-life/?utm_source=facebook&amp;utm_medium=update&amp;utm_campaign=socialflow"&gt;FIVE-YEAR-OLD DISCOVERS DINOSAUR, NAMES IT AFTER HERSELF, DROPS MIC FOR THE REST OF HER LIFE&lt;/a&gt;: &lt;p&gt;&lt;a href="http://wolvensnothere.tumblr.com/post/46067847796/five-year-old-discovers-dinosaur-names-it-after" class="tumblr_blog"&gt;wolvensnothere&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://apolloadama.tumblr.com/post/45949635749"&gt;apolloadama&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On a fossil-hunting trip with her family, five-year-old Daisy Morris found the remains of a previously undiscovered dinosaur, which is now named &lt;em&gt;Vertidraco daisymorrisae. &lt;/em&gt;The new dino is not only a previously unknown species, but an unknown genus, making Daisy’s find a really big deal. It’s a pterosaur — a winged flying dino — about the size of a crow, which lived 115 million years ago. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hell. Yes. You Go, Daisy Morris.&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.brycekerley.net/post/46288968904</link><guid>http://blog.brycekerley.net/post/46288968904</guid><pubDate>Mon, 25 Mar 2013 19:11:37 -0400</pubDate></item><item><title>Jumbly Text</title><description>&lt;img src="https://www.evernote.com/shard/s148/sh/d1ecb5b5-9cc7-4c1c-82e5-2466be074043/0ba6720babdcf725a54f403a6fe15276/deep/0/Screenshot%203/20/13%2020:49.jpg" alt="lorem ipsum with a bad baseline: read on!" border="1px"/&gt;&lt;p&gt;Gross! That slightly rotated text looks terrible!&lt;/p&gt;

&lt;p&gt;That text has been rotated the wrong way.&lt;/p&gt;

&lt;img src="https://www.evernote.com/shard/s148/sh/3c311d7b-9f0e-4c50-adb3-3b4a043f95c2/8291e28e734cb99e3deedf7c85224ab7/deep/0/Screenshot%203/20/13%2020:53.jpg" alt="lorem ipsum with a bad baseline but rotated the other way" border="1px"/&gt;&lt;p&gt;Still wrong.&lt;/p&gt;

&lt;h1&gt;Rotating Vectorized Text&lt;/h1&gt;

&lt;p&gt;To rotate vectorized text, use a &lt;a href="https://en.wikipedia.org/wiki/Transformation_matrix#Rotation"&gt;Rotation matrix&lt;/a&gt; on each vertex in the text that hasn&amp;#8217;t been rasterized yet. If your rasterizer doesn&amp;#8217;t support floating-point coordinates (why would it, you can&amp;#8217;t have part of a pixel&lt;sup&gt;1&lt;/sup&gt;), the text will look all jumbly and weird.&lt;/p&gt;

&lt;h1&gt;Rotating Rasterized Text&lt;/h1&gt;

&lt;p&gt;Render the text to a grid of pixels called a &amp;#8220;surface.&amp;#8221; Use a rotation matrix on each pixel in screen space to sample the surface, using some kind of interpolation that isn&amp;#8217;t just nearest-neighbor. When you sample a point that&amp;#8217;s not completely foreground or completely background, you&amp;#8217;ll get a fuzzy-looking intermediate color.&lt;/p&gt;

&lt;img src="https://www.evernote.com/shard/s148/sh/ab71687b-beef-4a55-b4b4-a1c68508ff2b/5c7f25c517cfe2d8c5789a0e3206cb3d/deep/0/Screenshot%203/20/13%2021:10.jpg" alt="a fuzzy lorem ipsum" border="1px"/&gt;&lt;h1&gt;What this means for your designs that have rotated text&lt;/h1&gt;

&lt;p&gt;Vectorized text is snapped to pixels in Firefox 17.0 on Mac OS X, Chrome 25.0.1364.172&amp;#160;m on Windows, many browsers I didn&amp;#8217;t feel like testing, and Photoshop. If this jumbly look is okay or you don&amp;#8217;t target these, you don&amp;#8217;t really care.&lt;/p&gt;

&lt;p&gt;In a web page, you have two ways of rotating text:&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;      .jumbly {
        transform: rotateZ(1.5deg); 
      }
      
      .smooth {
        transform: rotate3d(0, 0, 1, 1.5deg); 
      }
    &lt;/pre&gt;&lt;/code&gt;
 
&lt;p&gt;The former, &lt;code&gt;rotateZ&lt;/code&gt;, rotates vectorized text. The latter, &lt;code&gt;rotate3d&lt;/code&gt;, uses a 3d transform that happens to rasterize the text before rendering it. Since this looks correct in more browsers, use that.&lt;/p&gt;

&lt;img src="https://www.evernote.com/shard/s148/sh/a496fec8-a7fc-4eea-95bc-f9bca7c444fa/ada98392fbb3ca13d3971e4de8fbf4b1/deep/0/Screenshot%203/20/13%2021:16.jpg" alt="fuzzy and smooth text samples in times new roman" border="1px"/&gt;&lt;h1&gt;Sources&lt;/h1&gt;

&lt;p&gt;Source code for the sample pages can be found in the &lt;a href="https://github.com/bkerley/jumbly_text/"&gt;jumbly_text repo on GitHub.&lt;/a&gt; I put a &lt;a href="http://bkerley.github.com/jumbly_text/"&gt;demo page&lt;/a&gt; up too.&lt;/p&gt;

&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;Well, sub pixel rendering is a thing, but you can only have three parts of a pixel in that case.&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/45879418927</link><guid>http://blog.brycekerley.net/post/45879418927</guid><pubDate>Wed, 20 Mar 2013 21:17:57 -0400</pubDate></item><item><title>No More Big Launches</title><description>&lt;p&gt;&lt;a href="http://arstechnica.com/gaming/2013/03/clogged-streets-simcity-launch-plagued-by-server-problems/"&gt;The SimCity launch last week was awful.&lt;/a&gt; Long wait times to join a crashy client into an overloaded server cluster that doesn&amp;#8217;t even have the courtesy to replicate your profile to other clusters.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Color_labs"&gt;The Color.com launch in 2011&lt;/a&gt; was awful. An unusably obtuse client connected to a creepily empty social network running on two expensive domain names.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.destructoid.com/dust-514-now-in-open-beta-on-the-playstation-3-242860.phtml"&gt;Dust 514 seems to be doing okay.&lt;/a&gt; A lengthy and obvious beta period allowed them to grow and iterate the game to its current state, and will (hopefully) turn a profit and continue to be a fun game (Mac release please, thanks!) You&amp;#8217;ll notice there wasn&amp;#8217;t one single huge launch, just a gentle progression. No huge queues to join games&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/"&gt;Twitter&lt;/a&gt; has been famous for teething issues (euphemistically known as &amp;#8220;failwhales&amp;#8221;), which is the opposite of Color&amp;#8217;s overcommitment. While there&amp;#8217;s been days when it hasn&amp;#8217;t worked (frequently during &lt;a href="http://www.twitter.com/SXSWPartyzzzzz"&gt;large social media/marketing conferences like SXSW&lt;/a&gt;), they&amp;#8217;re around today, will probably be around tomorrow, and they&amp;#8217;ve done a great job &lt;a href="http://vimeo.com/55503728"&gt;rebuilding the service to handle the load&lt;/a&gt; without obvious hitches.&lt;/p&gt;

&lt;p&gt;Iterating software is cheap, iterating business concepts isn&amp;#8217;t &lt;em&gt;expensive&lt;/em&gt;, and good will is expensive. While many people&lt;sup&gt;1&lt;/sup&gt; have sworn off SimCity and other EA products forever, there&amp;#8217;s been no noise or &lt;a href="http://www.nytimes.com/2013/03/09/arts/video-games/simcity-from-electronic-arts-plagued-by-server-issues.html?pagewanted=all&amp;amp;_r=0"&gt;New York Times articles&lt;/a&gt; about problems in Dust 514&amp;#8217;s early days.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://gettingreal.37signals.com/ch04_Scale_Later.php"&gt;scale later&lt;/a&gt;, but somebody that hates you for a botched launch won&amp;#8217;t come back later.&lt;/p&gt;

&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;Well, gamers, &lt;a href="http://i.imgur.com/GGmcH6K.jpg"&gt;not the most committed demographic.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/45232148372</link><guid>http://blog.brycekerley.net/post/45232148372</guid><pubDate>Tue, 12 Mar 2013 21:06:53 -0400</pubDate></item><item><title>Really Late Review: The Nest</title><description>&lt;a href="http://zapistan.net/blog/2013/3/6/really-late-review-the-nest"&gt;Really Late Review: The Nest&lt;/a&gt;: &lt;blockquote&gt;&lt;div&gt;We wanted to keep it from 73 to 78 for the birds. […] If we didn’t have any pets at home, we would certainly keep the Nest on auto-away.&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I have a cat and she doesn’t seem to care about the temperature. If it’s too hot, she’ll spend a good 50-75% of the day sleeping in a sunny spot. If it’s too cold, she’ll spend a good 50-75% of the day sleeping in a sunny spot.&lt;/p&gt;
&lt;blockquote&gt;&lt;div&gt;For my friend Bryce, however, he has used it to tweak the temperature on the thermostat on the first floor.&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I frequently remember to turn mine back on before I get home on a hot day.&lt;/p&gt;
&lt;blockquote&gt;&lt;div&gt;It still required you to toggle it from heat mode to cool mode. The only difference was that you could turn on the heat without leaving your bed in the middle of the night through the iPhone app.&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I have never run a heater indoors in Miami.&lt;/p&gt;
&lt;blockquote&gt;&lt;div&gt;Today, the Nest is much better than where it was on launch. &lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The best Nest feature is that there’s a new feature every few months.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/44815999967</link><guid>http://blog.brycekerley.net/post/44815999967</guid><pubDate>Thu, 07 Mar 2013 18:30:28 -0500</pubDate></item><item><title>Color and Web Browsers</title><description>&lt;p&gt;&lt;em&gt;This post is related to the &lt;a href="http://www.meetup.com/miamidesign/events/106419472/"&gt;Design Miami meetup on March 4, 2013.&lt;/a&gt; I did a quick talk about &lt;a href="https://speakerdeck.com/bryce/color-and-computers"&gt;&amp;#8220;Color and Computers&amp;#8221;&lt;/a&gt;, and Dimitry Chamy did a wonderful and exhaustive talk about using colors in design. &lt;a href="http://www.meetup.com/miamidesign/events/106419472/"&gt;Links to meetup materials are available,&lt;/a&gt; and you&amp;#8217;re welcome to future meetups.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Web browsers take descriptions of colors from CSS declarations. Some of them are:&lt;/p&gt;
&lt;dl&gt;&lt;dt&gt;#F0F&lt;/dt&gt;
&lt;dd&gt;12-bit RGB color, four bits per hexit&lt;sup&gt;1&lt;/sup&gt;&lt;/dd&gt;
&lt;dt&gt;#FF00FF&lt;/dt&gt;
&lt;dd&gt;24-bit RGB color, four bits per hexit&lt;/dd&gt;
&lt;dt&gt;rgb(255, 0, 255)&lt;/dt&gt;
&lt;dd&gt;RGB color, decimals&lt;/dd&gt;
&lt;dt&gt;rgb(100%, 0%, 100%)&lt;/dt&gt;
&lt;dd&gt;RGB color, decimal percents&lt;/dd&gt;
&lt;dt&gt;hsl(300, 100%, 50%)&lt;/dt&gt;
&lt;dd&gt;HSL color, decimal degree for hue, and percents for saturation and lightness&lt;sup&gt;2&lt;/sup&gt;&lt;/dd&gt;
&lt;dt&gt;
&lt;/dt&gt;&lt;/dl&gt;&lt;p&gt;The written-out RGB and HSL declarations with decimal-encoded numbers don&amp;#8217;t specify precision per se. &lt;a href="http://www.w3.org/TR/css3-color/#colorunits"&gt;The W3C recommendation for the CSS Color Module&lt;/a&gt; doesn&amp;#8217;t either. If you wanted, you could jam negative numbers or decimal places in there:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Values outside the device gamut should be clipped or mapped into the
   gamut when the gamut is known: the red, green, and blue values must be
   changed to fall within the range supported by the device. […]&lt;/p&gt;

  &lt;div class="example"&gt;
   &lt;p style="display:none"&gt;Example(s):&lt;/p&gt;

&lt;code&gt;
   &lt;pre&gt;
em { color: rgb(255,0,0) }       /* integer range 0 - 255 */
em { color: rgb(300,0,0) }       /* clipped to rgb(255,0,0) */
em { color: rgb(255,-10,0) }     /* clipped to rgb(255,0,0) */
em { color: rgb(110%, 0%, 0%) }  /* clipped to rgb(100%,0%,0%) */
&lt;/pre&gt;
&lt;/code&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since the W3C doesn&amp;#8217;t provide much guidance, we have to see how browsers implement colors.&lt;/p&gt;

&lt;h2&gt;Google Chrome, Apple Safari, and other WebKit Browsers&lt;/h2&gt;

&lt;p&gt;
CSS parsing is done by WebCore, mostly in &lt;a href="https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/css/CSSParser.cpp&amp;amp;q=rgba%20hsla%20lang:%5Ec%2B%2B%24&amp;amp;sq=package:chromium&amp;amp;l=6107"&gt;&lt;code&gt;WebCore/css/CSSParser.cpp&lt;/code&gt;&lt;/a&gt;&lt;sup&gt;3&lt;/sup&gt;.
It calls &lt;code&gt;CSSParser::parseColorParameters&lt;/code&gt; for RGB colors:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;bool CSSParser::parseColorParameters(CSSParserValue* value, &lt;strong&gt;int* colorArray,&lt;/strong&gt; bool parseAlpha)
{
    // …
    for (int i = 1; i &amp;lt; 3; i++) {
        // …
        &lt;strong&gt;colorArray[i] = colorIntFromValue(v);&lt;/strong&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;RGB color components are converted to integers. HSL:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
bool CSSParser::parseHSLParameters(CSSParserValue* value, &lt;strong&gt;double* colorArray&lt;/strong&gt;, bool parseAlpha)
{
    // …
    colorArray[0] = (((static_cast&lt;int&gt;(parsedDouble(v, ReleaseParsedCalcValue)) % 360) + 360) % 360) / 360.0;
    for (int i = 1; i &amp;lt; 3; i++) {
        // …
        colorArray[i] = max(0.0, min(100.0, &lt;strong&gt;parsedDouble(v, ReleaseParsedCalcValue)&lt;/strong&gt;)) / 100.0;
&lt;/int&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;HSL colors are parsed as floating-point (the &lt;code&gt;double&lt;/code&gt; type), but, in &lt;a href="https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/platform/graphics/Color.cpp&amp;amp;sq=package:chromium&amp;amp;rcl=1362575640&amp;amp;l=95"&gt;WebCore/platform/graphics/Color.cpp&lt;/a&gt;…&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
RGBA32 makeRGBAFromHSLA(double hue, double saturation, double lightness, double alpha)
{
    // …
   
    return makeRGBA(static_cast&amp;lt;int&amp;gt;(calcHue(temp1, temp2, hue + 1.0 / 3.0) * scaleFactor), 
                    static_cast&amp;lt;int&amp;gt;(calcHue(temp1, temp2, hue) * scaleFactor),
                    static_cast&amp;lt;int&amp;gt;(calcHue(temp1, temp2, hue - 1.0 / 3.0) * scaleFactor),
                    static_cast&amp;lt;int&amp;gt;(alpha * scaleFactor));
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;We see that our carefully described, bespoke, artisanal, floating point colors are being converted down to 24-bit RGB (well, 32-bit RGBA).&lt;/p&gt;

&lt;h2&gt;Mozilla Firefox and other Mozilla Browsers&lt;/h2&gt;
&lt;p&gt;HSL conversion for CSS is done in &lt;a href="https://hg.mozilla.org/mozilla-central/file/f64b3dbe0b53/layout/style/nsCSSParser.cpp#l4291"&gt;&lt;code&gt;layout/style/nsCSSParser.cpp&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
bool CSSParserImpl::ParseHSLColor(nscolor&amp;amp; aColor,
                                  char aStop)
{
  float h, s, l;

  //… 

  if (ExpectSymbol(aStop, true)) {
    aColor = &lt;strong&gt;NS_HSL2RGB(h, s, l);&lt;/strong&gt;
    return true;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;HSL is converted into an &lt;code&gt;nscolor&lt;/code&gt; instance. As implemented in &lt;a href="https://hg.mozilla.org/mozilla-central/file/f64b3dbe0b53/gfx/src/nsColor.h"&gt;&lt;code&gt;gfx/src/nsColor.h&lt;/code&gt;&lt;/a&gt;, it&amp;#8217;s a 32-bit RGBA thing, just like WebKit.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Storing more than 32 bits of color in your RGB/RGBA declarations is silly. If you use either of the 24-bit representations above (or the 12-bit representation, since it converts losslessly into 24-bit), you&amp;#8217;ll get correct&lt;sup&gt;4&lt;/sup&gt; colors.&lt;/p&gt;
&lt;p&gt;If you use HSL colors, you&amp;#8217;ll lose some precision in conversion, but probably no worse than you&amp;#8217;ll lose when your site gets displayed on a 18-bit or fewer display (such as in the iPhone 3GS and earlier).&lt;/p&gt;

&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;&amp;#8220;hexit&amp;#8221; is like a digit but hexadecimal instead of decimal. If you like contractions, &amp;#8220;hexadecimal digit&amp;#8221; becomes &amp;#8220;hexit.&amp;#8221;&lt;/li&gt;
&lt;li&gt;The degrees component doesn&amp;#8217;t have a glyph because it&amp;#8217;s unintuitive to type: ⌥⇧8 on Mac OS X, Alt-0176 on Windows, ⌃⇧-UB0 on Ubuntu.&lt;/li&gt;
&lt;li&gt;I&amp;#8217;m not pasting whole functions because C++ is ugly and verbose.&lt;/li&gt;
&lt;li&gt;As much as you can have correct colors on the web.&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.brycekerley.net/post/44754571165</link><guid>http://blog.brycekerley.net/post/44754571165</guid><pubDate>Wed, 06 Mar 2013 21:32:46 -0500</pubDate></item><item><title>Ruby: Blocks and Procs</title><description>&lt;p&gt;Ruby has two kinds of anonymous function: blocks, and procs.&lt;/p&gt;
&lt;dl&gt;&lt;dt&gt;Block&lt;/dt&gt;
&lt;dd&gt;A block is a syntactic element. The only things you can do with these are:
&lt;ul&gt;&lt;li&gt;pass them to methods as the &amp;#8220;default block&amp;#8221; argument&lt;/li&gt;
&lt;li&gt;in a method that&amp;#8217;s been called with a default block, &lt;code&gt;yield&lt;/code&gt; zero or more arguments to it, getting a result&lt;/li&gt;
&lt;li&gt;in a method that&amp;#8217;s been called with a default block, capture it into a &lt;code&gt;Proc&lt;/code&gt; with an ampersand in the arguments list&lt;/li&gt;
&lt;/ul&gt;&lt;/dd&gt;
&lt;dt&gt;Proc&lt;/dt&gt;
&lt;dd&gt;A &lt;code&gt;Proc&lt;/code&gt; is an object. You can do just about anything with it, including turn it back and forth from a block.&lt;/dd&gt;
&lt;/dl&gt;&lt;h1&gt;Developing with Blocks&lt;/h1&gt;
&lt;p&gt;Using blocks with somebody else&amp;#8217;s API is intuitive:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;(1..5).map{|n| n * 3} #=&amp;gt; [3, 6, 9, 12, 15]&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Making an API that uses blocks can be easy too:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;  module Object
    def with
      yield self
    end
  end

# calling
"hello".with{|h| puts h}
# prints "hello"
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;If you &lt;code&gt;yield&lt;/code&gt; more than once, you run the block multiple times.&lt;/p&gt;
&lt;h1&gt;Developing with Procs&lt;/h1&gt;
&lt;p&gt;How do you even make a &lt;code&gt;Proc&lt;/code&gt;?&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;doubler = proc{|n| n * 2} 
#=&amp;gt; #&amp;lt;Proc:0x007f8e938d8618@(irb):1&amp;gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;There&amp;#8217;s a few methods, like &lt;code&gt;proc&lt;/code&gt;, that turn a block into a &lt;code&gt;Proc&lt;/code&gt;. &lt;code&gt;lambda&lt;/code&gt; is very similar. They&amp;#8217;re easy to write:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;def my_proc(&amp;amp;block)
  block
end

tripler = my_proc{|n| n * 3} 
#=&amp;gt; #&amp;lt;Proc:0x007f8e9506d170@(irb):5&amp;gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;The ampersand in the argument list to &lt;code&gt;my_proc&lt;/code&gt; is what transforms the block into a &lt;code&gt;Proc&lt;/code&gt;, and then we simply return it.&lt;/p&gt;

&lt;p&gt;You can use the ampersand to turn a &lt;code&gt;Proc&lt;/code&gt; into a block too:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;(1..5).map doubler
# ArgumentError: wrong number of arguments(1 for 0)

(1..5).map &amp;amp;doubler
#=&amp;gt; [2, 4, 6, 8, 10]&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;And you can call a &lt;code&gt;Proc&lt;/code&gt; directly without having to turn it into a block too:&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;doubler.call 4
#=&amp;gt; 8

doubler[5]
#=&amp;gt; 10

doubler.(6) # the dot before the parentheses is significant
#=&amp;gt; 12
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Blocks and &lt;code&gt;Proc&lt;/code&gt;s can be confusing. I hope this helps!&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/44105519238</link><guid>http://blog.brycekerley.net/post/44105519238</guid><pubDate>Tue, 26 Feb 2013 20:38:35 -0500</pubDate><category>ruby</category></item><item><title>Learn You Some Erlang</title><description>&lt;p&gt;&lt;a href="http://learnyousomeerlang.com/?utm_source=bryceblog"&gt;&amp;#8220;Learn You Some Erlang&amp;#8221;&lt;/a&gt; is a book about the Erlang programming language by Fred Hébert. It&amp;#8217;s useful, informative, and hilarious.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been touching Erlang on and off for the last few years, but more recently (now that I work with many Erlang users and community members at Basho). I took a class in some of the OTP behaviors last spring, but never really picked it up. Reading this book not only provides more narrative, but provides a nice structure for using the OTP concepts even without knowing them previously.&lt;/p&gt;
&lt;p&gt;While API documentation for Erlang is easy to find (c.f. &lt;a href="http://erlang.org/doc/"&gt;erlang.org&lt;/a&gt; and &lt;a href="http://erldocs.com/"&gt;erldocs.com&lt;/a&gt;), Learn You Some Erlang provides a nice structure for actually using the concepts in example applications, which leads nicely into production applications.&lt;/p&gt;
&lt;p&gt;The book has great and funny illustrations; technical yet with a nod to the whimsical, without being &lt;a href="http://mislav.uniqpath.com/poignant-guide/"&gt;inscrutable and self-indulgent&lt;/a&gt;. It&amp;#8217;s not Dr. Strangelove funny, but the humor makes it memorable.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re interested in Erlang, this is the Erlang book to read. You can &lt;a href="http://learnyousomeerlang.com/?utm_source=bryceblog"&gt;read &amp;#8220;Learn You Some Erlang&amp;#8221; online for free&lt;/a&gt; or buy it from &lt;a href="http://www.amazon.com/gp/product/1593274351/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1593274351&amp;amp;linkCode=as2&amp;amp;tag=yershyemvu-20"&gt;Amazon&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;&lt;em&gt;The publisher, No Starch Press, provided a review copy for me, but I mostly read the online version.&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/43951444930</link><guid>http://blog.brycekerley.net/post/43951444930</guid><pubDate>Sun, 24 Feb 2013 21:48:58 -0500</pubDate></item><item><title>A Weekend without iPad</title><description>&lt;p&gt;Getting out of my car at the Ft. Lauderdale airport Friday morning, I realized I left my iPad on my bedside table. Rush hour was picking up, and I didn&amp;#8217;t really have the time to go back and get it.&lt;/p&gt;
&lt;p&gt;During my flights and airport waits on Friday, I worked on my work computer: my coworker wanted help for a workshop on Saturday&amp;#8217;s &lt;a href="http://www.erlangdc.com/"&gt;Erlang DC&lt;/a&gt; conference, and I hadn&amp;#8217;t yet learned the material myself. For shorter waits (waiting at the gate, post-boarding wait, checking in while taxiing) my phone was just fine, and I made sure to keep that charged both while plugged in at the lounge and, on arrival in Virginia, in the car I rented (2013 Ford Taurus: a big four-door with a hateful turn signal stalk).&lt;/p&gt;
&lt;p&gt;Saturday, I spent the day at Erlang DC, and used the laptop all day. I charged the phone enough during this to have it be usable into the evening at the work-sponsored happy hour.&lt;/p&gt;
&lt;p&gt;Staying with my brother and his wife, I didn&amp;#8217;t really compute much at their house. Sunday morning, before anyone else was up, I programmed a bit, but didn&amp;#8217;t have the omnipresent iPad to distract me later. &lt;/p&gt;
&lt;p&gt;On the trip home Sunday afternoon, I followed much the same pattern as Friday: work computer for waits of more than a few minutes, phone for less than that. By the time I got back to my car, the phone was still around 25%, when on an iPad trip it&amp;#8217;d have been closer to 75%.&lt;/p&gt;
&lt;p&gt;Would I do it again? Maybe. The biggest things that the iPad gets me is less battery use on my phone &amp;amp; computer, it works better than a 15&amp;#8221; laptop in a cramped coach seat, and the internet access on it simply works (I have the LTE version). In terms of how much I carry, it&amp;#8217;s not that  much of a burden, much lighter than my computer or empty briefcase. Going without the iPad wasn&amp;#8217;t too bad, but I&amp;#8217;m more likely to go without a computer and only bring the iPad.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/42971960963</link><guid>http://blog.brycekerley.net/post/42971960963</guid><pubDate>Tue, 12 Feb 2013 21:48:49 -0500</pubDate></item><item><title>A Few Notes about CSS in 2013</title><description>&lt;p&gt;&lt;ul&gt;&lt;li&gt;Web fonts are nice to have, most of your viewers should be able to see things mostly the same way you designed them.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s cool to not care about Internet Explorer. It&amp;#8217;s even cooler knowing that it&amp;#8217;ll get things mostly right.&lt;/li&gt;
&lt;li&gt;Media queries: if you&amp;#8217;re designing for smartphones and tablets, you can take a few steps to make the page a bit more usable. If you&amp;#8217;re designing for overhead projectors universities bought a decade ago, you can take huge steps to re-layout a normal 960px page.&lt;/li&gt;
&lt;li&gt;Making your site work on a narrow projector is easy when you can swap out your standard font for a condensed font.&lt;/li&gt;
&lt;li&gt;SASS is still the best.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/42401504684</link><guid>http://blog.brycekerley.net/post/42401504684</guid><pubDate>Tue, 05 Feb 2013 21:50:49 -0500</pubDate></item><item><title>Ubuntu 12.04 LTS on 2011 Mac Mini</title><description>&lt;p&gt;This post should be short and sweet, because it was easy. This is a Macmini5,3, and with Ubuntu Server 12.04.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Boot the Mac Mini and do the initial setup stuff.&lt;/li&gt;
&lt;li&gt;Using Disk Utility, resize the Mac partition to 40GB or so.&lt;/li&gt;
&lt;li&gt;Hook up an external CD drive (my Mini doesn&amp;#8217;t have an internal one).&lt;/li&gt;
&lt;li&gt;Download Ubuntu, and burn it to a CD.&lt;/li&gt;
&lt;li&gt;Hold down &amp;#8220;option&amp;#8221; while you reboot the Mac Mini with the CD in.&lt;/li&gt;
&lt;li&gt;Use the arrow keys to pick the &amp;#8220;EFI Boot&amp;#8221; option when it appears on the far right.&lt;/li&gt;
&lt;li&gt;Go through the normal Ubuntu install process. &lt;em&gt;Make sure you configure a wired network connection.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The system should boot into Linux after setup.&lt;/li&gt;
&lt;li&gt;Do Linux things.&lt;/li&gt;
&lt;/ol&gt;&lt;h1&gt;I lied&lt;/h1&gt;
&lt;p&gt;This post should be short and sweet, but I&amp;#8217;m bad at computers.&lt;/p&gt;
&lt;p&gt;Since I kind of quit doing PC hardware I mostly stopped having spare wired keyboards around; my desktop has a wired keyboard, my notebook computers are keyboards, and there&amp;#8217;s some Bluetooth keyboards that came with computers in the closet. The only spare wired board I have is an Apple Design Keyboard, which hooks to USB through a Griffin iMate.&lt;/p&gt;
&lt;a href="http://www.flickr.com/photos/bonzoesc/8428797912/" title="Apple Design Keyboard"&gt;&lt;img src="http://farm9.staticflickr.com/8211/8428797912_dc0cae0ce9_z.jpg" width="480" height="640" alt="Apple Design Keyboard"/&gt;&lt;/a&gt;
&lt;p&gt;The iMate is not a USB HID device. It&amp;#8217;s an Apple Desktop Bus adaptor that exposes ADB to the system. Mac OS X 10.8 Mountain Lion still has ADB keyboard drivers. Ubuntu does not (Linux might, but Ubuntu doesn&amp;#8217;t put them on the install CD because it&amp;#8217;s &lt;s&gt;2012&lt;/s&gt; 2013 and Apple haven&amp;#8217;t shipped ADB hardware for eight years). So I had to swap the USB keyboard off my desktop for the ADB keyboard.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side note: look at the funky blue color of the USB cable on the iMate.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During Ubuntu setup, I didn&amp;#8217;t have a spare network port at my desk, so I told it I&amp;#8217;d do the network later when I plugged it in downstairs. Setup went normally, and the computer booted to a console. Hooray! Time to move the computer downstairs.&lt;/p&gt;
&lt;img src="http://i.bf1c.us/1._bkerley_Dieter_~_(zsh).png" alt="re-created screenshot of me repeatedly running nmap" title="re-created screenshot of me repeatedly running nmap" width="682" height="910"/&gt;&lt;p&gt;Hmm, Airport Utility doesn&amp;#8217;t show me a list of what IP addresses its DHCP server has allocated, but I can hammer everything with nmap! I learned that my Nest thermostat has a network presence, but couldn&amp;#8217;t find my Linux box.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wait, I thought I saw the light on the front blinking, could it possibly be freaking out because it has no monitor?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I bring the thing upstairs, and decide it should also have a network connection. I disconnect the PS3 and TV from wires (the PS3 has wifi, and the TV sucks at network stuff anyways), and rummage through the closet for the World&amp;#8217;s Ugliest Switch.&lt;/p&gt;
&lt;a href="http://www.flickr.com/photos/bonzoesc/8428794362/" title="World's Ugliest Switch, 2006"&gt;&lt;img src="http://farm9.staticflickr.com/8092/8428794362_ec0e04cb50_o.jpg" width="288" height="352" alt="World's Ugliest Switch, 2006"/&gt;&lt;/a&gt;
&lt;p&gt;In 2006, this switch was recovered from (what amounts to) the trash after being ruined by a thunderstorm. My roommate and I replaced the busted power supply board with an old power cord for an internal hard drive, and jammed a wire into an ATX power supply wiring block to give it the 5V it wanted. Since then I&amp;#8217;ve lost the ATX supply we hacked, so I had to spend a few minutes finding an appropriate wire to strip, finding the appropriate tool to do so (fingernail clippers), and the appropriate way to keep it in the wire harness (packing tape, which didn&amp;#8217;t work very well, but it worked).&lt;/p&gt;

&lt;h1&gt;Network Configuration &lt;em&gt;and&lt;/em&gt; Leaps of Faith&lt;/h1&gt;
&lt;p&gt;After getting the Mini hooked to the monitor, keyboard, and network, I found that it didn&amp;#8217;t just assume I wanted to auto-discover network settings; it didn&amp;#8217;t want to join the network at all. I told it to discover settings, rebooted it, and it worked, and showed on mmap.&lt;/p&gt;
&lt;p&gt;Moved it back downstairs, and all was good!&lt;/p&gt;&lt;p&gt;I&amp;#8217;m using the machine as a virtual machine host with OpenStack. I want an easy way to try stuff with Chef and other tools to make computers disposable in a sense: I want fixing settings to be done by demolishing the computer and re-building it, not by manually connecting and editing a file. OpenStack likes to have manually assigned IPs.&lt;/p&gt;
&lt;p&gt;I open Airport Utility, tell it to only pass out IP addresses from 1-100 instead of 1-200, wait for it to restart, and reconfigure the VM host to be 101.&lt;/p&gt;
&lt;p&gt;This involves changing a file that controls the network interface, asking the computer to take the interface down and back up, and hoping you didn&amp;#8217;t mess it up or you&amp;#8217;ll have to physically go to the computer and fix it. Low stakes when it&amp;#8217;s downstairs, but still…&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;~&amp;gt; sudo ifdown eth0; sudo ifup eth0
[sudo] password for bkerley: 
 * Disconnecting iSCSI targets   ...done.
 * Stopping iSCSI initiator service   ...done.
 * Starting iSCSI initiator service iscsid   ...done.
 * Setting up iSCSI targets   ...done.
ssh stop/waiting
ssh start/running, process 27089
~&amp;gt;  
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Somehow, I got it right the first time. Exciting!&lt;/p&gt;
&lt;p&gt; By this time, it&amp;#8217;s late, and I just go to bed with the SSH connection hanging open.&lt;/p&gt;
&lt;p&gt;In the morning, it&amp;#8217;s not on the network. First order of business:&lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;&lt;p&gt;&lt;a href="https://twitter.com/search/%23offee"&gt;#offee&lt;/a&gt; time&lt;/p&gt;    &lt;div&gt;&lt;a href="https://twitter.com/coffee_dad/status/286282991280484352"&gt;January 2, 2013&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;With my hot cup of aeropressed Panther Finca las Mercedes (good coffee), I reboot the machine on my way upstairs, wait a minute, and it&amp;#8217;s back. I read the logs, and it forgot to not auto-configure, and changed addresses on me in the middle of the night. That should be fixed since I rebooted it.&lt;/p&gt;
&lt;p&gt;I went to switch keyboards on my desktop, but I pulled the wrong cord. The groovy translucent blue the iMate uses is also the same color as the Firewire 800 cord for my external SSD I run my iMac from, so I had to reboot that after facepalming.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p&gt;here’s a little computing pro tip for you guys: do NOT unplug the drive the OS is on when you’re trying to unplug the keyboard&lt;/p&gt;    &lt;div&gt;&lt;a href="https://twitter.com/BonzoESC/status/296304518075928576"&gt;January 29, 2013&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I also forgot to configure name resolution (turns &amp;#8220;facebook.com&amp;#8221; into &amp;#8220;173.252.110.27&amp;#8221;), so that involved a second leap of faith.&lt;/p&gt;
&lt;p&gt;With that nailed down, I seem to have run out of broken things to mess with, which is pretty much the story of computing right there.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/41831706464</link><guid>http://blog.brycekerley.net/post/41831706464</guid><pubDate>Tue, 29 Jan 2013 21:05:00 -0500</pubDate></item><item><title>– View on Path.</title><description>&lt;img src="http://25.media.tumblr.com/6f90b98efe950ea4cd62b45b72badb5b/tumblr_mheivb9rt11qbkrjxo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;– View on &lt;a href="https://path.com/p/2qGKFD"&gt;Path&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/41799317278</link><guid>http://blog.brycekerley.net/post/41799317278</guid><pubDate>Tue, 29 Jan 2013 14:16:21 -0500</pubDate></item><item><title>– View on Path.</title><description>&lt;img src="http://25.media.tumblr.com/a9d0246d518e173d4fe4d300063dc3ed/tumblr_mh3h0xonaz1qbkrjxo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;– View on &lt;a href="https://path.com/p/3yAZ7W"&gt;Path&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/41295874905</link><guid>http://blog.brycekerley.net/post/41295874905</guid><pubDate>Wed, 23 Jan 2013 15:02:56 -0500</pubDate></item><item><title>Friendly Disclosure</title><description>&lt;a href="http://news.nationalpost.com/2013/01/20/youth-expelled-from-montreal-college-after-finding-sloppy-coding-that-compromised-security-of-250000-students-personal-data/"&gt;Pupil expelled from Montreal college after finding ‘sloppy coding’ that compromised security of 250,000 students personal data
&lt;/a&gt;
&lt;blockquote&gt;&lt;p&gt;Ahmed Al-Khabaz, a 20-year-old computer science student at Dawson and a member of the school’s software development club, was working on a mobile app to allow students easier access to their college account when he and a colleague discovered what he describes as “sloppy coding” in the widely used Omnivox software which would allow “anyone with a basic knowledge of computers to gain access to the personal information of any student in the system, including social insurance number, home address and phone number, class schedule, basically all the information the college has on a student.”&lt;/p&gt;

&lt;p&gt;“I saw a flaw which left the personal information of thousands of students, including myself, vulnerable,” said Mr. Al-Khabaz. “I felt I had a moral duty to bring it to the attention of the college and help to fix it, which I did. I could have easily hidden my identity behind a proxy. I chose not to because I didn’t think I was doing anything wrong.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moral duty and big institutions don&amp;#8217;t necessarily agree, especially in a field as &amp;#8220;scary&amp;#8221; as computing. Sometimes disclosing a vulnerability, while the right thing to do, sucks. What can you do?&lt;/p&gt;

&lt;h2&gt;Disclose vulnerabilities in a friendly way when possible.&lt;/h2&gt;

&lt;p&gt;I found a few bugs in a few sites towards the end of last year&lt;sup&gt;1&lt;/sup&gt;. In both cases, I felt safe disclosing them to the site management: they&amp;#8217;re both companies with good customer service, and a reputation for being approachable and doing the right thing. In one of the cases, I worked closely with a developer of the site to escalate the bug I found into a more serious one, while they worked on a fix.&lt;/p&gt;

&lt;h2&gt;What if the software owners are assholes?&lt;/h2&gt;

&lt;p&gt;Maybe disclose anonymously: &lt;a href="http://www.slideshare.net/grugq/opsec-for-hackers"&gt;Go to Starbucks, sign in to Tor, get a new Gmail account, and only ever use that Gmail account over Tor&lt;/a&gt;. If it&amp;#8217;s received in a hostile manner, copy a full disclosure list, sell it, forget about it, it&amp;#8217;s up to you.&lt;/p&gt;

&lt;p&gt;If they can&amp;#8217;t play nice, you can still do what you know to be the right thing.&lt;/p&gt;

&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;p&gt;1: You may even use the sites!&lt;/p&gt;</description><link>http://blog.brycekerley.net/post/41236916007</link><guid>http://blog.brycekerley.net/post/41236916007</guid><pubDate>Tue, 22 Jan 2013 19:51:00 -0500</pubDate></item></channel></rss>
