<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>geek!daily</title>
 <link href="http://blog.geekdaily.org/" rel="self"/>
 <link href="http://blog.geekdaily.org"/>
 <updated>2017-01-01T07:16:25-08:00</updated>
 <id>http://blog.geekdaily.org</id>
 <author>
   <name>Jim Meyer</name>
   <email>jim@geekdaily.org</email>
 </author>

 
 <entry>
   <title>SPEC: Rails App Autostaging</title>
   <link href="http://blog.geekdaily.org/2017/01/app-autostaging.html"/>
   <updated>2017-01-01T00:00:00-08:00</updated>
   <id>http://blog.geekdaily.org/2017/01/app-autostaging</id>
   <content type="html">
&lt;h1 id=&quot;spec-rails-app-autostaging&quot;&gt;SPEC: Rails App Autostaging&lt;/h1&gt;

&lt;h2 id=&quot;goal&quot;&gt;Goal&lt;/h2&gt;

&lt;p&gt;Be able to push-button deploy an app to a cloud-based staging environment that may or may not already exist in a predictable fashion.&lt;/p&gt;

&lt;h2 id=&quot;how-ill-do-it&quot;&gt;How I’ll do it&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Set up a cloud-based staging environment and take notes on what I have to change beyond the basic provisioned OS (OpenSUSE Leap 42.1)&lt;/li&gt;
  &lt;li&gt;Make cap tasks to deploy the app to the existing staging environment&lt;/li&gt;
  &lt;li&gt;Make cap tasks to verify the status of the staging environment (not running, running but needs cold deploy, warm deploy)&lt;/li&gt;
  &lt;li&gt;Automate staging setup in a cloud-init script&lt;/li&gt;
  &lt;li&gt;Make cap tasks to create a new staging environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ill-know-its-done-when&quot;&gt;I’ll know it’s done when&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;I can type &lt;code&gt;cap staging deploy&lt;/code&gt; with no staging environment and see the staging environment be created and the app be deployed&lt;/li&gt;
  &lt;li&gt;I can type &lt;code&gt;cap staging deploy&lt;/code&gt; again and see a warm deploy to the existing environment&lt;/li&gt;
  &lt;li&gt;I can destroy the staging environment, then type &lt;code&gt;cap staging create_environment&lt;/code&gt; and see the new environment be created&lt;/li&gt;
  &lt;li&gt;I can type &lt;code&gt;cap staging deploy&lt;/code&gt; and deploy to the fresh environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ill-need-to-verify&quot;&gt;I’ll need to verify&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Dev environment is up to date&lt;/li&gt;
  &lt;li&gt;App is healthy
    &lt;ul&gt;
      &lt;li&gt;All specs run clean&lt;/li&gt;
      &lt;li&gt;All automated tests run successfully&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Cloud account is healthy and can allocate resources via API/CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ill-need-to-learn-or-relearn&quot;&gt;I’ll need to learn or relearn&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://capistranorb.com/&quot;&gt;Capistrano 3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://cloudinit.readthedocs.io/en/latest/index.html&quot;&gt;cloud-init&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.opensuse.org/&quot;&gt;OpenSUSE Leap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>EXPERIMENT: Spec&#39;g My Projects</title>
   <link href="http://blog.geekdaily.org/2016/12/experiment-specg-my-projects.html"/>
   <updated>2016-12-31T00:00:00-08:00</updated>
   <id>http://blog.geekdaily.org/2016/12/experiment-specg-my-projects</id>
   <content type="html">
&lt;p&gt;If you’re at all like me, you’ve got upward of a few gazillion ideas for projects bouncing around in your notebooks, task management tools, and/or head, and you never get enough time to bring them all to a successful conclusion. I hope you’re &lt;em&gt;not&lt;/em&gt; like me in the sense of having many of them half-started and silently nagging you to finish every time you wander into your garage, office, or ~/work directory.&lt;/p&gt;

&lt;p&gt;For me, I’ve noticed that a lot of this ultimately goes down to losing track of what I came do. It usually goes something like:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;“I’ve got a day free. It’s time to add that feature to the Foo project.”&lt;/li&gt;
  &lt;li&gt;Run the specs and get 971 failures, clustered around 12 core error messages for 3 different gems.&lt;/li&gt;
  &lt;li&gt;“Oh, right, I upgraded [something] … well, let’s get everything working again. It’s the right thing to do.”&lt;/li&gt;
  &lt;li&gt;Three days of sweaty debugging, learning, and relearning pass. This includes learning how to tune my shell prompt, tweak Rakefiles (like the one for my blog to make a new post), and do a lot of other non-essential things.&lt;/li&gt;
  &lt;li&gt;“Well, the specs run clean again and I learned a lot. Guess I’ll add that feature next month.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Don’t get me wrong; I like the learning, and all the things I end up doing improve some aspect of my life, but I don’t like the unpredictability, the time that I sync into recovery (and not my family, or other projects like BBQ … mmm, BBQ …) and inevitable letdown of not getting the one thing done that I came to do.&lt;/p&gt;

&lt;p&gt;I’m going to try a different approach. I’m going to try writing a very short, very lightweight spec for projects that I intend to do, now or sometime in the future. The format will be something like:&lt;/p&gt;

&lt;pre&gt;
	PROJECT NAME

	Goal: A single sentence describing the intent.


	How I&#39;ll do it:

	- A short list of high-level steps
	- Each something I can measure the end of
	- And each of which can provide me focus to finish it


	I&#39;ll know it&#39;s done when:

	- A short list of acceptance criteria
	- Each being something I can demonstate, preferably automatically
	- And bonus points if I can automate the acceptance tests quickly


	I&#39;ll need to verify:

	- Things I believe to be true
	- That I need to have working before I can get started
	- So I don&#39;t waste time hoping that it all works out


	I&#39;ll need to learn or relearn:

	- Tech I don&#39;t already know
	- Tech I&#39;ve used before but has changed a fair bit since last I dived in
	- Other skills I&#39;ll need.
&lt;/pre&gt;

&lt;p&gt;I’ll publish some here, under the SPECS nav above. We’ll see how it goes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MacOS Sierra, Homebrew, and rbenv</title>
   <link href="http://blog.geekdaily.org/2016/11/macos-sierra-homebrew-and-rbenv.html"/>
   <updated>2016-11-23T07:20:00-08:00</updated>
   <id>http://blog.geekdaily.org/2016/11/macos-sierra-homebrew-and-rbenv</id>
   <content type="html">
&lt;p&gt;I recently updated to MacOS Sierra, aka 10.12, and got to relearn my dev environment when I wanted to do a little work in Ruby and ran face first into&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; irb
Bond Error: Completion file &#39;/usr/local/var/rbenv/versions/2.2.5/lib/ruby/gems/2.2.0/gems/bond-0.5.1/lib/bond/completion.rb&#39; failed to load with:
dlopen(/usr/local/var/rbenv/versions/2.2.5/lib/ruby/2.2.0/x86_64-darwin15/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/var/rbenv/versions/2.2.5/lib/ruby/2.2.0/x86_64-darwin15/readline.bundle	
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How rude! It took me a couple of minutes to even remember that I’d updated to Sierra (it’s been a week; I’ve slept since then). Once that synapse fired, I knew it meant that all the versions of Ruby I’d installed with rbenv were built against the older readline, so it was time to rebuild and reinstall them all, as well as all of their gems with native extensions. Ugh.&lt;/p&gt;

&lt;p&gt;Luckily, that’s not so horribly hard once you sort things out, so here’s the short course on how to deal with this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; xcode-select --install
[... popup dialog launches and you do the install dance ...]
&amp;gt; brew update &amp;amp;&amp;amp; brew upgrade
[... many package defs update and upgrade ... ]
&amp;gt; rbenv versions
  2.1.5
  2.2.0
  2.2.1
  2.2.3
  2.2.5
* 2.3.1 (set by /usr/local/var/rbenv/version)
&amp;gt; rbenv install -f 2.3.1 &amp;amp;&amp;amp; RBENV_VERSION=2.3.1 gem pristine --all
[... much building of ruby and gem native extensions ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From there, it’s repeat for every version of Ruby that you care about. It’s also a good time to remove any you don’t need anymore.&lt;/p&gt;

&lt;p&gt;If this was useful, an upvote on &lt;a href=&quot;http://stackoverflow.com/questions/40051133/rails-5-console-needs-readline-6-on-macos-sierra/40775204#40775204&quot;&gt;my StackOverflow answer&lt;/a&gt; for this would be a kindness.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to get started with a Minecraft Server, Redux</title>
   <link href="http://blog.geekdaily.org/2015/09/how-to-get-started-with-a-minecraft-server-redux.html"/>
   <updated>2015-09-06T06:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/09/how-to-get-started-with-a-minecraft-server-redux</id>
   <content type="html">
&lt;p&gt;Back when, I started a&lt;a href=&quot;/2013/04/setting-up-a-minecraft-server-for-kids-part-1-preparation.html&quot;&gt; series on setting up a Minecraft server for kids&lt;/a&gt; which I never quite finished. As I &lt;a href=&quot;/2015/09/rip-craftbukkit-moving-on.html&quot;&gt;mentioned in a post yesterday&lt;/a&gt;, it’s time to do a major update on our server, so I’ve got a chance to update and complete that series. And here we are.&lt;/p&gt;

&lt;h2 id=&quot;choices-are-better-now&quot;&gt;Choices are better now&lt;/h2&gt;

&lt;h3 id=&quot;paid-minecraft-hosting&quot;&gt;Paid Minecraft Hosting&lt;/h3&gt;

&lt;p&gt;One &lt;a href=&quot;https://www.google.com/?q=minecraft%20server%20hosting&quot;&gt;Google search for Minecraft Hosting&lt;/a&gt; shows a lot more viable alternatives than existed two years ago. There were easily a few dozen hosting options available, each clearly targeting Minecraft server hosting. All of them seemed to be ~$12-25 for a 2GB RAM server, which is pretty close to the going rate for a 2GB VM in any of several public clouds.&lt;/p&gt;

&lt;h3 id=&quot;containers&quot;&gt;Containers!&lt;/h3&gt;

&lt;p&gt;Another excellent alternative is some solid &lt;a href=&quot;https://hub.docker.com/search/?q=minecraft&amp;amp;isAutomated=1&quot;&gt;Minecraft Docker images&lt;/a&gt; for running Minecraft. Very configurable, and gives you good control over what’s going on without needing to go deep into the dependencies of Java, etc.&lt;/p&gt;

&lt;h3 id=&quot;self-hosting-playbooks-and-recipes-and-shell-scripts-oh-my&quot;&gt;Self-Hosting: Playbooks and Recipes and Shell Scripts, Oh My!&lt;/h3&gt;

&lt;p&gt;As was true two years ago, there are a host of ways to set up your own server Chef, Puppet, Ansible, and shell scripts. However, several have emerged as more popular and have thus matured a bit since then.&lt;/p&gt;

&lt;h2 id=&quot;its-always-build-vs-buy&quot;&gt;It’s Always Build vs. Buy&lt;/h2&gt;

&lt;p&gt;In the end, I’m making a tradeoff in how much we want to be able to customize the server; how much time I need to spend setting it up; how much time I need to spend administering it; and net dollar costs to set up and run. A fast sketch of this looks like:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Customization?&lt;/th&gt;
      &lt;th&gt;Setup Time?&lt;/th&gt;
      &lt;th&gt;Admin Time?&lt;/th&gt;
      &lt;th&gt;Dollar Cost?&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Paid Hosting&lt;/td&gt;
      &lt;td&gt;Low-High&lt;/td&gt;
      &lt;td&gt;Low-Med&lt;/td&gt;
      &lt;td&gt;Low&lt;/td&gt;
      &lt;td&gt;~$6-20/month + ~$15 setup fees&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Containers&lt;/td&gt;
      &lt;td&gt;Med-High&lt;/td&gt;
      &lt;td&gt;Med-High&lt;/td&gt;
      &lt;td&gt;Med&lt;/td&gt;
      &lt;td&gt;$10-20/month for container hosting&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Self Hosting&lt;/td&gt;
      &lt;td&gt;High&lt;/td&gt;
      &lt;td&gt;High&lt;/td&gt;
      &lt;td&gt;Low-Med&lt;/td&gt;
      &lt;td&gt;$10-20/month for instance hosting&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The dollar costs of hosting are so close in all cases as to be a negligible motivator, so it really comes down to how much time I want to put in. Two years ago, I wanted to do this myself to learn how a server works and experiment with modding; now it’s much more about having a stable server with the right functionality (usually via plugins) and modding is something Sam and I do on laptops and an occasional cloud VM or container. &lt;strong&gt;So this time around, we’re going to look at paid Minecraft hosting first, then containers, then self-hosting.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-we-need&quot;&gt;What we need&lt;/h2&gt;

&lt;p&gt;I mentioned in &lt;a href=&quot;/2015/09/rip-craftbukkit-moving-on.html&quot;&gt;my previous post&lt;/a&gt; the bare minimums; we’ll add a few more at the end as we’re looking at migrating to paid hosting:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Multiple worlds:&lt;/strong&gt; the kids have invested a lot of time in the three worlds we have, so that’s got to continue. We’re currently using the Multiverse Bukkit Plugins.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Permissions management:&lt;/strong&gt; I don’t want to op kids for the whole server, but I don’t mind letting them rule a world. We’re currently using the &lt;a href=&quot;http://dev.bukkit.org/bukkit-plugins/permbukkit/&quot;&gt;PermissionsBukkit plugin&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different settings across worlds:&lt;/strong&gt; some of the worlds are creative, some are survival. Various rules apply in each of them. We need to keep that true. This is inherent in the Multiverse&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat across worlds:&lt;/strong&gt; the kids frequently chat with each other while in different worlds, often calling for each other to come see and try stuff. That’s where the fun is.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grief prevention and bad word management,&lt;/strong&gt; because kids. We use the &lt;a href=&quot;http://dev.bukkit.org/bukkit-plugins/grief-prevention/files/214-12-2/&quot;&gt;GriefPrevention&lt;/a&gt; and &lt;a href=&quot;http://dev.bukkit.org/bukkit-plugins/badwords/&quot;&gt;BadWords&lt;/a&gt; plugins at the recommendation of cheracc(http://www.sandlotminecraft.com/index.php?pages/about/#owner), who runs Sandlot Minecraft server for kids and families(http://www.sandlotminecraft.com/). He puts a lot into running Sandlot(http://www.sandlotminecraft.com/index.php?pages/about/) and it’s an excellent place if you just want a family-friendly server to let your kids play on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since we’re migrating, we’ll add:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Ability to import existing worlds:&lt;/strong&gt; We have existing worlds that the kids have put a lot of time into.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ability to back-up on a daily basis:&lt;/strong&gt; It helps for moments where one of the worlds that’s not under GriefPrevention has accidental damage. Also, we need to be able to pull a daily backup from outside the service in case the service gets hosed.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Good tools for server administration:&lt;/strong&gt; We like to divide up permissions so we can make kids into minor ops, and we often need user logs to see who was online when something happened to address behavior issues, etc., because kids.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; way down at the bottom because, as I said, it’s not the most important factor.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;hosting-options&quot;&gt;Hosting Options&lt;/h2&gt;

&lt;p&gt;I’m going to look at three main options here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://minecraft.net/realms&quot;&gt;Minecraft Realms&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mcprohosting.com/&quot;&gt;MCProHosting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ggservers.net/&quot;&gt;GG Servers&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;http://www.creeperhost.net/&quot;&gt;Creeperhost.net&lt;/a&gt;, &lt;a href=&quot;https://www.beastnode.com/&quot;&gt;BeastNode&lt;/a&gt;, and &lt;a href=&quot;https://www.bisecthosting.com/&quot;&gt;BisectHosting&lt;/a&gt; all seem like reasonable alternatives, but landed in my second choice list for various reasons. Creeperhost is UK-based, though with US locations, and didn’t seem as oriented to opinionated Minecraft/Spigot hosting; neither did BisectHosting. BeastNode looks promising, and I wanted to limit the field to evaluate.&lt;/p&gt;

&lt;p&gt;So with that in mind, I set out to set up worlds with each of the top three. I used the 2GB RAM server as a basis for comparison as that’s about what runs well for long periods with the crowd on our server.&lt;/p&gt;

&lt;p&gt;Here’s what I found.&lt;/p&gt;

&lt;h3 id=&quot;minecraft-realms&quot;&gt;Minecraft Realms&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Multiple Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, limited to three worlds, but only running one at a time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Permissions Management:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;, only op or normal player.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different World Settings:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat Across Worlds:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;, only one world running at a time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grief Prevention:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Foul Language Management:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Import Worlds:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Daily backups:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Automatically copy backups externally:&lt;/strong&gt; &lt;em&gt;no&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Good server admin tools:&lt;/strong&gt; &lt;em&gt;5/10&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; &lt;em&gt;$13/month&lt;/em&gt;, discounted if you either enable auto-renewal or buy 3 or 6 months in advance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Best if you want to run “vanilla” Minecraft and always have the latest improvements. It’s pretty easy to get started; you pay on Mojang() then set up your new Realm through your Minecraft app. Maybe I’ll write a post with a quick step-by-step, but in the meantime &lt;a href=&quot;http://www.wikihow.com/Get-Minecraft-Realms#Creating_Your_Own_Minecraft_Realms_Server_sub&quot;&gt;Wikihow has a pretty good one&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised to see you could have three worlds (plus a selections of “mini-games”); however, switching worlds seems to require a restart of the server for your Realm so you really only get access to your worlds one at a time. Interesting a bit, but that’s a deal breaker for the server we run.&lt;/p&gt;

&lt;p&gt;The server admin tools are okay, but not great. You can invite players, choose whether or not to op them, and see when they’ve been online (but not if they’re online now). You get automatic backups and can “download” them manually, which makes them one of your single-player worlds on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not the right long-term choice for us.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;mc-pro-hosting&quot;&gt;MC Pro Hosting&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Multiple Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with Multiverse plugin.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Permissions Management:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with PermissionsBukkit plugin&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different World Settings:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with Multiverse plugin.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat Across Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grief Prevention:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, many plugins available&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Foul Language Management:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, many plugins available&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Import Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, via FTP&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Daily backups:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, set up as a repeating task. 1 GB quota for backup storage; 10 GB quota for $2/month&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Automatically copy backups externally:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, backup via FTP as often as you like.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Good server admin tools:&lt;/strong&gt; &lt;em&gt;8/10&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; &lt;em&gt;$20/month, $15 plugin setup fee if you need help&lt;/em&gt;, discounted if you either enable auto-renewal or buy 3 or 6 months in advance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MC Pro’s signup experience is top-notch. They walk you through eight steps to get a sense of what you’re looking for; helping you size your server; locate it where you want it in the world (they’ve got a fair number of choices, too); choose the add-on services you want, including mod packs, premium support, etc.; and even getting the name, hostname, IP and/or port set just right.&lt;/p&gt;

&lt;p&gt;They use Multicraft control panel, which they’ve integrated very well into their system, right down to authentication and styling. Multicraft includes an FTP server, so you can easily download backups and copy up configuration, etc. They also have good docs to help you get started if you’re importing worlds or installing custom plugins.&lt;/p&gt;

&lt;p&gt;It took me a short while to merge config data from our server with the defaults at MC Pro, but fairly quickly I had a mostly working server, lacking only the core worlds. I filed a support ticket to help me solve that, then figured it out myself about 6 hours later and closed the ticket, which had gotten no response.&lt;/p&gt;

&lt;p&gt;The only complaints I have would be that they don’t take American Express (which is the card I use for online transactions) and don’t specifically say so; I had to figure it out when their CC entry field couldn’t handle the 4-digit CVV code. Also, the discount code from their Facebook page didn’t work, despite being roughly three weeks old. Minor bummer.&lt;/p&gt;

&lt;h3 id=&quot;ggserversnet&quot;&gt;ggservers.net&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Multiple Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with Multiverse plugin.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Permissions Management:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with PermissionsBukkit plugin&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different World Settings:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, with Multiverse plugin.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat Across Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grief Prevention:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, many plugins available&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Foul Language Management:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, many plugins available&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Import Worlds:&lt;/strong&gt; &lt;em&gt;yes&lt;/em&gt;, via FTP&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Daily backups:&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Automatically copy backups externally:&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Good server admin tools:&lt;/strong&gt; &lt;em&gt;7/10&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; &lt;em&gt;$12/month, $15 plugin setup fee if you need help&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Right off, I was inclined to like GG Servers as they handle Amex properly and the discount code from their Facebook page worked. The signup was fairly easy for someone who’s experienced and knows how to size their own server; it was much less of a concierge experience when compared to MC Pro Hosting.&lt;/p&gt;

&lt;p&gt;GG Servers also use the Multicraft control panel, but it’s not as well integrated into their client control panel so there are bumpy bits. This turns out to be the source of several issues as I was looking to get set up. They’d sent me an email with a separate password for the Multicraft CP; that, of course, ended up in the spam folder so I was blissfully unaware of it.&lt;/p&gt;

&lt;p&gt;For one, I wasn’t able to use FTP service right away, so I put in a support ticket. That was relatively straightforward and within a couple of hours I had a response. From there, it was a fairly typical support interaction, by which I mean the very busy support person is working through tickets as fast as they can and thus asks me to do something I’ve already done (and partly, poorly described doing in fairly specific terms). We iterated along those lines a couple of times before the support tech realized what I’d said and pointed out I needed the password from the email they’d sent.&lt;/p&gt;

&lt;p&gt;To be clear, their support was very responsive — most replies came within 10 minutes once they picked up the ticket, and on a holiday weekend, even. They were never rude. They ended up solving my problem. Yet it was frustrating to re-explain what I’d explained at the beginning, and twice, to get to the right answer.&lt;/p&gt;

&lt;h2 id=&quot;decision-mc-pro-by-a-smidge&quot;&gt;Decision: MC Pro by a smidge&lt;/h2&gt;

&lt;p&gt;I have no doubt our server would run fairly equally well on either MC Pro or GG Servers. In the end, I’d already resolved all of my issues and had a working, identical server running on MC Pro by the time we reached the end of the GG Servers support ticket, and that was the deciding factor. As I mentioned above, this is more about how I save my time than anything else.&lt;/p&gt;

&lt;p&gt;GG Servers is high on my list should I need to re-examine Minecraft hosting providers again, but for now we’re happily up and running on MC Pro.&lt;/p&gt;

&lt;p&gt;Happy crafting!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Compiling Spigot Minecraft Server for CentOS 7</title>
   <link href="http://blog.geekdaily.org/2015/09/compiling-spigot-minecraft-server-for-centos-7.html"/>
   <updated>2015-09-05T09:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/09/compiling-spigot-minecraft-server-for-centos-7</id>
   <content type="html">
&lt;p&gt;A quick cheat sheet for those who don’t want to read the &lt;a href=&quot;https://www.spigotmc.org/threads/bukkit-craftbukkit-spigot-1-8.36598/&quot;&gt;entire post with all the instructions&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Make a CentOS 7 server, then execute these three commands in it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo yum -y install git java-1.7.0-openjdk-devel
# TONS of output and dependent packages install

$ wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
--2015-09-05 18:42:24--  https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
Resolving hub.spigotmc.org (hub.spigotmc.org)... 198.41.205.94, 198.41.204.94, 2400:cb00:2048:1::c629:cd5e, ...
Connecting to hub.spigotmc.org (hub.spigotmc.org)|198.41.205.94|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3411286 (3.3M) [application/java-archive]
Saving to: ‘BuildTools.jar’

100%[======================================&amp;gt;] 3,411,286   2.65MB/s   in 1.2s

Last-modified header invalid -- time-stamp ignored.
2015-09-05 18:42:27 (2.65 MB/s) - ‘BuildTools.jar’ saved [3411286/3411286]

$ java -jar BuildTools.jar
# TONS of output
Success! Everything compiled successfully. Copying final .jar files now.
Copying craftbukkit-1.8.8-R0.1-SNAPSHOT.jar to /root/.
  - Saved as craftbukkit-1.8.8.jar
Copying spigot-1.8.8-R0.1-SNAPSHOT.jar to /root/.
  - Saved as spigot-1.8.8.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you’ve got the latest jars for spigot and craftbukkit. Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>RIP Craftbukkit, Moving On</title>
   <link href="http://blog.geekdaily.org/2015/09/rip-craftbukkit-moving-on.html"/>
   <updated>2015-09-05T08:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/09/rip-craftbukkit-moving-on</id>
   <content type="html">
&lt;h2 id=&quot;the-death-of-craftbukkit&quot;&gt;The Death of CraftBukkit&lt;/h2&gt;

&lt;p&gt;Craftbukkit &lt;a href=&quot;https://github.com/Bukkit/CraftBukkit&quot;&gt;kinda died&lt;/a&gt; a year ago in a &lt;a href=&quot;https://www.reddit.com/r/Minecraft/comments/2fkz55/as_one_of_the_original_contributors_to_bukkit&quot;&gt;big&lt;/a&gt; &lt;a href=&quot;http://bukkit.org/threads/mojang-and-the-bukkit-project.309715/&quot;&gt;dramatic&lt;/a&gt; &lt;a href=&quot;http://bukkit.org/threads/an-independent-goodbye.310086/&quot;&gt;flare-up&lt;/a&gt;. That sucked. We were running a server based on it, and continued running the last public version, 1.7.9-R0.2 while hoping things might resolve well. They didn’t.&lt;/p&gt;

&lt;p&gt;It’s time to call it: CraftBukkit, and the underlying &lt;a href=&quot;https://github.com/Bukkit/Bukkit/commits/master&quot;&gt;Bukkit server&lt;/a&gt;, are well and truly dead. It’s time to migrate the server. There are other pressures: I want to change hosting providers; make the server creation, backup, and monitoring more robust; and make it easier to admin.&lt;/p&gt;

&lt;h2 id=&quot;moving-on-&quot;&gt;Moving On …&lt;/h2&gt;

&lt;p&gt;In good news, it allows me to finish &lt;a href=&quot;/2013/04/setting-up-a-minecraft-server-for-kids-part-1-preparation.html&quot;&gt;the blog series I started back when&lt;/a&gt;, and update it for smarter things. I’m using some time this weekend to look into what’s best, so here’s what I’ve learned.&lt;/p&gt;

&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Multiple worlds:&lt;/strong&gt; the kids have invested a lot of time in the three worlds we have, so that’s got to continue.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Permissions management:&lt;/strong&gt; I don’t want to op kids for the whole server, but I don’t mind letting them rule a world.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different settings across worlds:&lt;/strong&gt; some of the worlds are creative, some are survival. Various rules apply in each of them. We need to keep that true.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat across worlds:&lt;/strong&gt; the kids frequently chat with each other while in different worlds, often calling for each other to come see and try stuff. That’s where the fun is.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grief prevention and bad word management,&lt;/strong&gt; because kids.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ideally, it would just support the CraftBukkit APIs so that CraftBukkit mods would continue to work. Least pain to migrate and all that.&lt;/p&gt;

&lt;h3 id=&quot;the-alternatives&quot;&gt;The Alternatives&lt;/h3&gt;

&lt;p&gt;So of course I first started by searching for posts from folks who’ve made this journey in the past … and found nothing significant. I think my search-fu must be inadequate. So, I spent a couple of hours just reading forums to see what was possible.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://minecraft.net/download&quot;&gt;Vanilla Minecraft&lt;/a&gt; with &lt;a href=&quot;http://files.minecraftforge.net/&quot;&gt;Forge&lt;/a&gt;&lt;/strong&gt;: promising, especially since &lt;a href=&quot;http://shop.oreilly.com/product/0636920036562.do&quot;&gt;Arun Gupta and son authored a book&lt;/a&gt; about modding with Forge. Not API compatible with Bukkit, but has &lt;a href=&quot;http://www.minecraftforge.net/wiki/Minecraft_Forge&quot;&gt;reasonable docs&lt;/a&gt; and there are some efforts to &lt;a href=&quot;http://www.akliz.net/manage/knowledgebase/18/How-to-Install-CraftBukkit-Plugins-on-a-Modded-Minecraft-Server-Tekkit-Hexxit-Feed-the-Beast-etc.html&quot;&gt;add Bukkit APIs via plugin&lt;/a&gt; though very old; also, there’s a &lt;a href=&quot;http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1287664-forge-forgeessentials-bukkit-functionality-for&quot;&gt;plugin to add Bukkit &lt;em&gt;functionality&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.spongepowered.org/&quot;&gt;Sponge&lt;/a&gt;&lt;/strong&gt;: Promising, and there’s a short &lt;a href=&quot;https://docs.spongepowered.org/en/server/getting-started/migrating.html&quot;&gt;migration guide&lt;/a&gt; but no CraftBukkit API compatibility, so we’d need to find new plugins to handle the job and &lt;a href=&quot;https://ore-staging.spongepowered.org/&quot;&gt;Ore, the plugin directory for Sponge&lt;/a&gt; seems not to be ready for production.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://spigotmc.org/&quot;&gt;Spigot&lt;/a&gt;&lt;/strong&gt;: Spigot, an early fork of CraftBukkit, aims to be a more efficient version of Bukkit for modding Minecraft. That means API compatibility is a given, and explains why it’s the leading server according to &lt;a href=&quot;http://mcstats.org/&quot;&gt;MCstats.org&lt;/a&gt;*. Very promising, and &lt;a href=&quot;&quot;&gt;very active&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.spigotmc.org/threads/bukkit-craftbukkit-spigot-1-8.36598/&quot;&gt;Craftbukkit&lt;/a&gt;?!&lt;/strong&gt;: Yup, you read right. Since Spigot is an early fork, they still contain the forked CraftBukkit code and avoided the DMCA takedown issues. Building Spigot also builds CraftBukkit, so I &lt;em&gt;could&lt;/em&gt; just use that and move on, in theory. CraftBukkit is dead, long live CraftBukkit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;*MCStats requires a plugin to send data, so Spigot is the leading server among folks who run the MCstats plugin when the MCstats servers are up to collect data, yada yada.&lt;/p&gt;

&lt;p&gt;There are many others, but these are the serious contenders for us to migrate our server to. I’ll be exploring them and try to do a decent post on how we went from where we are to there.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving Your TypePad Blog To Jekyll: The Re-Translation</title>
   <link href="http://blog.geekdaily.org/2015/04/moving-your-typepad-blog-to-jekyll-the-retranslation.html"/>
   <updated>2015-04-26T00:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/04/moving-your-typepad-blog-to-jekyll-the-retranslation</id>
   <content type="html">
&lt;p&gt;In my &lt;a href=&quot;/2015/04/moving-your-blog-to-jekyll-the-translation.html&quot;&gt;first post about moving from TypePad to Jekyll&lt;/a&gt;, I discussed a few ways you can translate your TypePad.com blog into Jekyll, noting that the &lt;a href=&quot;http://import.jekyllrb.com&quot;&gt;Jekyll Importer&lt;/a&gt; would be the best way to go but for its lack of an MTIF importer. As I got further into the post-install cleanup, there were enough little things like lost permalinks and the like that I decided to go the whole way and add MTIF as a Jekyll importer.&lt;/p&gt;

&lt;p&gt;Right now it’s just &lt;a href=&quot;https://github.com/purp/jekyll-import&quot;&gt;my fork&lt;/a&gt; of the &lt;a href=&quot;https://github.com/jekyll/jekyll-import&quot;&gt;jekyll-import project&lt;/a&gt; with a wholly untested MTIF converter implemented on &lt;a href=&quot;https://github.com/purp/jekyll-import/tree/typepad_export&quot;&gt;the typepad_converter branch&lt;/a&gt;. As a bonus, it’ll convert your old posts to Markdown using &lt;a href=&quot;https://github.com/xijo&quot;&gt;Johannes Opper’s&lt;/a&gt; &lt;a href=&quot;https://github.com/xijo/reverse_markdown&quot;&gt;reverse_markdown gem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re desperate to use it before I get it tested and merged into jekyll-import, you could do something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd ~/work
$ git clone git@github.com:purp/jekyll-import.git
$ cd jekyll-import
$ git checkout typepad_export
$ RUBYLIB=~/work/jekyll-import/lib jekyll import mtif --source path/to/your/mtif
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yes, I have shame for not TDD’g this. I’ll confess that I don’t TDD when I’m exploring something new as I’m usually learning so much that my test hypotheses are crap at the beginning.&lt;/p&gt;

&lt;p&gt;Cue discussion of ends and means and justifications.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Announcing the MTIF gem</title>
   <link href="http://blog.geekdaily.org/2015/04/announcing-the-mtif-gem.html"/>
   <updated>2015-04-25T00:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/04/announcing-the-mtif-gem</id>
   <content type="html">
&lt;p&gt;As I got deeper into the &lt;a href=&quot;/2015/04/moving-your-blog-to-jekyll-the-translation.html&quot;&gt;blog move&lt;/a&gt;, I knew I’d need a better translation; to do that, I needed a better way to read and write MTIF files. Since there wasn’t good, reusable code out there, I wrote the &lt;a href=&quot;http://rubygems.org/gems/mtif&quot;&gt;MTIF gem&lt;/a&gt; (&lt;a href=&quot;https://github.com/purp/mtif&quot;&gt;source&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It’s rough and certainly incomplete but fully tested. All contributions welcome.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving Your Blog To Jekyll: The Translation</title>
   <link href="http://blog.geekdaily.org/2015/04/moving-your-blog-to-jekyll-the-translation.html"/>
   <updated>2015-04-19T00:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/04/moving-your-blog-to-jekyll-the-translation</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; I’ve written an &lt;a href=&quot;/2015/04/announcing-the-mtif-gem.html&quot;&gt;MTIF gem&lt;/a&gt; and have a working &lt;a href=&quot;/2015/04/moving-your-typepad-blog-to-jekyll-the-retranslation.html&quot;&gt;jekyll-import with MTIF&lt;/a&gt; though it’s not yet merged into the main project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; If you’re planning to move or export a blog to Jekyll, first look at &lt;a href=&quot;http://import.jekyllrb.com/&quot;&gt;Jekyll Importer&lt;/a&gt;. Hopefully, you’ll save a fair bit of time. If you’re moving from Typepad, it’s a bit complicated.&lt;/p&gt;

&lt;p&gt;Moving from Typepad is relatively straightforward, but not yet a smooth path. Step 1 is universal: export your blog to &lt;a href=&quot;https://movabletype.org/documentation/appendices/import-export-format.html&quot;&gt;MTIF format&lt;/a&gt;. From there, you’ll find a number of ways to do the translation.&lt;/p&gt;

&lt;p&gt;I first found https://github.com/dams/typepad_to_jekyll, a perl script which does a good chunk of the work. I found a couple of burning issues with this one:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It used 1 or 0 for the Jekyll Front Matter published tag. Jekyll requires this to be true or false. Since 0 is truthy in Ruby, this means all your drafts would be instantly published. Turns out I had an embarrassingly high number of drafts.&lt;/li&gt;
  &lt;li&gt;It didn’t quote post titles. If your post titles contain quotes or colons, this could cause Jekyll to fail to generate these properly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I forked and fixed those, but there were other things I wanted to get working like carrying the permalink and the date into each post. In the end, I decided to move on. This is when I discovered &lt;a href=&quot;http://import.jekyllrb.com/&quot;&gt;jekyll-import&lt;/a&gt;, which handles a Movable Type instance by attaching to the database but doesn’t handle a Movable Type export file.&lt;/p&gt;

&lt;p&gt;Okay, so all I need is a parser for the export file and writing the importer for Jekyll will be a snap. Ideally, there’d be a gem I can import, but life is rarely ideal. Instead, I found two other projects who’ve written parsers in Ruby:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/koozie/typepad_to_jekyll&quot;&gt;Typepad to Jekyll&lt;/a&gt; (&lt;a href=&quot;http://www.koozie.org/blog/2014/07/typepad-to-jekyll-converter/&quot;&gt;blog post&lt;/a&gt;). Chris found the same perl script and wrote this instead. It does a fair job, but the code isn’t segmented in a way I could use directly in a jekyll-importer.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/heisenthought&quot;&gt;Marc Chung&lt;/a&gt;’s &lt;a href=&quot;https://github.com/mchung/ruby-mtexport&quot;&gt;ruby-mtexport&lt;/a&gt;. This has a well-segmented parser, but isn’t a gem. I’ve written Marc a note to see if he’ll gemify it; if not, I’ll write up an MTIF parser gem and make the importer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So hopefully this is a good jumping-off point if you were looking to move from Typepad to Jekyll. I’ll either update this post or add another when/if I get back to the jekyll-importer project.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Goodbye, Typepad; Hello, Github Pages</title>
   <link href="http://blog.geekdaily.org/2015/04/goodbye-typepad-hello-github-pages.html"/>
   <updated>2015-04-18T00:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2015/04/goodbye-typepad-hello-github-pages</id>
   <content type="html">&lt;p&gt;I’ve been using Typepad to blog for nearly ten years now. When I started, I was a geek with typographic and design skills but very little feel for how to employ them on the web; Typepad made it easy to focus on the content and plug in a reasonable design.&lt;/p&gt;

&lt;p&gt;Since then, I’ve learned more about front-end web engineering, gotten busier, and have generally meant to move onto something more controllable. That always seemed to mean setting up a full app, which seemed a bit of overkill for my blog … so I never got to it. Then along came the combination of Jekyll and Github Pages and now I’m making the jump. I’m using the &lt;a href=&quot;http://mmistakes.github.io/so-simple-theme/&quot;&gt;So Simple&lt;/a&gt; theme as a starting point, but who knows where it will go? I don’t.&lt;/p&gt;

&lt;p&gt;I’m sure things will be a bit bumpy around here for a bit. Hopefully I’ll blog a bit more about some of those bumps, and a bit more about leadership as well.&lt;/p&gt;

&lt;p&gt;No promises.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Setting Up A Minecraft Server For Kids, Part 1: Preparation</title>
   <link href="http://blog.geekdaily.org/2013/04/setting-up-a-minecraft-server-for-kids-part-1-preparation.html"/>
   <updated>2013-04-12T09:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2013/04/setting-up-a-minecraft-server-for-kids-part-1-preparation</id>
   <content type="html">&lt;p&gt;I’ve got a little more time on my hands than usual at the moment, so I decided to set up a &lt;a href=&quot;https://minecraft.net/&quot;&gt;Minecraft&lt;/a&gt; server for my son and his friends. I figured it would force me to play around with cloud APIs, some linux configuration that I haven’t done for a long while, and other various bits of geekery that would just make me happy.&lt;/p&gt;

&lt;p&gt;As I started to do some research on how to go about it, I found &lt;a href=&quot;https://www.google.com/search?q=how+to+setup+a+minecraft+server&quot;&gt;about a gajillion posts on how to set up a server&lt;/a&gt; (including &lt;a href=&quot;http://warpedvisions.org/2012/02/howto-set-up-a-minecraft-server-in-10-minutes-using-amazon-ec2/&quot;&gt;this slightly outdated gem&lt;/a&gt;), including a few from &lt;a href=&quot;http://www.ultrasaurus.com/sarahblog/2011/11/setting-up-ec2-minecraft-server/&quot;&gt;smart friends&lt;/a&gt; &lt;a href=&quot;https://mobile.twitter.com/tom_enebo/status/300763304777891840&quot;&gt;of mine&lt;/a&gt;. After a bit of reading, it became clear that this could be a much larger undertaking so I decided to chunk out the project into four steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Preparation:&lt;/strong&gt; research and learning&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Installation:&lt;/strong&gt; set up the instance and server&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configuration:&lt;/strong&gt; tweak the server config and add plugins to get what you’re looking for&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Productionization:&lt;/strong&gt; make the installation reproducible and automatable; set up backups; etc. And yeah, that’s not a real word. I’m okay with that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This post will focus on the preparation&lt;/strong&gt; required to get as many bits sorted out as you can before installing. I’ll write about the rest in the next few posts.&lt;/p&gt;

&lt;h2 id=&quot;so-minecraft-&quot;&gt;&lt;strong&gt;So, Minecraft …&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;If, like me, you came to this with little practical Minecraft experience, the first thing you should do is try playing a bit. There are a few free ways to do this — such as &lt;a href=&quot;https://minecraft.net/classic/&quot;&gt;Minecraft Classic&lt;/a&gt; in your browser or &lt;a href=&quot;https://itunes.apple.com/us/app/minecraft-pocket-edition-lite/id479651754?mt=8&quot;&gt;Minecraft Pocket Edition Lite&lt;/a&gt; on an iOS device — or you can just spend the ~$30 and jump in. I figured that to be an op I’d want my own account, so I went for the full experience.&lt;/p&gt;

&lt;p&gt;I died a lot. I crafted a bit. I created a bunch in single player. I joined a few multiplayer servers. I died some more. Through all of it, I got a sense of the game and what my son and his friends would be in for. This helped a lot as I started to figure out what it would take to start up and run a server, as it identified some key questions, like, “How can we have a creative world as well as a survival world?” and “What’s the difference between ‘easy’ and ‘peaceful’?”&lt;/p&gt;

&lt;p&gt;These led me to &lt;a href=&quot;http://www.minecraftwiki.net/&quot;&gt;the Minecraft Wiki.&lt;/a&gt; Frankly, had I read much of it before playing I would have died less and crafted more. However, it helped me get clear on a few things that matter when you’re considering running a server for others.&lt;/p&gt;

&lt;h3 id=&quot;game-modehttpwwwminecraftwikinetwikigameplay&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.minecraftwiki.net/wiki/Gameplay&quot;&gt;Game Mode&lt;/a&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;The default is survival mode, which means that, in order to survive and craft things, you have to walk around and collect block types required by recipes while avoiding being killed by monsters (“mobs” in the old MUD parlance). There’s also creative mode, where you gain the power of flight, you have access to every block type instantly, and you can make anything your heart desires. My son is currently constructing a flush toilet in the hotel he’s making. His heart desires strange things.&lt;/p&gt;

&lt;h3 id=&quot;difficultyhttpwwwminecraftwikinetwikidifficulty&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.minecraftwiki.net/wiki/Difficulty&quot;&gt;Difficulty&lt;/a&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;This ranges from Peaceful, where any aggressive mobs are removed or don’t spawn, through Easy and Normal, right into Hard. The wiki does an excellent job explaining.&lt;/p&gt;

&lt;h3 id=&quot;world-typeshttpwwwminecraftwikinetwikiworldtypes&quot;&gt;&lt;a href=&quot;http://www.minecraftwiki.net/wiki/World_types&quot;&gt;World Types&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;There are a few settings in there that weren’t obvious on the face of it, such as what Large Biomes is or why Superflat would be interesting. It turns out that Superflat is a great canvas for Creative worlds, and Large Biomes is pretty much just like the default biome-based terrain generator but each biome takes up more real estate.&lt;/p&gt;

&lt;p&gt;It was clear to me that we’d want a Superflat Creative world and an Easy Default Survival world.&lt;/p&gt;

&lt;h2 id=&quot;servers-servers-everywhere&quot;&gt;Servers, Servers Everywhere&lt;/h2&gt;

&lt;p&gt;There are &lt;a href=&quot;https://www.google.com/search?q=minecraft+server+implementations&quot;&gt;a lot of available servers out there&lt;/a&gt;. I could tell you that I did an exhaustive search and evaluation, but the truth is that I trusted my smart friend, Sarah, and chose &lt;a href=&quot;https://github.com/Bukkit/CraftBukkit&quot;&gt;Craftbukkit&lt;/a&gt; (CB) for many of the same reasons she did: we both know and trust &lt;a href=&quot;http://confreaks.net/videos/696-rubyconf2011-be-a-minecraft-modman-with-purugin&quot; title=&quot;Confreaks RubyConf 2011: Be A Minecraft ModMan with Purugin&quot;&gt;Tom Enebo’s opinion&lt;/a&gt;, it’s &lt;a href=&quot;https://github.com/enebo/Purugin&quot;&gt;easy to extend using JRuby&lt;/a&gt;, and it seems to be the leading server beyond vanilla Minecraft.&lt;/p&gt;

&lt;p&gt;Another bit of validation comes from cheracc, who runs &lt;a href=&quot;http://www.sandlotminecraft.com/&quot;&gt;Sandlot Minecraft server for kids and families&lt;/a&gt;, and who also uses CB with many plugins. More on that later, though you can read &lt;a href=&quot;http://www.reddit.com/r/admincraft/comments/17ri0h/help_advice_for_running_a_kidfriendly_server/&quot;&gt;his excellent Reddit post on setting up a Minecraft server for kids&lt;/a&gt; now.&lt;/p&gt;

&lt;p&gt;One other minor note: since CB is a third-party server, it takes them a bit of time to catch up when Mojang releases a new client version. This means you’ll want to wait on client updates until there’s a beta version of CB that handles the new client version. As of this writing, the current client requires a 1.5.x server which means craftbukkit-beta.jar&lt;/p&gt;

&lt;h2 id=&quot;does-size-matter&quot;&gt;Does Size Matter?&lt;/h2&gt;

&lt;p&gt;Finally, I wanted to figure out how big an instance I’d need to host a decent server. I flailed my way through several posts trying to figure this out until I discovered &lt;a href=&quot;http://canihostaminecraftserver.com/&quot;&gt;Can I Host A Minecraft Server&lt;/a&gt;, which makes it easy to take your bandwidth (both up and down) and the available RAM and figure out about how many people you can host. Remember to use the bandwidth figures for the cloud provider you’re planning to use. For me, it turns out I can handle ~12 players in a 1GB instance with the usual cloud host network speeds of &amp;gt;5Mbps, which is what I was hoping to cover.&lt;/p&gt;

&lt;p&gt;So that’s it for prep. Now it’s time to instantiate and install.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Bashing tcsh</title>
   <link href="http://blog.geekdaily.org/2012/03/bashing-tcsh.html"/>
   <updated>2012-03-26T22:45:04-07:00</updated>
   <id>http://blog.geekdaily.org/2012/03/bashing-tcsh</id>
   <content type="html">&lt;p&gt;After 15 years of non-stop tcsh action, I’ve finally made the jump to bash. It was painful and I miss all my lovely variable expansion (^X $), wildcard expansion (^X*) and term completion (ESC-/), but there are so many tools like &lt;a href=&quot;https://github.com/sstephenson/rbenv&quot;&gt;rbenv&lt;/a&gt; that expect that you’re using bash with no tcsh-friendly alternatives.&lt;/p&gt;

&lt;p&gt;On the upside, I’ve got functions now. I guess that’s something.&lt;/p&gt;

&lt;p&gt;Oh, and hi again.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Advanced YAML: Tricking Out Your database.yml</title>
   <link href="http://blog.geekdaily.org/2010/08/advanced-yaml-tricking-out-your-databaseyml.html"/>
   <updated>2010-08-13T16:03:33-07:00</updated>
   <id>http://blog.geekdaily.org/2010/08/advanced-yaml-tricking-out-your-databaseyml</id>
   <content type="html">&lt;p&gt;I’ve been &lt;a href=&quot;http://en.wikipedia.org/wiki/Cargo_cult_programming&quot;&gt;cultishly&lt;/a&gt; carrying this snippet around for years:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;login: &amp;amp;login
 adapter: mysql
 host: localhost
 username: myuser
 password: mypass
 encoding: utf8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For a couple of reasons around running DB migrations in differently configured environments, I wanted to factor this into bits common to all environments and bits particular to the config on the local machine. I came up with something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Provide default local block
local: &amp;amp;local
 socket: /var/run/mysqld/mysqld.sock
 
common: &amp;amp;common
 adapter: mysql
 encoding: utf8
 reconnect: false
 pool: 5
 username: myuser
 password: mypass
 &amp;lt;&amp;lt;: *local

development:
 database: myproj_test
 &amp;lt;&amp;lt;: *common
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This works swimmingly, but I was tired of ritually mimicking and extending the original snippet without actually understanding it. I decided to dig deeper into what was actually going on and found, unsurprisingly, that I stand on the shoulders of giants like &lt;a href=&quot;http://blog.lathi.net/&quot;&gt;Doug Alcorn&lt;/a&gt;, &lt;a href=&quot;http://blog.duncandavidson.com/&quot;&gt;James Duncan Davidson&lt;/a&gt;, and &lt;a href=&quot;http://blog.bleything.net/&quot;&gt;Ben Bleything&lt;/a&gt;. To render proper credit, &lt;a href=&quot;hhttp://blog.bleything.net/2006/6/27/dry-out-your-database-yml&quot;&gt;Ben’s post from June 2006&lt;/a&gt; builds on a missing post from James’s blog, both of which were preceded by &lt;a href=&quot;http://blog.lathi.net/articles/2006/03/02/config-database-yml-goodness-for-teams&quot;&gt;Doug’s observations in March 2006&lt;/a&gt;, and all of which draw on tricks originally found in the &lt;a href=&quot;http://github.com/fdv/typo/blob/master/config/database.yml.example&quot;&gt;Typo database config&lt;/a&gt;. None of them seems to have detailed what’s going on with the &amp;amp;login/*login construct, so I thought I’d dive into that a bit for posterity.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.yaml.org/&quot;&gt;YAML&lt;/a&gt; is nothing more than a human-readable way to serialize basic data structures like lists and associative arrays (aka hashes), which makes it ideal to represent the configuration values needed by Rails. It turns out that YAML provides anchors (&amp;amp;), references (*), and associative array merges («), all of which allow you to include by reference either by assignment or by merging a referenced array into another array. &lt;/p&gt;

&lt;p&gt;Here’s an example of each:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Generate a reference
mammal: &amp;amp;mammal_ref
 warm_blooded: true
 lays_eggs: false

# Define via reference assignment
beaver: *mammal_ref

# Define including a hash merge
otter:
 cute: true
 &amp;lt;&amp;lt;: *mammal_ref

# Define including a hash merge, overriding a value in the reference
platypus:
 &amp;lt;&amp;lt;: *mammal_ref
 lays_eggs: true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I found that the &lt;a href=&quot;http://en.wikipedia.org/wiki/YAML&quot;&gt;Wikipedia entry on YAML&lt;/a&gt; was a good, quick overview; the &lt;a href=&quot;http://www.yaml.org/spec/1.2/spec.html&quot;&gt;official YAML spec&lt;/a&gt; has all that and more, but it’s not a quick read. Meanwhile, both Doug and Ben observed that bringing ERB into the mix let’s you seriously customize things. I took a bit from both of them; here’s my database.yml now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Provide default local block
local: &amp;amp;local
 username: myuser
 password: mypass
&amp;lt;% if File.exist? &quot;/opt/local/var/run/mysql5/mysqld.sock&quot; %&amp;gt;
 socket: /opt/local/var/run/mysql5/mysqld.sock
&amp;lt;% elsif File.exist? &quot;/var/run/mysqld/mysqld.sock&quot; %&amp;gt;
 socket: /var/run/mysqld/mysqld.sock
&amp;lt;% elsif File.exist? &quot;/tmp/mysql.sock&quot; %&amp;gt;
 socket: /tmp/mysql.sock
&amp;lt;% end %&amp;gt;
 
# Allow for local DB configuration
&amp;lt;%= File.read(File.join(File.dirname( __FILE__ ), &#39;dblocal.yml&#39;)) if File.exist?(File.join(File.dirname( __FILE__ ), &#39;dblocal.yml&#39;)) %&amp;gt;

common: &amp;amp;common
 adapter: mysql
 encoding: utf8
 reconnect: false
 pool: 5
 &amp;lt;&amp;lt;: *local

development:
 database: myproj_development
 &amp;lt;&amp;lt;: *common

test:
 database: myproj_test
 &amp;lt;&amp;lt;: *common

production:
 database: myproj_production
 &amp;lt;&amp;lt;: *common
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Works a treat. Thanks, Doug, James, and Ben.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Comet &amp; Other Browser Stuff</title>
   <link href="http://blog.geekdaily.org/2009/10/live-blog-comet-other-browser-stuff.html"/>
   <updated>2009-10-15T13:27:25-07:00</updated>
   <id>http://blog.geekdaily.org/2009/10/live-blog-comet-other-browser-stuff</id>
   <content type="html">&lt;p&gt;It’s a big component of what we call “real-time”&lt;/p&gt;

&lt;p&gt;This is the kind of stuff that puts up a banner on a Twitter search (“# New Tweets Found”) and makes things feel real time.&lt;/p&gt;

&lt;p&gt;List of what’s being done to move notifications from server to browser:&lt;br /&gt;
* Ajax polling: Anybody using the JS set-timeout function, then refetch. Used by GMail, Campfire, et al&lt;br /&gt;
* Long polling (typically Comet): Used by FriendFeed, keeps an http connection open as long as possible (keep alive), reopen when timed-out. Keep a local thread pool.&lt;br /&gt;
* Flash sockets: Same as long polling, but from Flash. Don’t have the same-origin policy. No limitaions on number of connections. Does gzipping.&lt;br /&gt;
* Reverse HTTP: hosting a little webserver inside a JS connection. Long pushing?&lt;br /&gt;
* Silverlight (“MS’s version of Flash”)&lt;br /&gt;
* HTML5 websockets: part of spec, doesn’t exist and not implemented. Expected to be like flash sockets.&lt;/p&gt;

&lt;p&gt;(things discarded as too old/obscure/painful/absurd):&lt;br /&gt;
* Java applets (David Weekly is about to get himself kicked ;)&lt;br /&gt;
* Big ugly JS kludges (iframe tricks, etc)&lt;br /&gt;
* What’s that Opera thing … unite? ubiquity? Unite. Every browser is a webserver. Sounds like reverse HTTP.&lt;br /&gt;
* Using XMPP format, arbitrary JSON structure, Atom.&lt;/p&gt;

&lt;p&gt;Libraries:&lt;br /&gt;
* Orbited (?) tunnels TCP thru HTTP, treats each end like a socket. JS front-end, Python backend. Often paired with Twisted. Specifically meant to be Comet.&lt;br /&gt;
* stropheJS: javascript, can use flash sockets&lt;br /&gt;
* Tornado: python&lt;br /&gt;
* Cometd: Java, made by Dojo to work with dojo&lt;br /&gt;
* Dojo: javascript, can use flash sockets&lt;br /&gt;
* APE project (?)&lt;/p&gt;

&lt;p&gt;What formats are people using to send data:&lt;br /&gt;
* JSON&lt;br /&gt;
* XMPP&lt;/p&gt;

&lt;p&gt;Apps and their libs/methodologies:&lt;br /&gt;
* Meebo: ??&lt;br /&gt;
* Google Wave/GTalk: GWT RPC, long-polling, their own JS&lt;br /&gt;
* FB Chat: ??&lt;br /&gt;
* FriendFeed: Tornado server with long-polling, their own JS&lt;br /&gt;
* Superfeedr: uses BOSH, stropheJS. BOSH is kinda long polling, bidirectional (two cs open all time). Very similar to comet, more friendly than strict proxies&lt;br /&gt;
* Collecta: uses BOSH&lt;br /&gt;
* Twingly: orbited&lt;br /&gt;
* PBWorks: long polling on network dashboard to see updates come in live; wrote their own libraries, also use stropheJS&lt;br /&gt;
* StatusNet - identi.ca and ??, orbited and cometd (you can do either)&lt;/p&gt;

&lt;p&gt;Flex and Air apps? The most interesting stuff is what used to be called Flash Media Server (been renamed). They’ve got their own P2P protocol. All sorts of funky stuff you can do. OpenSource version of FMS is Red Five.&lt;/p&gt;

&lt;p&gt;In what situations are these libraries breaking down?&lt;br /&gt;
* Transparent/Opaque proxies that give repeats/dupes/hangs. Keep buffer on server and check for these. Sometimes have to close connection to flush thru proxies.&lt;br /&gt;
* “Everyone focuses on the newest hottest event-based framework, but the hardest part is that HTTP wasn’t designed for long-polling.”&lt;/p&gt;

&lt;p&gt;Have to hold open request/response pairs. Connection setup and teardown is expensive&lt;/p&gt;

&lt;p&gt;Guy at UK telecom has only ~3K IP connections available in London area. Comet is going to force an upgrade of their hardware, which will be expensive. Real world constraints will always present.&lt;/p&gt;

&lt;p&gt;Real-time at UI can be distracting at best, horribly annoying at worst. Charts work great, but text moving too quickly becomes hard. UX is challenging. Would be nice to add items while autoscrolling relative to the focussed item&lt;/p&gt;

&lt;p&gt;When you want to add a pause button to your site, that’s FAIL. But the hover-over-conversation to pause semantic is pretty good.&lt;/p&gt;

&lt;p&gt;Go to jschat.com to see a bad resize.&lt;/p&gt;

&lt;p&gt;FB pioneered notifications really well in UX. You get a “toaster popup” that doesn’t disturb your screen and it fades after a few moments plus a bar at the bottom to persist the aggregated notifications/count. Really nice.&lt;/p&gt;

&lt;p&gt;Growl is also mentioned as a good model. Is there interest in a notification aggregator with contexts in the browser? Meebo wants to go that way as a notification aggregator. Adobe wants to do this on your desktop. BrowserPlus also hits Growl. Prowl == Pushed Growl.&lt;/p&gt;

&lt;p&gt;If everyone started using XMPP, it would increase the message load (“three bazillion individual messages”). No one is bundling XMPP updates; no reason you couldn’t. ActivityStreams could also serve.&lt;/p&gt;

&lt;p&gt;Why are people using Atom/JSON for this? They’re so extensible, but when you extend them so far they’re just as verbose as XML. “But we just don’t like XML.”&lt;/p&gt;

&lt;p&gt;Would be nice if you could select things to pull out of the stream and hold onto.&lt;/p&gt;

&lt;p&gt;Seems to be consensus that chat belongs at the bottom of the browser, append at end. Everything with a permalink (blogs, tweets, etc) gets added to the top (?). Seems to be related to height issues.&lt;/p&gt;

&lt;p&gt;Infinite scroll vs. “More” button&lt;/p&gt;

&lt;p&gt;Titlebar flash (Gmail and GTalk)&lt;/p&gt;

&lt;p&gt;Some sites make a tiny flash widget to play a sound&lt;/p&gt;

&lt;p&gt;Haptic: twitter dmesg to cellphone buzz&lt;/p&gt;

&lt;p&gt;Notifications can become another form of info overload/noise&lt;/p&gt;

&lt;p&gt;(We flailed at making a 1D/2D chart to represent frequency and value … FAIL)&lt;/p&gt;

&lt;p&gt;Phonetop apps are like desktop apps. Leah feels strongly that they’re headed down-and-to-the-right and browser-ish apps are taking supremacy due to interoperability.&lt;/p&gt;

&lt;p&gt;Apple’s surprise: phonetop apps took off. (?) vs. John Gruber: “The most used app on my iPhone is Safari.”&lt;/p&gt;

&lt;p&gt;You can find the whiteboard pics in &lt;a href=&quot;http://flickr.com/photos/purp&quot;&gt;my Flickr stream&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Web Aggregation, What Works and What Doesn&#39;t</title>
   <link href="http://blog.geekdaily.org/2009/10/live-blog-web-aggregation-what-works-and-what-doesnt.html"/>
   <updated>2009-10-15T12:17:59-07:00</updated>
   <id>http://blog.geekdaily.org/2009/10/live-blog-web-aggregation-what-works-and-what-doesnt</id>
   <content type="html">&lt;p&gt;&lt;em&gt;[note: I originally scribbled this on paper thinking I could hand it off immediately, preventing the obligation of typing, posting, etc. Turns out I don’t get off that lightly, so here’s the spew in electrons.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Scraping isn’t a scalable model.&lt;/p&gt;

&lt;p&gt;There are biz issues around aggregating data: many businesses don’t want you to get their data, though many are becoming more open.&lt;/p&gt;

&lt;p&gt;Doing aggregation right:&lt;br /&gt;
* minimize latency&lt;br /&gt;
* maximize engagement&lt;/p&gt;

&lt;p&gt;When latency is high, it causes confusion and takes you out of real-time&lt;/p&gt;

&lt;p&gt;Doing conditional gets can be somewhat useful.&lt;/p&gt;

&lt;p&gt;Plaxo had to shard their crawlers, which lands you in the shared state/sync problem of any stateful system you want to scale horizontally.&lt;/p&gt;

&lt;p&gt;Gnip integration has been good:&lt;br /&gt;
* Offload the long-running processes&lt;br /&gt;
* Gnip offers alerting or “fat ping” (ping includes update data)&lt;/p&gt;

&lt;p&gt;Plaxo likes using the alert to escalate the priority of the crawler which fetches the rich data related to the update. This approach allows you to use a consistent model for content ingestion vs. get info from fat ping, then augment later.&lt;/p&gt;

&lt;p&gt;Smarr: “Brad Fitzpatrick said, ‘Make polling a special case of push.’” He attributed this to someone but I missed the attribution.&lt;/p&gt;

&lt;p&gt;(Don’t try to keep up with Joseph Smarr on paper. He’s thinks too many cogent thoughts too quickly to preserve legibility)&lt;/p&gt;

&lt;p&gt;Plaxo uses TripIt’s RSS feed as alerting, grabs item ID, then uses their APIs to fetch rich data.&lt;/p&gt;

&lt;p&gt;There’s a move to homogenize the info from sites, which may not be a good idea. It suppresses the distinctive look and feel/experience of the publishing site. Allowing for these differences means more labor spent on making one-off shims, which increases maintenance. Still, right choice in order to provide value to the user.&lt;/p&gt;

&lt;p&gt;Activity streams seek to provide more rich data in a somewhat normalized, extensible format.&lt;/p&gt;

&lt;p&gt;Many/most sites aren’t yet perfectly architected for real-time’s push, ping, etc.&lt;/p&gt;

&lt;p&gt;PubSubHubBub and Activity Streams are externally represented data shards&lt;/p&gt;

&lt;p&gt;Plaxo’s Pulse started with known architecture issues (in order to ship) and hit the wall sooner than expected. Threw hardware/software optimizations at the problem to move the wall far enough to give time for rearchitecture, sharding, and working out how to propagate changes throughout the system properly.&lt;/p&gt;

&lt;p&gt;None of the NoSQL alternatives are quite ready for prime-time. Smarr: “It should be something that’s just a primitive.”&lt;/p&gt;

&lt;p&gt;Conversation platforms are slightly different sorts of aggregation platforms. There are UI diffs (e.g. pause the stream when indicating interest). Handling the transition from slightly-latent/passive real-time to synchronous real-time/active not yet well-developed (think: when a comment inspires a conversation)&lt;/p&gt;

&lt;p&gt;90-99% of the value of the real-time web is realized in not-real-time [unreal-time? ;] This is a big deal for discovery. Twitter and FB make this harder by obscuring history.&lt;/p&gt;

&lt;p&gt;Ideal scalability/performance would be an index per user. This would be grossly inefficient due to the number of duplicate entries.&lt;/p&gt;

&lt;p&gt;No one has nailed reader-controlled aggregation (Show me Joe’s tweets and blogs but not his photos) quite yet.&lt;/p&gt;

&lt;p&gt;Smarr: “If we’re all kinda [sharing], we’re all making each other smarter”&lt;/p&gt;

&lt;p&gt;The firehose of info is a hard model to scale to. Ben Metcalfe proposes the garden hose – a firehose filtered at the source according to your interests, which helps aggregators by allowing them to request the superset of all filters from a given publisher.&lt;/p&gt;

&lt;p&gt;We really want to push contexts to the publishers and let them determine which content fits that context. Context shifts over time: Joe doesn’t normally read my tweets (and why would he?) but when we’re at a conference together, he’s much more interested (thus the popularity of hashtags). This is a geographic and purpose-driven context (the conference) as well as Joe’s context on me (Jim knows where the good bars are).&lt;/p&gt;

&lt;p&gt;Folks like Twitter are so overloaded with info that they might not recognize non-immediate contexts that are interesting to me.&lt;/p&gt;

&lt;p&gt;There’s also the risk of exposing users to the amount of correlatable public data they have. Many don’t want you to apply a transitive closure to identify them in all spaces even though doing so allows you to present a much more convenient UX around what they want you to aggregate.&lt;/p&gt;

&lt;p&gt;Someone likened the real-time aggregation problem to a bar conversation: you get snippets here and there and follow your own thread of interestingness.&lt;/p&gt;

&lt;p&gt;Three fundamental themes:&lt;br /&gt;
* How to specify contexts to data provider/publisher&lt;br /&gt;
* How to control access to private data (and carry ACLs with that data)&lt;br /&gt;
* How to do all this efficiently&lt;/p&gt;

&lt;p&gt;Plaxo implemented polling-back-off (poll infrequently updated sources less frequently). Turns out this is a bad idea, as it introduces latency which makes it feel broken.&lt;/p&gt;

&lt;p&gt;There’s also the issue of aggregating conversation about web objecs (like blog posts) and how not to divert the conversation from the publisher’s site. However, sometimes you want a private discussion of a public object (cf. LinkedIn company groups discussing an article)&lt;/p&gt;

&lt;p&gt;Q: What’s the state of open standards around this?&lt;br /&gt;
A: PubSubHubBub and Activity Streams are very exciting. OAuth as access delegation. There’s still a lot of ground to cover.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Stepping Into BDD with Cucumber and WebRAT: Structuring the Work</title>
   <link href="http://blog.geekdaily.org/2009/09/stepping-into-bdd-with-cucumber-and-webrat-structuring-the-work.html"/>
   <updated>2009-09-13T14:45:32-07:00</updated>
   <id>http://blog.geekdaily.org/2009/09/stepping-into-bdd-with-cucumber-and-webrat-structuring-the-work</id>
   <content type="html">&lt;p&gt;&lt;em&gt;This is the first of a series on my adventures in going BDD with Cucumber and WebRAT with a greenfield project. Watch for the next article coming soon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m working on a tiny project for the dads club at my son’s school and using the opportunity to plunge fully into BDD with Cucumber. I’ve been tinkering with it a bit here and there, but this time I’m committing to fully specifying my acceptance criteria before I start writing specs for my implementation. I have to admit it feels a bit onerous right now, but I can see the value coming so I’m sticking to it.&lt;/p&gt;

&lt;p&gt;My usual working methodology is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Write a quick set of use cases&lt;/li&gt;
  &lt;li&gt;Infer features from the use cases&lt;/li&gt;
  &lt;li&gt;Divide the features into logical delivery phases&lt;/li&gt;
  &lt;li&gt;Start spec’ing the implementation&lt;/li&gt;
  &lt;li&gt;Code to the specs&lt;/li&gt;
  &lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;… so really I’m just adding a “Specify features using Cucumber” step between 3 and 4. Sounds small (but it’s not).&lt;/p&gt;

&lt;p&gt;The use cases for this project are pretty easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Use Cases:

NON-MEMBERS:
* Join

MEMBERS:
* See news postings
* See calendar events
* Subscribe to a calendar feed
* Read and send email to the group
* Maintain a member profile (email, phone, location, kid info, etc.)
* Browse and search a member directory (by grade, class, proximity/map, etc.)

PREZ FOR LIFE:
* Write news postings
* Post new events
* Send news/reminders to various publishers (group mailing list, school newsletter editor, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Yeah, we have a President For Life. He’s awesome.)&lt;/p&gt;

&lt;p&gt;Time to break these into features. I try to scope each delivery to be a useful increase in features and something I can delivery quickly (I don’t get much geek time these days ;). Some of this is old hat (it’s mostly just a CMS), but some of it calls for me to learn about things I’ve never played with (Google Maps APIs and Geolocation, for example). Additionally, it was important to get something up fast last week so the main URL could be included in some printed materials for back to school week.&lt;/p&gt;

&lt;p&gt;Here’s the feature rough divided into phases:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Phase 0: Site
Non-Members can see front page

Phase 1: Members
Non-Members can join
Members can sign in with email and password or OpenID
PFL can manage news items
PFL can manage events
PFL can manage pages
PFL can suspend accounts of non-PFLs
Members can view news and events
News snippets and event titles show on top page

Phase 2: Admins
Members can be made admin by PFL
Admins can manage news items
Admins can manage events
Admins can manage pages

Phase 3: Feeds and Mailings
Members can subscribe to news and events feeds
PFL can set reminders to be sent by email
Members can recover passwords by email

Phase 4: Profiles
Members can add email, phone, address, availability, notes, profile pic
Members can add kids: name, age, picture, teacher
Members can mark info private, admin-only, or open

Phase 5: Directory
Members can browse directory info

Phase 6: Maps
Members can see people, events on map
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Phase 0 was “get something up fast;” we made it a simple redirect to the existing Google group. Phase 1 is the biggest chunk of features, but they’re very straightforward. Each phase after that introduces enough new functionality to be interesting for the members, but in small enough chunks that I should be able to knock ‘em out in a weekend, plus-or-minus.&lt;/p&gt;

&lt;p&gt;Okay, so now I’m ready to generate the app and cucumber-ify it. I’ll cover that in the next article.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Generate the regex for a TLD hostname from Perl</title>
   <link href="http://blog.geekdaily.org/2009/08/generate-the-regex-for-a-tld-hostname-from-perl.html"/>
   <updated>2009-08-18T19:05:19-07:00</updated>
   <id>http://blog.geekdaily.org/2009/08/generate-the-regex-for-a-tld-hostname-from-perl</id>
   <content type="html">&lt;p&gt;This was a quick, fun exercise to remind me that I can still write Perl. It fetches the list of TLDs from IANA, does a quick bit of munging, then renders a regex which should match any valid FQDN:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env perl
use strict;
use warnings;

use LWP::Simple;

my $fqdn_regex;

if (my $content = get(&#39;http://data.iana.org/TLD/tlds-alpha-by-domain.txt&#39;)) {
  $fqdn_regex = &#39;(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:&#39;;
  $fqdn_regex .= join(&#39;|&#39;, grep (!/^(#|xn)/i, (split /\n/, lc($content))));
  $fqdn_regex .= &#39;)&#39;;
}

my $regex = $fqdn_regex . &#39;(?:\s|\/|$)&#39;;
print &quot;$regex\n&quot;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Several caveats:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It doesn’t match IPv4 dotted quad nor IPv6 ::-notation&lt;/li&gt;
  &lt;li&gt;It intentionally ignores Internationalized Domain Name in Applications (IDNA) domains&lt;/li&gt;
  &lt;li&gt;It borrows from my favorite reference for this, &lt;a href=&quot;http://www.regular-expressions.info/email.html&quot;&gt;regular-expressions.info’s page on email address regexes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe I’ll extend it for completeness and/or rewrite it in Ruby someday. Until then, it’ll always be &lt;tt&gt;~/bin/tld_regex&lt;/tt&gt; for me.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Gmail no longer beta? True dat.</title>
   <link href="http://blog.geekdaily.org/2009/07/gmail-no-longer-beta-true-dat.html"/>
   <updated>2009-07-07T10:12:31-07:00</updated>
   <id>http://blog.geekdaily.org/2009/07/gmail-no-longer-beta-true-dat</id>
   <content type="html">&lt;p&gt;I guess it’s no longer &lt;a href=&quot;http://blog.geekdaily.org/2007/07/beta-is-the-web.html&quot;&gt;under construction&lt;/a&gt;, or so sayeth &lt;a href=&quot;http://gmailblog.blogspot.com/2009/07/gmail-leaves-beta-launches-back-to-beta.html&quot;&gt;the GMail blog&lt;/a&gt; which also shows those who can’t live without that ubiquitous beta tag &lt;a href=&quot;http://mail.google.com/mail/?shva=1#settings/labs&quot;&gt;how to bring back their old friend&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mail.google.com/mail/?shva=1#settings/labs&quot;&gt;&lt;img src=&quot;http://purp.typepad.com/.a/6a00d83452448969e2011570df13e4970c-pi&quot; alt=&quot;Back2beta&quot; title=&quot;Back2beta&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Michael Jackson&#39;s Obit via Wordle</title>
   <link href="http://blog.geekdaily.org/2009/06/michael-jacksons-obit-via-wordle.html"/>
   <updated>2009-06-25T18:40:55-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/michael-jacksons-obit-via-wordle</id>
   <content type="html">&lt;p&gt;Story by &lt;a href=&quot;http://news.yahoo.com/s/ap/us_obit_michael_jackson&quot;&gt;Yahoo!&lt;/a&gt;, picture by &lt;a href=&quot;http://www.wordle.net/gallery/wrdl/970425/Michael_Jackson_Died&quot;&gt;Wordle.net&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.wordle.net/gallery/wrdl/970425/Michael_Jackson_Died&quot; title=&quot;Wordle: Michael Jackson Died&quot;&gt;&lt;img src=&quot;http://purp.typepad.com/.a/6a00d83452448969e20115715bf294970b-800wi&quot; alt=&quot;MJ Obit Wordle&quot; title=&quot;MJ Obit Wordle&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: 10+ Deploys A Day: Dev and Ops at Flickr</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-10-deploys-a-day-dev-and-ops-at-flickr.html"/>
   <updated>2009-06-23T13:47:46-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-10-deploys-a-day-dev-and-ops-at-flickr</id>
   <content type="html">&lt;p&gt;Update 1: &lt;a href=&quot;http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr&quot;&gt;Slides are now on SlideShare.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update 2: &lt;a href=&quot;http://velocityconference.blip.tv/file/2284377&quot;&gt;Video now available on blip.tv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;John Allspaw (Ops) &amp;amp; Paul Hammond (Eng), Twitter&lt;/p&gt;

&lt;p&gt;“Actually work together and aren’t huge assholes to each other.”&lt;/p&gt;

&lt;p&gt;(omitted: photo stats … that’s a lot of kittens)&lt;/p&gt;

&lt;p&gt;Dev vs. Ops&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s not my {machines,code} it’s your {code,machines}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spock v. Scottie analogy&lt;/p&gt;

&lt;p&gt;Ops as grumpy old man, says no all the time, cycle of “no all the time because no one tells them anything because they say no all the time”&lt;/p&gt;

&lt;p&gt;CW: dev job to add features, ops job to keep site stable and fast&lt;/p&gt;

&lt;p&gt;Flickr: Ops job is to enable the business (Dev’s, too)&lt;/p&gt;

&lt;p&gt;Business requires change, otherwise you’ll be overtaken by the new guy … but change is the root cause of most outages.&lt;/p&gt;

&lt;p&gt;Discourage change vs. Allow it to happen as often as it needs to (via tools and culture)&lt;/p&gt;

&lt;p&gt;Lowering the risk of change via tools and culture.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Increase confidence in change goodness&lt;/li&gt;
  &lt;li&gt;Increase ability to react to those changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need {ops,devs} who think like {dev,ops}&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Role and Config Mgmt&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Shared Version Control: everyone looks in the same place for everything&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Code and config in same place&lt;/li&gt;
  &lt;li&gt;Everyone has access—transparency&lt;/li&gt;
  &lt;li&gt;Everyone knows how to use it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3a. One-step build&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Everything you need to do to convert svn co’d code into what goes to the site—one command&lt;/li&gt;
  &lt;li&gt;They have “Perform Staging” button at bottom of a page with stats on latest commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3b. One-step deploy&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Top of page is deploy log with notes: who, when, what (link to changes)&lt;/li&gt;
  &lt;li&gt;Bottom has “I’m feeling lucky!” button to deploy&lt;/li&gt;
  &lt;li&gt;Continuous deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can’t pretend to deploy 10 times a day if you go down 10 times a day. That’s not being agile, that’s being retarded.&lt;/p&gt;

&lt;p&gt;They use Hudson to generate packages which can be deployed by ops&lt;/p&gt;

&lt;p&gt;Small frequent changes make it easier to see what went wrong and recover when needed&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;[missed that tag]&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Branching is all about managing bugfixes&lt;/li&gt;
  &lt;li&gt;Always ship trunk&lt;/li&gt;
  &lt;li&gt;Branch in code instead: use conditionals to block out pre-release features and configure off/invis—provides an operational lever for adjustment&lt;/li&gt;
  &lt;li&gt;Makes these open for private beta in production on production hdwe, etc.&lt;/li&gt;
  &lt;li&gt;Allows dark launches, which allows you to size appropriately, fix major oversights, take the fear out of major new launches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They have a couple hundred “free contingency switches” to turn things off/throttle things down. Gives broad operational control to minimize effects on the site.&lt;/p&gt;

&lt;p&gt;Tend to fail forward using these and fix the problem.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Shared metrics&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;You can see mine, I can see yours&lt;/li&gt;
  &lt;li&gt;Use ganglia as console&lt;/li&gt;
  &lt;li&gt;Devs know where dashboard is, and watch as obsessively as ops&lt;/li&gt;
  &lt;li&gt;Includes app-level metrics (which exposes them to Ops)&lt;/li&gt;
  &lt;li&gt;(helps drive accountability in both directions in the org—both can see and feel ownership)&lt;/li&gt;
  &lt;li&gt;This begins to create opportunity to gracefully collaborate to back off an oversub’d resource/degrade/throttle as needed&lt;/li&gt;
  &lt;li&gt;Show last site deploy info on every page/graph; you can corellate a change in the graph&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;IRC and IM bots&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Heavy IRC users for ongoing dialog between dev/ops, remote/local&lt;/li&gt;
  &lt;li&gt;Last.fm wrote a tool to inject events into IRC (monitoring, events, deployments, builds)&lt;/li&gt;
  &lt;li&gt;Log it all and put it in a search engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Culture&lt;/p&gt;

&lt;p&gt;All the tools in the world won’t help if you have a contentious culture&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Respect&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;No stereotypes: not all devs are lazy/cowboys, not all ops are obstructive&lt;/li&gt;
  &lt;li&gt;respect their expertise and opinions &lt;strong&gt;and&lt;/strong&gt; responsibilities (they influence priorities)&lt;/li&gt;
  &lt;li&gt;Don’t just say “no”—it’s like saying “I don’t care about your problem/perspective”&lt;/li&gt;
  &lt;li&gt;Best solutions are collaborative. Memcache is an excellent example; written to solve the problem of DB overheat, which impacted both&lt;/li&gt;
  &lt;li&gt;Don’t hide things: share your solution even if you think they’ll say no; you deny their expertise and input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Talk about the impact of your code push&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What metrics change&lt;/li&gt;
  &lt;li&gt;what are the risks&lt;/li&gt;
  &lt;li&gt;what are the symptoms of somethign going wrong&lt;/li&gt;
  &lt;li&gt;what are the contingencies (rollback)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Trust&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;When you walk up with all the above on hand, you demonstrate that you care enough about them and the business&lt;/li&gt;
  &lt;li&gt;“I don’t want to tell X …” == you’re a cowboy, and “cowboys are losers”&lt;/li&gt;
  &lt;li&gt;Have shared playbooks and contingency plans so all understand.&lt;/li&gt;
  &lt;li&gt;Provide as many knobs and levers as you can so Ops can tweak to match the env&lt;/li&gt;
  &lt;li&gt;Ops: be transparent, give devs insight and access to the systems. Playing telephone around shell commands is dumb.&lt;/li&gt;
  &lt;li&gt;It’s hard to help if you can’t directly see&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Have a healthy attitude around failure—it’s going to happen.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Think about how you’ll respond more than you think about how you’ll prevent it&lt;/li&gt;
  &lt;li&gt;Would you rather be treated by a GP who deals with heart attacks infrequently or an EMT who handles them weekly?&lt;/li&gt;
  &lt;li&gt;Fire drills: when ops and sr engineers are fixing a problem, have others diagnose live in parallel (but make no changes!)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Avoiding blame&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;they have a rule of no-finger-pointing; it doesn’t need enforcement, folks step up&lt;/li&gt;
  &lt;li&gt;fixing blame wastes a ton of time, why not skip it? Feel guilty afterwards if you must.&lt;/li&gt;
  &lt;li&gt;They’ve got a bit of a potlatch culture as people try to assert responsibility in order to fix things.&lt;/li&gt;
  &lt;li&gt;Remember that when your code breaks, someone’s going to have to wake up to fix it. Own it and apologize, at least. Otherwise, you’re back to not respecting each other (“Screw you … aren’t you getting paid to do that?”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ops should provide constructive, continual feedback on how it’s going. Point out interesting things before they’re critical&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Q&amp;A with Twitter&#39;s John Adams</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-qa-with-twitters-john-adams.html"/>
   <updated>2009-06-23T13:28:57-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-qa-with-twitters-john-adams</id>
   <content type="html">&lt;p&gt;A short pre-lunch session to absorb a few moment:&lt;/p&gt;

&lt;p&gt;John Adams (Twitter) Q&amp;amp;A&lt;/p&gt;

&lt;p&gt;Q: How do you log all the info from your APIs?&lt;/p&gt;

&lt;p&gt;A: syslog, looking at scribe, generally summarize and toss&lt;/p&gt;

&lt;p&gt;Q: How do you control abusive clients?&lt;/p&gt;

&lt;p&gt;A: Rate limiting, apply feature limits to abusers, etc.&lt;/p&gt;

&lt;p&gt;Q: What would you do differently?&lt;/p&gt;

&lt;p&gt;A: Implemented change controls much sooner. Process is much better now with more control, predictability&lt;/p&gt;

&lt;p&gt;Q: How does your on-call team work?&lt;/p&gt;

&lt;p&gt;A: More people reduces length in rotation. Nagios with alerts and aggregation of alerts. Make alerts actionable (db fails? see one page for db down, not 500 webservers). Also prevents burnout&lt;/p&gt;

&lt;p&gt;Q: Carry a real pager?&lt;/p&gt;

&lt;p&gt;A: Some, mostly SMS. There are escalations if you don’t answer. Always someone from Ops and Eng on the pager chain.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: PageSpeed</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-pagespeed.html"/>
   <updated>2009-06-23T13:19:27-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-pagespeed</id>
   <content type="html">&lt;p&gt;Bryan McQuade (Google), Richard Rabbat (Google, Inc.)&lt;/p&gt;

&lt;p&gt;What’s Page Speed&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;FF/Firebug addon&lt;/li&gt;
  &lt;li&gt;http://code.google.com/p/page-speed&lt;/li&gt;
  &lt;li&gt;Optimizes images, minifies JS, tells you what you should defer&lt;/li&gt;
  &lt;li&gt;100K downloads in 10 days, 1000s of tweets, 100s of blog postings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How’d it start&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;wanted to help stop relearning lessons in new apps&lt;/li&gt;
  &lt;li&gt;keep you from unintended consequeces (e.g. vary header, squid won’t cache anything with params, etc.) Google map tiles used to have ? in URL; removing it gave huge boost in perf, huge reduction in requests&lt;/li&gt;
  &lt;li&gt;Sourced from many smart people on the web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prioritizes according to importance/savings, gives easy way to see detailed info about any given rule, what’s violating it, docs on why and how of each rule&lt;/p&gt;

&lt;p&gt;Defer loading JS as much as possible&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rule looks to see what’s not been invoked before OnLoad completes&lt;/li&gt;
  &lt;li&gt;Not enabled by default, has perf hit&lt;/li&gt;
  &lt;li&gt;Load multiple times in multiple scenarios; some JS is triggered in different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inefficient CSS Selectors: based on David Hyatt’s post on inefficient selectors&lt;/p&gt;

&lt;p&gt;Activity Panel&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Show where most time is spent, where you should focus optimization&lt;/li&gt;
  &lt;li&gt;Shows DNS, network, connection, latency, data available for use, JS parse/exec, cache hits&lt;/li&gt;
  &lt;li&gt;Coming: paint events, screen snapshotting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BBC “has lots of room for optimization” 
 gmail waterfall is hugely vertical!&lt;/p&gt;

&lt;p&gt;Just released FF3.5 compatible version&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: 2 Years Later, Loving and Hating the Cloud</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-2-years-later-loving-and-hating-the-cloud.html"/>
   <updated>2009-06-23T13:16:21-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-2-years-later-loving-and-hating-the-cloud</id>
   <content type="html">&lt;p&gt;More from Velocity 2009&lt;/p&gt;

&lt;p&gt;Justin Huff, Picknik (online photo editor)&lt;/p&gt;

&lt;p&gt;Used AWS for 2 years, 1.5 in production&lt;/p&gt;

&lt;p&gt;Hybrid app: small cage in Seattle + EC2/S3 for some parts of infra&lt;/p&gt;

&lt;p&gt;Gives flexibility&lt;/p&gt;

&lt;p&gt;Picnik has a spiky profile based on usage; EC2 allows to cover that&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They use a lot of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capacity management (not planning)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;easily repurpose between webserver and asynch jobs&lt;/li&gt;
  &lt;li&gt;Can buy hardware in batches, grow logically, get better deals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At one point had nearly 1B objects in S3&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Move old files to S3&lt;/li&gt;
  &lt;li&gt;Put some new files to S3&lt;/li&gt;
  &lt;li&gt;Put a lot more out there (had a knob to adjust, eventually reached S3)&lt;/li&gt;
  &lt;li&gt;Profit? Not so much ..&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most S3 objs short lived, needed fast deletion, and mostly didn’t have it&lt;/p&gt;

&lt;p&gt;Mostly ignored this problem in favor of other more important problems (db sharding, scaling web frontends, expanding). Spend money on it.&lt;/p&gt;

&lt;p&gt;They have 1.5 ops people.&lt;/p&gt;

&lt;p&gt;“At some point we started getting free airline tickets from FF mileage on AWS CC”&lt;/p&gt;

&lt;p&gt;Non-cloud apps have predictable, controllable latency, etc. Not so much in the cloud.&lt;/p&gt;

&lt;p&gt;Be ready for fail&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What if EC2 goes down? Have a knob for how much to go offline/reduce services&lt;/li&gt;
  &lt;li&gt;Be ready for hard debugging: lots of visibility/instrumentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mostly, though, clouds help you ignore problems … until you can’t.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Fixing Twitter</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-fixing-twitter.html"/>
   <updated>2009-06-23T13:07:14-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-fixing-twitter</id>
   <content type="html">&lt;p&gt;John Adams, Twitter Ops&lt;/p&gt;

&lt;p&gt;Ops&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Small team&lt;/li&gt;
  &lt;li&gt;SW perf&lt;/li&gt;
  &lt;li&gt;availability is their primary focus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All on managed services with NTT
- No clouds—too high latency
- NTT runs the NOC
- Frees them to deal with real thinking compsci probs&lt;/p&gt;

&lt;p&gt;752% growth in 2008, trend happens ~11/2008 and keeps climbing&lt;/p&gt;

&lt;p&gt;Growth Pain Fear of what’s gonna happen&lt;/p&gt;

&lt;p&gt;Mantra:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Find the weekest point (metrics + logging + analysis)&lt;/li&gt;
  &lt;li&gt;Take corrective action (process)&lt;/li&gt;
  &lt;li&gt;Repeat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Find weak points&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Collect metrics and graphs (individual metrics are irrelevant)&lt;/li&gt;
  &lt;li&gt;Logs&lt;/li&gt;
  &lt;li&gt;SCIENCE!&lt;/li&gt;
  &lt;li&gt;Instrument everything! More info is better&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitoring&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Keep critical metrics as close to realtime as possible&lt;/li&gt;
  &lt;li&gt;Using RRD, Ganglia + gMetrics, MRTG&lt;/li&gt;
  &lt;li&gt;Mostly on 10s interval, some 5s, some 60s&lt;/li&gt;
  &lt;li&gt;Everyone in company has access to dashboard&lt;/li&gt;
  &lt;li&gt;“Criticals” view&lt;/li&gt;
  &lt;li&gt;Use google analytics for failwhale and other err pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analyze&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Turn data into info&lt;/li&gt;
  &lt;li&gt;Are things better/worse post-deploy&lt;/li&gt;
  &lt;li&gt;Create env of capacity planning, not firefighting—no more cowboys in the wild west&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deploys&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ganglia shows final deploy info for twitter, summize, and search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whale-watcher&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;simple script with massive win&lt;/li&gt;
  &lt;li&gt;503 is a whale, 500 is a robot&lt;/li&gt;
  &lt;li&gt;Whales per second exceeds whale threshold then “There’s whales!”&lt;/li&gt;
  &lt;li&gt;Darkmode: selectively disable portions of site with automatic notification to product and eng teams to let them know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Config Mgmt&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You need an automated cfg mgmt system NOW. Else you won’t scale&lt;/li&gt;
  &lt;li&gt;It intros complexity, with multiple admins, unknown interactions&lt;/li&gt;
  &lt;li&gt;Peer review solves most of this; they use reviewboard with svn precommit hook requiring “reviewed by” note in comment and postcommit hook sends note about what changed to people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;High communication&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They use chat (campfire) with docs, graphs, logs, etc.&lt;/li&gt;
  &lt;li&gt;skitch into campfire is a frequent working methodology&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subsystems&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Many limiting factors in request pipeline&lt;/li&gt;
  &lt;li&gt;Oversubscribe mongrel 2:1 vs. cores&lt;/li&gt;
  &lt;li&gt;Attack plan per ssytem (e.g. bandwidth? bottleneck: network, vector: http latency, solution: servers+&lt;ins&gt;; timeline? db, update delay, better algo; search? db, delays, dbs&lt;/ins&gt;+ and code; etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CPUs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;switched to Xeon +30% gain&lt;/li&gt;
  &lt;li&gt;replace 2x and 4x core with 8x core +40%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rails:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stop blaming rails&lt;/li&gt;
  &lt;li&gt;Analysis: caching/cache invalidation, AR makes bad queries, queue latency, memcache/page corruption, rep lag&lt;/li&gt;
  &lt;li&gt;Not so much about Rails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disk is the new Tape&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Social networks is very O(n^y) oriented&lt;/li&gt;
  &lt;li&gt;Disk is too slow&lt;/li&gt;
  &lt;li&gt;Need lots of RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lots of caching is possible. Moving libmemcached to native C gem was bigtime helpful.&lt;/p&gt;

&lt;p&gt;Nick’s CacheMoney AR plugin: readthru/writethru caching with memcached!&lt;/p&gt;

&lt;p&gt;Caching everything not smart, either&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cache evictions&lt;/li&gt;
  &lt;li&gt;Cold cache after host failure/new host spinup&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Cache smarter: get rid of cache busting behaviors, varnish with failover, etc.
RDBMS vs message queues&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Not everything needs ACID&lt;/li&gt;
  &lt;li&gt;message queues help&lt;/li&gt;
  &lt;li&gt;Most MQs suck at high load&lt;/li&gt;
  &lt;li&gt;They wrote Kestrel for this; looks like memcache&lt;/li&gt;
  &lt;li&gt;Starling was earlier version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asynch == Good&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They lean on mongrel heavily (they know it well)&lt;/li&gt;
  &lt;li&gt;Keep external service requests out of the pipeline via daemons which process message queues&lt;/li&gt;
  &lt;li&gt;Size worker daemons appropriately, have them kill themselves off rather than long-run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DB replication&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Multiple functional read/write masters&lt;/li&gt;
  &lt;li&gt;never read from the master—slows it down too much&lt;/li&gt;
  &lt;li&gt;watch your slow queries&lt;/li&gt;
  &lt;li&gt;use mkill to kill long-running queries before they kill you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put up a status blog on some other service—transparency stops armchair engineering&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Next Web Challenges: It&#39;s Still All About UX</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-next-web-challenges-its-still-all-about-ux.html"/>
   <updated>2009-06-23T12:59:01-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-next-web-challenges-its-still-all-about-ux</id>
   <content type="html">&lt;p&gt;Velocity 2009, the conference about performance, is very high-performance about getting people on and off stage (and high density around content)&lt;/p&gt;

&lt;p&gt;Umang Gupta, Vik Chaudhary (Keynote)&lt;/p&gt;

&lt;p&gt;(omitted: Keynote history, 15 years of continuous improvement, etc.)&lt;/p&gt;

&lt;p&gt;Debuting Transaction Perpective 9.0 (TXP9)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Embeds real IE browser for monitoring&lt;/li&gt;
  &lt;li&gt;Adds “screen sensing” technology&lt;/li&gt;
  &lt;li&gt;Esp. useful for “next web” apps: flash, video, voice, SMS/mobile—composit transactions or flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(demo: reservations site for The Broadmoor in Colorado Springs, very flash-integrated with lots of client-side action. “Challenge of screen sensing what’s going on on the screen is non-trivial”. Also http://espn.go.com/video/ and Mini-Cooper flash site)&lt;/p&gt;

&lt;p&gt;Using KITE platform/desktop environment to record what you’re doing. You click around, type, etc. and it records a script.&lt;/p&gt;

&lt;p&gt;(This is somewhat like what they do at [DeviceAnywhere http://deviceanywhere.com/] for mobile device testing. They don’t focus on UX or perf; they’re more on QA testing side)&lt;/p&gt;

&lt;p&gt;Script runs and collects UX and Network times. UX time is net time + client-side execution + rendering. Also shows augmented waterfall inclusive of client-side computation, etc.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: The User and Business Impact of Server Delays, Additional Bytes, and HTTP Chunking in Web Search</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-the-user-and-business-impact-of-server-delays-additional-bytes-and-http-chunking-in-web-sea.html"/>
   <updated>2009-06-23T09:58:10-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-the-user-and-business-impact-of-server-delays-additional-bytes-and-http-chunking-in-web-sea</id>
   <content type="html">&lt;p&gt;Eric Schurman (Microsoft/bing), Jake Brutlag (Google)&lt;/p&gt;

&lt;p&gt;Experiments&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Server delays (MS and Google)&lt;/li&gt;
  &lt;li&gt;Page weight variance&lt;/li&gt;
  &lt;li&gt;Progressive rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They have platforms for experimentation which allow fractional experiments&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Divide users into small buckets&lt;/li&gt;
  &lt;li&gt;use good methodology (control group, experimental group(s))&lt;/li&gt;
  &lt;li&gt;Way better than usability tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Server Delays&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Goal [missed all of this due to an IM. Lesson learned]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;No statistically significant change @ ~50ms delay&lt;/li&gt;
  &lt;li&gt;Observable and fairly linear impact on delays 200/500/1000/2000ms.&lt;/li&gt;
  &lt;li&gt;Time to first click took ~2x delay—theory: user has opportunity to get distracted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google Search Delay Experiment&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Varied type of delay, magnitude, and duration (number of weeks) per user group&lt;/li&gt;
  &lt;li&gt;Pre-header delay: pause server processing upon receipt of req&lt;/li&gt;
  &lt;li&gt;Post-header delay: pause after sending on header, but before sending results&lt;/li&gt;
  &lt;li&gt;Post-ads delay: (ads are structurally first in page, can render before search result) put ads in separate http chunk, delay between ads and search results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Measure average daily searches per user&lt;/li&gt;
  &lt;li&gt;50ms pre-header delays show no significant impact&lt;/li&gt;
  &lt;li&gt;100ms pre-head, 200ms post-heads, 400ms post-head, 200ms post-ads (and others) showed linear progression in decreased avg daily searches&lt;/li&gt;
  &lt;li&gt;Also saw increase in internally monitored “abandonment rate”&lt;/li&gt;
  &lt;li&gt;Active users are more sensitive&lt;/li&gt;
  &lt;li&gt;drop-off continued to trend down linearly beyond 4 weeks; effect becomes more pronounced over time, and additive—200ms and 400ms groups diverge more strongly&lt;/li&gt;
  &lt;li&gt;Stopped injecting delays at week 7; recovery was significant immediately, but not fully realized at week 12—there was still a drop in activity for these groups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Page weight experiments&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;injected incompressible comments into various places of page&lt;/li&gt;
  &lt;li&gt;varied size of comments from 5% of page to 500% (most of larger loads were below the fold)&lt;/li&gt;
  &lt;li&gt;small payloads weren’t worrisome (tho stat’ly significant)&lt;/li&gt;
  &lt;li&gt;perf suffered slightly, but was US only experiment; global exp planned, will likely show significantly larger drop in perf&lt;/li&gt;
  &lt;li&gt;Click metrics were hurt more than query metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Progressive rendering experiment&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Goal: determine impace sending visual header before results&lt;/li&gt;
  &lt;li&gt;Build page in phases, send using HTTP 1.1 chunked transfer encoding&lt;/li&gt;
  &lt;li&gt;Results: Large improvement due to parallelization. Time to first click was ~9% faster, more likely to refine query, more clicks, more likely to page thru results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HCI may state that 100-200ms isn’t perceptible; it still has effect.&lt;/p&gt;

&lt;p&gt;Getting something to your user quickly is more important than when they receive their last byte&lt;/p&gt;

&lt;p&gt;Experimentation platforms make all this research and hard numbers possible.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: After the Click</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-after-the-click.html"/>
   <updated>2009-06-23T09:35:53-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-after-the-click</id>
   <content type="html">&lt;p&gt;More from Velocity 2009. Going really fast, sorry for all the sloppiness.&lt;/p&gt;

&lt;p&gt;Jonathan Heiliger, VP Tech Ops FB&lt;/p&gt;

&lt;p&gt;FB Mission: give people the power to share and make the world more open and connected.&lt;/p&gt;

&lt;p&gt;2004: launch in MZ’s dorm room
 2004-5: new apps launched (events, photos, mobile)
 2006: news feed and open reg
 2007: platform launch
 2008: crowdsourced translations; reached 30 langs quickly (spanish 2 wks, french ~24 hrs)&lt;/p&gt;

&lt;p&gt;[nice map viz for growth: colorize market penetration]&lt;/p&gt;

&lt;p&gt;Radio took ~150 yrs (?) to reach 150M
 TV: 13 yrs
 Computers 4 years
 FB: 3 yrs&lt;/p&gt;

&lt;p&gt;How FB deals&lt;/p&gt;

&lt;p&gt;Classic battle of Ops v. Eng&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ops wants no change—stability&lt;/li&gt;
  &lt;li&gt;Eng wants lots of change—driven by users and site&lt;/li&gt;
  &lt;li&gt;Do you really want to fight it out? Teamwork is required&lt;/li&gt;
  &lt;li&gt;Enable individuals to reach goals, chase team success&lt;/li&gt;
  &lt;li&gt;Make it transparent to users and safe for employees to fail&lt;/li&gt;
  &lt;li&gt;Make it a point of pride: you don’t want to be the one who took down the site (but there’s some cache in that war story)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the people&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Everyone hires the smartest people&lt;/li&gt;
  &lt;li&gt;It’s about organizing and leading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tuning the Operating Pipeline (Eng -&amp;gt; QA -&amp;gt; Ops aka Dev -&amp;gt; Test -&amp;gt; Deploy)
 (this isn’t how they did it)&lt;/p&gt;

&lt;p&gt;Engineering is responsible for the efficacy and reliability of their code, writing their own tests, and full lifecycle of code including pushing it live.&lt;/p&gt;

&lt;p&gt;Ops provides guard rails to keep eng safe from itself, prevent site downtime. Feature can go down, but rest of site is safe.&lt;/p&gt;

&lt;p&gt;Complaints back in the day:
 Ops: Eng is way too unstructured, lobbing crap over the wall.
 Eng: Ops is not nimble&lt;/p&gt;

&lt;p&gt;Make the problem joint; Eng owns the problem&lt;/p&gt;

&lt;p&gt;Continuous build, code review, peer review, perf testing has kept things moving fast while moving to 200+ eng org.&lt;/p&gt;

&lt;p&gt;Put engineers in operations&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Site reliability team: stewards of the site&lt;/li&gt;
  &lt;li&gt;Operations engineering: tooling and glue apps (workflow/pipeline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put ops in engineering (consulting engineers)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Partners with backend service groups to think about architecture, scaling, reliability&lt;/li&gt;
  &lt;li&gt;Helps mentor into full SDLC responsibility—really understand complete DEV to PROD function of code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Software launch has warroom with PM, Eng, NetEng, SRE, Perf Eng, Site Integrity staff around. Always the right person on hand, physically present.&lt;/p&gt;

&lt;p&gt;Getting it done&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you can’t work as a team, you’re done&lt;/li&gt;
  &lt;li&gt;Design is awesome, but it needs execution to succeed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three things they did live expecting to break the site&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;See how the team worked, who would step up, etc.
CNN livefeed&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Group of 20 some folks came together, marketing, eng, product, ops, etc.&lt;/li&gt;
  &lt;li&gt;Added much capacity, made warroom&lt;/li&gt;
  &lt;li&gt;Written from scratch in ~3 weeks&lt;/li&gt;
  &lt;li&gt;Replicated (and improved) for Oscars, etc.&lt;/li&gt;
  &lt;li&gt;Knew there would be point load much like DoS attack&lt;/li&gt;
  &lt;li&gt;Added throttles to direct features, as well as throttling things like chat, number of thumbnails shown on site, etc.&lt;/li&gt;
  &lt;li&gt;Friends had to be shown on the fly&lt;/li&gt;
  &lt;li&gt;Common content was cached in CDN; didn’t anticipate delay/latency from CDN&lt;/li&gt;
  &lt;li&gt;Didn’t expec users to maddly twiddle “Everyone” and “Friends” tabs (they did) – learned “cache everything”&lt;/li&gt;
  &lt;li&gt;During inauguraton 2M status updates, 8.5K spike at start&lt;/li&gt;
  &lt;li&gt;Dark launched everything with users exercising the stack without any visible UI to users&lt;/li&gt;
  &lt;li&gt;Also built perf framework to see what real user experience would be like&lt;/li&gt;
  &lt;li&gt;Used data from both to appropriately size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Simple “I like this” on wall/status&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Didn’t expect it to get a lot of traffic at first; totally wrong&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;4.1m users liked 7.1 M times first day&lt;/li&gt;
      &lt;li&gt;16.3/46.2 1st week&lt;/li&gt;
      &lt;li&gt;39.6/226.8 1st month&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Username allocations&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Was initially to be auction (codename: hammer)&lt;/li&gt;
  &lt;li&gt;Decided to go first come first served, kept codename—it was going to hammer the site&lt;/li&gt;
  &lt;li&gt;Had to have blocked list of trademarks; didn’t block “asp.net”&lt;/li&gt;
  &lt;li&gt;Dark launch, found issues, delayed initial launch&lt;/li&gt;
  &lt;li&gt;Launched at 9p; huge cache hit within moments, no increase in idle latency (means they got it right, maybe a little overprovisioned)&lt;/li&gt;
  &lt;li&gt;Made pages as light as possible&lt;/li&gt;
  &lt;li&gt;Tiny blip in overall load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Datacenter infra/organization is hugely important&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Untidiness reflects bad organization&lt;/li&gt;
  &lt;li&gt;DC/infra is 2nd biggest exp after people&lt;/li&gt;
  &lt;li&gt;Invest where appropriate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Distribute accountability
 Test with users
 “The only place success comes before work is in the dictionary” – Vince lombardi&lt;/p&gt;

&lt;p&gt;Expects org to look different in a year—evolution is the key.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Surviving the 2008 Elections at DailyKos.com</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-surviving-the-2008-elections-at-dailykoscom.html"/>
   <updated>2009-06-23T09:03:07-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-surviving-the-2008-elections-at-dailykoscom</id>
   <content type="html">&lt;p&gt;More from Velocity 2009:&lt;/p&gt;

&lt;p&gt;Jeremy Bingham, DailyKos.com&lt;/p&gt;

&lt;p&gt;Before the flood&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;fell over a lot&lt;/li&gt;
  &lt;li&gt;took a lot of admin time&lt;/li&gt;
  &lt;li&gt;slow load times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MySQL issues&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;legacy tables from nearly-decade-old Slash with bad primary keys&lt;/li&gt;
  &lt;li&gt;many MySQL 3.23isms—didn’t use any newer features&lt;/li&gt;
  &lt;li&gt;had to stop believing “things are there for a reason” (e.g. fulltext index: 9GB data, 17GB index)&lt;/li&gt;
  &lt;li&gt;keep all the old URLs working&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IA Caucus first big night&lt;/p&gt;

&lt;p&gt;Caching&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Started with apache 1.3 as proxy, disk caching with push to disk&lt;/li&gt;
  &lt;li&gt;Brought site to its knees as everything updated cache in sync&lt;/li&gt;
  &lt;li&gt;switched to lighttpd using Vua, mod_magnet&lt;/li&gt;
  &lt;li&gt;switched to mod_mcpage, cache pages only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hardware&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;10 2x Xeons 2GB, 2 2x Opterons 8GB, image/memcached/combined search/SMTP server&lt;/li&gt;
  &lt;li&gt;All independent, update separately&lt;/li&gt;
  &lt;li&gt;updated to 6 4x Xeons 8GB, 2 8x Xeons 16GB, RAID 10 with well-tuned xfs for DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traffic more than doubled at election peak over normal monthly, almost 3x&lt;/p&gt;

&lt;p&gt;People liked to talk about Sarah Palin … a lot. How nice that she provided things to talk about.&lt;/p&gt;

&lt;p&gt;Changes were in place by April 2008/Pennsylvania primary&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;perf was good&lt;/li&gt;
  &lt;li&gt;flash electoral map was on 100Mb switch&lt;/li&gt;
  &lt;li&gt;webhead loads ~0.5-1.8&lt;/li&gt;
  &lt;li&gt;Ads and map added some slowdowns&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Hadoop Operations</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-hadoop-operations.html"/>
   <updated>2009-06-22T16:39:44-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-hadoop-operations</id>
   <content type="html">&lt;p&gt;I’m at Velocity 2009, sitting in on the “Hadoop Operations” talk.&lt;/p&gt;

&lt;p&gt;Jeff Hammerbacher, Chief Scientist, Cloudera (email is first six of his last name at his company dot com). He has an ambitious agenda for this session and talks very fast, so sketchy notes and abbrevs for me. Pardon the crappy formatting.&lt;/p&gt;

&lt;p&gt;slides are &lt;a href=&quot;http://www.slideshare.net/jhammerb/20090622-velocity&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Built data team at FB. ~30 ppl when he left. Built Hive and Cassandra.&lt;/p&gt;

&lt;p&gt;Good resources:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“Hadoop: The Definitive Guide” by Tom White (must have)&lt;/li&gt;
  &lt;li&gt;“Hadoop Cluster Management” slides by Marco Nicosia’s 2009 USENIX talk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hadoop: OSS for WSCs (warehouse-scale computers)&lt;/p&gt;

&lt;p&gt;Typical cluster: 1U 2×4 core, 8GB RAM, 4×1TB SATA, 2×1 gE NIC; one switch per rack with 8 Gb intfc to backbone. Think 40-node-rack as unit.&lt;/p&gt;

&lt;p&gt;HDFS: breaks files to 128MB, replicates blocks across nodes. W1RM design. checksumming, replication, compression included (tell you three times). Hooks in via Java, C, command line tools, FUSE, WebDAV, Thrift. Not usually mounted directly.&lt;/p&gt;

&lt;p&gt;[how does it handle many small files? see HAR files below, see Common problems below, no statements about performance]&lt;/p&gt;

&lt;p&gt;HDFS looks to diversly write blocks (across racks) using topology info.&lt;/p&gt;

&lt;p&gt;MapReduce uses HDFS api to assign work to where the data is.&lt;/p&gt;

&lt;p&gt;Avro: cross-language serialization for on-wire/RPC and persistence, includes versioning and security&lt;/p&gt;

&lt;p&gt;HBase: Google’s BigTable lookalike on top of HDFS&lt;/p&gt;

&lt;p&gt;Hive: SQL-like interface to structured data stored in HDFS. Replace DWH.&lt;/p&gt;

&lt;p&gt;Pig: lang for dataflow programming.&lt;/p&gt;

&lt;p&gt;Zookeeper: manage a distributed system&lt;/p&gt;

&lt;h3 id=&quot;good-ways-to-dip-your-toes-with-hadoop&quot;&gt;Good ways to dip your toes with Hadoop:&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Projects:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Log or msg warehouse&lt;/li&gt;
  &lt;li&gt;DB archival store&lt;/li&gt;
  &lt;li&gt;ETL for DWH&lt;/li&gt;
  &lt;li&gt;Search team projects (autocomplete, did you mean, indexing)&lt;/li&gt;
  &lt;li&gt;Targeted web crawls (market research, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Clusters:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;use retired DB servers&lt;/li&gt;
  &lt;li&gt;use unused desktops&lt;/li&gt;
  &lt;li&gt;use EC2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[skipped a lot about how the project runs, apache voting, etc.]&lt;/p&gt;

&lt;p&gt;Don’t run Hadoop across two data centers; one per and communicate at the app layer. [this sounds a lot like the rules for MPI et al ca. 1999-2000]&lt;/p&gt;

&lt;p&gt;Make sure to use ECC RAM. High volume mem churn requires it.&lt;/p&gt;

&lt;p&gt;Linux/CentOS “mildly preferred”&lt;/p&gt;

&lt;p&gt;Mount local FS “noatime” for performance.&lt;/p&gt;

&lt;p&gt;Recommend ext3 over xfs. Local FS performance improvements (e.g. xfs) don’t necessarily translate to global perf improvements (network bottlenecks consume it). Mentioned an xfs long-write problem.&lt;/p&gt;

&lt;p&gt;JBOD over RAID0; slightly better performance and losing a disk doesn’t suck as much.&lt;/p&gt;

&lt;p&gt;Java 6 update 14 or later (update 14 makes 64-bit pointers as cheap as 32-bit).&lt;/p&gt;

&lt;h3 id=&quot;installation-httpwwwclouderacomhadoop&quot;&gt;Installation: http://www.cloudera.com/hadoop&lt;/h3&gt;

&lt;p&gt;“In our distribution we put [things] where they ought to be.” Register with init.d, etc.&lt;/p&gt;

&lt;h3 id=&quot;configuration-httpmyclouderacom&quot;&gt;Configuration: http://my.cloudera.com/&lt;/h3&gt;

&lt;p&gt;You spec topology and whether JT/NN live on same machine, it spits out the rest. Hangs on to it for you, too.&lt;/p&gt;

&lt;h4 id=&quot;config-modes&quot;&gt;Config modes&lt;/h4&gt;

&lt;p&gt;Standalone mode:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Everything in one JVM&lt;/li&gt;
  &lt;li&gt;Only one reducer, so you might not be able to find the bug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pseudo-dist mode:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;All daemons on one box using socket IPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dist mode:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;For production&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;config-files&quot;&gt;Config files&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;xml based&lt;/li&gt;
  &lt;li&gt;org.apache.hadoop.conf has Configuration class&lt;/li&gt;
  &lt;li&gt;Later resources overwrite earlier; “final” keyword prevents overwrite&lt;/li&gt;
  &lt;li&gt;common-site.xml, hdfs-site.xml, mapred-site.xml&lt;/li&gt;
  &lt;li&gt;Look in .template for examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloudera admins their soft-layer cluster with Puppet “with varying level of success”. He’s seen Chef, cfengine, bcfg2, and others.&lt;/p&gt;

&lt;h4 id=&quot;problems-in-config&quot;&gt;Problems in config:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;“The problem is almost always DNS”—Todd Lipcon&lt;/li&gt;
  &lt;li&gt;Open the necessary ports (many) in firewall&lt;/li&gt;
  &lt;li&gt;Disting ssh keys (Cloudera uses expect)&lt;/li&gt;
  &lt;li&gt;directory permissions (writing logs)&lt;/li&gt;
  &lt;li&gt;Use all your disks!&lt;/li&gt;
  &lt;li&gt;Don’t try to use NFS for large clusters&lt;/li&gt;
  &lt;li&gt;JAVA_HOME set right (esp. on Macs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nehalems ~2x performance improvement&lt;/p&gt;

&lt;h3 id=&quot;hdfs-namenode-the-master&quot;&gt;HDFS NameNode (“the master”)&lt;/h3&gt;

&lt;p&gt;VERSION file specs layoutVersion (negative number, decrements for each new). You hope this doesn’t change much; upgrade is painful&lt;/p&gt;

&lt;p&gt;NN manages fs image (inode map, in mem) and edit log (journal, to disk).&lt;/p&gt;

&lt;p&gt;Secondary NN (on different node) aka checkpoint node (v0.21): replays journal and tells primary to forget some history to prevent the edit log from becoming ridiculously large.&lt;/p&gt;

&lt;p&gt;Backup node: write same data to NFS to recover if local node blows up&lt;/p&gt;

&lt;h3 id=&quot;datanode-round-robins-blocks-across-all-nodes&quot;&gt;DataNode: round-robins blocks across all nodes.&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Heartbeats to the nodes&lt;/li&gt;
  &lt;li&gt;dfs.hosts[.exlcude] to allow/deny clients&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;client&quot;&gt;Client:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Use Java libs or command line&lt;/li&gt;
  &lt;li&gt;libhdfs c library lacks features and has memory leaks (and FUSE interface uses it)&lt;/li&gt;
  &lt;li&gt;Client only contacts NN for metadata&lt;/li&gt;
  &lt;li&gt;Client keeps distance-ranked list of block locations for data reads&lt;/li&gt;
  &lt;li&gt;Client maintains write queues: data queue and ack queue (writes three times, can’t forget request until all three are ack’d).&lt;/li&gt;
  &lt;li&gt;First datanode in write takes responsibility for pass-down-the-line write requests rather than having client spray data at all 3/n data nodes expected to write.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can’t seek and write, nor append. So you create new each time.&lt;/p&gt;

&lt;h3 id=&quot;hdfs-operator-utilities&quot;&gt;HDFS Operator Utilities&lt;/h3&gt;

&lt;p&gt;Safe mode&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Loads image file, applies edit log, creates new (empty) edit log&lt;/li&gt;
  &lt;li&gt;Datanodes send blocklists to NN&lt;/li&gt;
  &lt;li&gt;NN uses this during startup, will only service metadata reads while in safe mode&lt;/li&gt;
  &lt;li&gt;Exits safe mode after 99.9% of blocks have reported in (configurable); only one replica of block must be known (can rereplicate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FS Check (hadoop fsck)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Just talks to NN to look at metadata&lt;/li&gt;
  &lt;li&gt;Looks for minimally rep’d, over/under rep’d blocks&lt;/li&gt;
  &lt;li&gt;Identify missing replicas and rereplicate, blocks with 0 replicas (corrupt files)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;hadoop fsck /path/to/file -files -blocks&lt;/code&gt; to determine blocks for file&lt;/li&gt;
  &lt;li&gt;Run ~1 hr in production, store output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;dfsadmin&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;admin quotas&lt;/li&gt;
  &lt;li&gt;add/remove datanodes&lt;/li&gt;
  &lt;li&gt;ckpoint fs image&lt;/li&gt;
  &lt;li&gt;monitor/manage fs upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DataBlockScanner&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;cksum local blocks (with bandwidth throttling)&lt;/li&gt;
  &lt;li&gt;Runs ~3 weeks (configurable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Balancer&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;goes thru cluster, makes disk utilization scores per datanode&lt;/li&gt;
  &lt;li&gt;rebalances if nodes are more than +/- 10% (with throttling)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Archive Tool&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;HAR file: like tar file, many entries in one HDFS namespace&lt;/li&gt;
  &lt;li&gt;Makes two index files and many part files (hopefully less than # of files you’re har’g)&lt;/li&gt;
  &lt;li&gt;Index files are used for lookup into part files&lt;/li&gt;
  &lt;li&gt;Doesn’t support compression and are W1RM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;distcp&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Move large amounts of data in parallel&lt;/li&gt;
  &lt;li&gt;Implemented as MapReduce with no reducers&lt;/li&gt;
  &lt;li&gt;Can move data between data centers with this; can also saturate the network pipe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quotas&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;apply to directories, not users or groups&lt;/li&gt;
  &lt;li&gt;namespace quotas constrain your use of the NN resources&lt;/li&gt;
  &lt;li&gt;diskspace quotas constrain your use of the datanodes’ resources&lt;/li&gt;
  &lt;li&gt;No defaults (can’t make new directories pick them up)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users, Groups, Permissions&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Relatively new&lt;/li&gt;
  &lt;li&gt;Very UNIXy&lt;/li&gt;
  &lt;li&gt;Executable bit means nothing on file&lt;/li&gt;
  &lt;li&gt;Need write on dir to add/remove files&lt;/li&gt;
  &lt;li&gt;need exec on dir to access child dirs&lt;/li&gt;
  &lt;li&gt;identity of NN process superuser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Audit logs&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Not on by default, but useful for security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Topology&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Uses to compute distance measures for replication&lt;/li&gt;
  &lt;li&gt;Node, Rack, Core Switch&lt;/li&gt;
  &lt;li&gt;Some work to infer from IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Web UIs&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;There are many&lt;/li&gt;
  &lt;li&gt;NN @ port 50070: /metrics /logLevel /stacks&lt;/li&gt;
  &lt;li&gt;2NN @ port 50090&lt;/li&gt;
  &lt;li&gt;Datanode @ port 50075&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HFDS Proxy: http server access for non-HDFS clients&lt;/p&gt;

&lt;p&gt;ThriftFS: thrift server for non-HDFS clients&lt;/p&gt;

&lt;p&gt;Trash:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Helps recover from bad rm’s (indavertent rm -rf happened on FB cluster)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common Problems&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Disk capacity: crank up reserved space, keep close eye on space, watch hadoop logfiles&lt;/li&gt;
  &lt;li&gt;Slow disks which aren’t yet dead: can’t see as fail, but you have to watch&lt;/li&gt;
  &lt;li&gt;NIC goes out of gig-E mode&lt;/li&gt;
  &lt;li&gt;ckpoint and backup data: keep an eye on 2NN node, watch NN edit log size&lt;/li&gt;
  &lt;li&gt;check NFS mount for shared NN data structure&lt;/li&gt;
  &lt;li&gt;Long writes (&amp;gt; 1 hr) can see things get freaky; break them down&lt;/li&gt;
  &lt;li&gt;HDFS layoutVersion upgrades are scary&lt;/li&gt;
  &lt;li&gt;Many small files can consume namespace: keep an eye on consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turn on fairshare schedulers (Cloudera rus it out of the box)&lt;/p&gt;

&lt;p&gt;Use distributed cache to send common libs to all nodes&lt;/p&gt;

&lt;p&gt;JobControl: good way to express job depedencies&lt;/p&gt;

&lt;p&gt;Run canary jobs (sort, dfs write) to test functional status&lt;/p&gt;

&lt;p&gt;Upgrades are scary. This will be less true as it reaches 1.0&lt;/p&gt;

&lt;p&gt;One admin can easily carry a medium (100-node) cluster. Most activity is around commission/decommission.&lt;/p&gt;

&lt;p&gt;Try not to lose more than N nodes, where N is your replication factor. You could hit the jackpot on those being the only three replicas of some needed block.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Intro to Managed Infrastructure with Puppet</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-intro-to-managed-infrastructure-with-puppet.html"/>
   <updated>2009-06-22T12:26:47-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-intro-to-managed-infrastructure-with-puppet</id>
   <content type="html">&lt;p&gt;I’m at Velocity 2009 and very happy to see Luke Kanies presenting around Puppet. If you’re not familiar, Luke’s a hard-core sysadmin type with the typical sysadmin bent for highly automated systems management solutions which require as little maintenance as possible. If you’re looking at things like cfengine, cft, etc. then you should be looking at Puppet as well.&lt;/p&gt;

&lt;p&gt;Meanwhile, it’s been a while since I’ve live-blogged a session, so let’s see if my stream of consciousness technique still flows (or has stagnated):&lt;/p&gt;

&lt;p&gt;It’s a workshop, not a talk; to follow along &lt;tt&gt;git clone git://github.com/reductivelabs/velocity_puppet_workshop_2009.git&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;You’ll also want the slideshow gem to see the slides (which are in the git repo): &lt;tt&gt;sudo gem install slideshow&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;You also probably want to install puppet. You can get it from github, through MacPorts, but easiest is &lt;tt&gt;sudo gem install puppet&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;Seek help: #puppet on freenode, puppet-users Google group&lt;/p&gt;

&lt;p&gt;The usual problems obtain: keep everything configured correctly all the time.&lt;/p&gt;

&lt;p&gt;Puppet provides a resource abstraction layer. Do you remember which command removes gems? Is it the same as the command to remove a package (via MacPorts, rpm, yum, et al)? Why work to remember all of those.&lt;/p&gt;

&lt;p&gt;ralsh (resource abstraction layer shell) gives you direct access to the abstraction layer&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;ralsh package&lt;/tt&gt; – list all pacakges on your machine via any known package installer; responds in puppet code.&lt;/p&gt;

&lt;p&gt;(it chokes a bit if you have rpm installed via MacPorts and don’t run it as root. &lt;tt&gt;sudo ralsh package&lt;/tt&gt; is a good workaround. That’s a bug in the rpm port; it should be able to query as non-root users.)&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;ralsh user &lt;span sername=&quot;sername&quot; style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;/tt&gt; – provides you the info around that user&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;ralsh user &lt;span sername=&quot;sername&quot; style=&quot;text-decoration: underline;&quot;&gt;&amp;lt;p&amp;gt; ensure=present shell=/bin/tcsh home=/Users/&amp;lt;/p&amp;gt;
&lt;span sername=&quot;sername&quot; style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/tt&gt; – be sure the user exists. Runs idempotently. First run creates; second takes no action. Change args (shell, home) and it will change to agree. Change ‘ensure=absent’ and it’s blown away.&lt;/p&gt;

&lt;p&gt;Luke now uses ralsh for interactive administration to avoid having to remember all the various details of which args for what command, etc.&lt;/p&gt;

&lt;p&gt;The language is mostly declarative and is very simple. No loops; only recently getting conditionals from “this crazy French guy”.&lt;/p&gt;

&lt;p&gt;Aliases allow you to think of things by alias/title rather than technical name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;package { ssh: name =&amp;gt; $operating systems ? { debian =&amp;gt; &quot;ssh&quot;, openssh =&amp;gt; &quot;openssh&quot;, default =&amp;gt; &quot;sshd&quot; },ensure =&amp;gt; installed}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… and now you can just talk about the “ssh” package, abstracting you from naming strangenesses. You’ll never have a DB of all the strangenesses, so you can at least to insulate yourself.&lt;/p&gt;

&lt;p&gt;Executables: &lt;tt&gt;puppet, ralsh, puppetd, puppetmasterd, puppetca&lt;/tt&gt; (there’s more, but that’s what we’ll touch today)&lt;/p&gt;

&lt;p&gt;puppet executable allows you to fiddle and iterate via &lt;tt&gt;-e&lt;/tt&gt; and &lt;tt&gt;–noop&lt;/tt&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;puppet -e &#39;file { &quot;/tmp/foo&quot; : ensure =&amp;gt; present}&#39;notice: //File[/tmp/foo]/ensure: created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(note: puppet barfed for me here because ~/.puppet/var didn’t exist; &lt;tt&gt;mkdir -p ~/.puppet/var&lt;/tt&gt; fixed that up)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;puppet -e &#39;file { &quot;/tmp/foo&quot; : ensure =&amp;gt; absent}&#39;notice: //File[/tmp/foo]: Filebucketed to with sum d41d8cd98f00b204e9800998ecf8427enotice: //File[/tmp/foo]/ensure: removed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I was curious about the filebucketed thing, so I looked:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; ls ~/.puppet/var/clientbucket/d/4/1/d/8/c/d/9/d41d8cd98f00b204e9800998ecf8427e/contents paths
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Turns out &lt;tt&gt;contents&lt;/tt&gt; is the file itself, &lt;tt&gt;paths&lt;/tt&gt; is the path from which it was removed.&lt;/p&gt;

&lt;p&gt;With noop:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; puppet --noop -e &#39;file { &quot;/tmp/foo&quot; : ensure =&amp;gt; present}&#39;notice: //File[/tmp/foo]/ensure: is absent, should be present (noop)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should keep a single repo of your config/code (see &lt;tt&gt;http://github.com/albanpeignier/gepetto/&lt;/tt&gt;) which you can treat as an application.&lt;/p&gt;

&lt;p&gt;A puppet “module” is related config and code (classes, plugins, etc) to handle a particular function – “Why do you have this?”&lt;/p&gt;

&lt;p&gt;(jump into repo/modules)&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;puppet –configprint modulepath&lt;/tt&gt; – what modules will be loaded? (also: confdir and vardir)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;puppet --modulepath $PWD/modules -e &#39;include foo&#39;notice: //foo/File[/tmp/foo]/ensure: created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Put your nodes into the site manifest: &lt;tt&gt;manifests/site.pp&lt;/tt&gt; … for simpler sites. As site gets more complex, there are ways to hook puppet to a DB.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;default&lt;/tt&gt; node matches all unmatched nodes. You can also inherit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;node my_host inherits default { notice &quot;I&#39;m your host!&quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;puppet makes it easier to capture the many little uninteresting twiddles you forget you did in the middle of the night; you also capture them as somehting you can execute to repeat them.&lt;/p&gt;

&lt;p&gt;puppet uses ssl certs for client and server to allow identity verification. Particularly, it uses self-signed certs&lt;/p&gt;

&lt;p&gt;Running puppetmasterd in dev:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;mkdir /tmp/server&amp;gt;puppetmasterd --verbose --no-daemonize --modulepath $PWD/modules \ --confdir /tmp/server --vardir /tmp/server \ --manifest $PWD/manifests/site.pp --certdnsnames localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… and it’s all rock-and-roll from here.&lt;/p&gt;

&lt;p&gt;Luke (paraphrased): “Puppet uses SSL just like your bank uses it – so most SSL errors are not Puppet’s fault. Be sure you know what you’re doing before you twiddle your Puppet conf around SSL; most of the errors people report turn out to be their own attempted cleverness biting them.”&lt;/p&gt;

&lt;p&gt;Now use puppetd to talk to puppetmasterd to get config, etc. without knowing about anything:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; puppetd --test --confdir /tmp/server --vardir /tmp/server \ --no-daemonize --server localhostinfo: Caching catalog at /tmp/server/state/localconfig.yamlnotice: Starting catalog runinfo: Creating state file /tmp/server/state/state.yamlnotice: Finished catalog run in 0.01 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It takes about 15 seconds for code changes in the repo to propagate through puppetmasterd.&lt;/p&gt;

&lt;p&gt;… and then it’s a blur as he crammed the rest of the prezzo into the last 15 minutes, so I quit typing and just listened.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LiveBlog: Death of a Web Server</title>
   <link href="http://blog.geekdaily.org/2009/06/liveblog-death-of-a-web-server.html"/>
   <updated>2009-06-22T10:40:00-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/liveblog-death-of-a-web-server</id>
   <content type="html">&lt;p&gt;The first Velocity 2009 session for me today. Semi-useful, but seemed very .NET focused. I didn’t take a lot of notes around it for that reason.&lt;/p&gt;

&lt;p&gt;For me, most of his prezzo reduced to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Make sure your instrumentation has a light touch&lt;/li&gt;
  &lt;li&gt;Know what you’re caching&lt;/li&gt;
  &lt;li&gt;Be sure it’s getting hit (don’t cache singleton queries)&lt;/li&gt;
  &lt;li&gt;Be sure your TTL is well-set (short, perhaps sliding)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise, most of the interesting bits came from Q&amp;amp;A:&lt;/p&gt;

&lt;p&gt;Everyone has a favorite load generator; many love the appliances. They “make a webserver cry”. Mercury LoadRunner seemed like a crowdpleaser.&lt;/p&gt;

&lt;p&gt;Log playback can be challenging as you frequently don’t have all the post data, response data, etc. Hard to know how “real” it is. An alternative is to inject a transparent proxy on the front end and capture everything both ways for short periods.&lt;/p&gt;

&lt;p&gt;One fellow in the audience is using “Siege” and EC2 instances. [I think this is the &lt;a href=&quot;http://www.joedog.org/index/siege-home&quot;&gt;Siege&lt;/a&gt; he meant. I wonder why no one mentions using &lt;a href=&quot;http://tsung.erlang-projects.org/&quot;&gt;Tsung&lt;/a&gt;, formerly Tsunami, and EC2 … here’s &lt;a href=&quot;http://austinmills.name/?p=40&quot;&gt;the one decent ref&lt;/a&gt; I could find]&lt;/p&gt;

&lt;p&gt;Realisitic tests: be sure what you’re using to load it resembles your production load or it’s not very useful.&lt;/p&gt;

&lt;p&gt;All rely on scripted sessions; there’s a gap in converting log data into that script.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Got the &quot;can&#39;t activate&quot; Gem::Exception Blues? gem cleanup!</title>
   <link href="http://blog.geekdaily.org/2009/06/got-the-cant-activate-gemexception-blues-gem-cleanup.html"/>
   <updated>2009-06-14T17:52:03-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/got-the-cant-activate-gemexception-blues-gem-cleanup</id>
   <content type="html">&lt;p&gt;What to do when rubygems can’t activate a version of a gem because it’s already activated a different version of the same gem? My Google magic wasn’t good enough to find this one quickly, so I’ll happily point out &lt;a href=&quot;http://jessehu.wordpress.com/2008/07/02/troubleshooting-already-activated-activerecord-202/&quot;&gt;Jesse Hu’s nearly one-year-old post&lt;/a&gt; about the same problem, descended from &lt;a href=&quot;http://www.ruby-forum.com/topic/137509&quot;&gt;a Ruby on Rails thread on ruby-forum.com&lt;/a&gt; where, unsurprisingly, it’s &lt;a href=&quot;http://www.jeremymcanally.com/&quot;&gt;Jeremy McAnally&lt;/a&gt; who knows that &lt;tt&gt;&lt;code&gt;gem cleanup&lt;/code&gt;&lt;/tt&gt; is the way to go.&lt;/p&gt;

&lt;p&gt;Took nearly 45 minutes. Freed untold amounts of disk. Much happiness.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cucumber, Webrat ... Who Names These Things?</title>
   <link href="http://blog.geekdaily.org/2009/06/cucumber-webrat-who-names-these-things.html"/>
   <updated>2009-06-10T20:20:24-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/cucumber-webrat-who-names-these-things</id>
   <content type="html">&lt;p&gt;I’m tinkering a bit with &lt;a href=&quot;http://github.com/aslakhellesoy/cucumber/tree/master&quot;&gt;Cucumber&lt;/a&gt; and &lt;a href=&quot;http://wiki.github.com/brynary/webrat&quot;&gt;Webrat&lt;/a&gt; for &lt;a href=&quot;http://www.linkedin.com/in/jimmeyer&quot;&gt;my day job&lt;/a&gt; and am very excited by some of the prospects for our QA group’s automation efforts. Along the way I’m finding that I have to explain how all the moving parts relate to each other, so I made this diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://purp.typepad.com/.a/6a00d83452448969e2011570f33d8c970b-pi&quot;&gt;&lt;img src=&quot;http://purp.typepad.com/.a/6a00d83452448969e2011570f33d8c970b-800wi&quot; alt=&quot;Cucumber Diagram&quot; title=&quot;Cucumber Diagram&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cucumber, based on RSpec, uses Webrat to drive Selenium. Seems to make it all make sense to the folks with the questions.&lt;/p&gt;

&lt;p&gt;(and thanks, &lt;a href=&quot;http://github.com/brynary&quot;&gt;brynary&lt;/a&gt; + all the webrat contributors, &lt;a href=&quot;http://github.com/aslakhellesoy&quot;&gt;aslakhellesoy&lt;/a&gt; + all the cucumber contributors, and &lt;a href=&quot;http://github.com/dchelimsky&quot;&gt;dchelimsky&lt;/a&gt; + all the rspec contributors, and &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;the whole selenium crew&lt;/a&gt; … this is very, very cool stuff).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Generating with Ruby OFF Rails</title>
   <link href="http://blog.geekdaily.org/2009/06/generating-with-ruby-off-rails.html"/>
   <updated>2009-06-03T22:49:50-07:00</updated>
   <id>http://blog.geekdaily.org/2009/06/generating-with-ruby-off-rails</id>
   <content type="html">&lt;p&gt;I’m spending a fair amount of my time working on non-Rails Ruby projects lately and I’ve been missing the fine code generation toys in Rails. So tonight, for the fun of it and because I was hankering to play with cucumber, I hacked up the minimal set of bits that gets you script/generate in your non-Rails project.&lt;/p&gt;

&lt;p&gt;This is how we do it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; mkdir my_non_rails_proj&amp;gt; cd my_non_rails_proj&amp;gt; mkdir script config&amp;gt; touch config/environment.rb&amp;gt; cat &amp;gt; config/boot.rbRAILS_ROOT = &quot;#{File.dirname( __FILE__ )}/..&quot; unless defined?(RAILS_ROOT)RAILS_ENV = nilrequire &#39;rubygems&#39;require &#39;initializer&#39;Rails.configuration = Rails::Configuration.new^D&amp;gt; cp -p /path/to/gems/rails-2.3.2/bin/generate script/.&amp;gt; ./script/generateUsage: ./script/generate generator [options] [args]Rails Info: -v, --version Show the Rails version number and quit. -h, --help Show this help message and quit.[...]&amp;gt; ./script/generate cucumber create features/step_definitions create features/step_definitions/webrat_steps.rb create features/support create features/support/env.rb create features/support/paths.rb create lib/tasks create lib/tasks/cucumber.rake create script/cucumber&amp;gt; touch Rakefile&amp;gt; rake features[... large lack of FAIL ...]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila! Not guaranteed to work for all Rails generators, but it bootstrapped rspec and cucumber just fine, which was the point of my exercise. Someday I’ll make a generator:bootstrap rake task or gem something if I need to do it again.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Re-finding my rubyligion ...</title>
   <link href="http://blog.geekdaily.org/2009/05/refinding-my-rubyligion-.html"/>
   <updated>2009-05-03T11:06:10-07:00</updated>
   <id>http://blog.geekdaily.org/2009/05/refinding-my-rubyligion-</id>
   <content type="html">&lt;p&gt;Life’s been busy. Good, but busy. &lt;a href=&quot;http://www.linkedin.com/in/jimmeyer&quot;&gt;My gig&lt;/a&gt; at &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt;, two hours of commuting each day, plus our four person plus dog family certainly keeps me awash in things I should be doing. Thing is, ever since I stepped away from &lt;a href=&quot;http://.zdnet.com/enterprisealley/?p=188&quot;&gt;managing LinkedIn’s rubyists&lt;/a&gt;, I haven’t had much to keep me practicing my Ruby skills or tied to the Ruby community. That’s made me a bit sad.&lt;/p&gt;

&lt;p&gt;So, for the last few months, I’ve been finding spare-time, non-urgent Ruby projects on &lt;a href=&quot;http://github.com&quot;&gt;github&lt;/a&gt; to play with, &lt;a href=&quot;http://github.com/purp&quot;&gt;forking them when I’m ready to make contributions&lt;/a&gt;. The one I’m currently twiddling most is &lt;a href=&quot;http://github.com/purp/imdb/&quot;&gt;a fork of Jon Maddox’s IMDB library.&lt;/a&gt; He got the very basics in to deal with movies; I’m expanding it to handle TV series and episodes as well. In the process, I’ve added testing and some heavy refactoring, mostly to arrange the libraries in a more idiomatic fashion but also to swap out &lt;a href=&quot;http://github.com/why/hpricot&quot;&gt;Hpricot&lt;/a&gt; for &lt;a href=&quot;http://github.com/tenderlove/nokogiri&quot;&gt;Nokogiri&lt;/a&gt; (sorry, &lt;a href=&quot;http://whytheluckystiff.net/&quot;&gt;why&lt;/a&gt;, but Nokogiri has better support for complex XPath and XSLT fun that simplifies some of the code dramatically).&lt;/p&gt;

&lt;p&gt;I’m also digging into the guts of the &lt;a href=&quot;http://confluence.atlassian.com/display/CONFEXT/Confluence4r+Rails+Plugin&quot;&gt;Confluence4R&lt;/a&gt; and &lt;a href=&quot;http://docs.codehaus.org/display/JIRA4R/&quot;&gt;Jira4R&lt;/a&gt; libraries (and I am gratefully indebted to &lt;a href=&quot;http://github.com/bwalding&quot;&gt;Ben Walding&lt;/a&gt; for setting up a &lt;a href=&quot;http://github.com/bwalding/jira4r-git&quot;&gt;github mirror&lt;/a&gt; of &lt;a href=&quot;http://xircles.rubyhaus.org/projects/jira4r/repo/git/repo&quot;&gt;the Jira4R main git repo&lt;/a&gt; at &lt;a href=&quot;http://codehaus.org/&quot;&gt;Codehaus&lt;/a&gt;); for them, I’m mostly adding spec code to demonstrate what I think is true as I’m learning. Jira4R is driving me a bit nuts – I’m having a love/hate relationship with its &lt;a href=&quot;http://dev.ctor.org/soap4r/wiki/Wsdl2Ruby&quot;&gt;wsdl2ruby&lt;/a&gt; underpinnings. Slowly I learn.&lt;/p&gt;

&lt;p&gt;But, then, that’s the point, isn’t it?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Seven Ways To Approach An Issue</title>
   <link href="http://blog.geekdaily.org/2009/01/seven-ways-to-approach-an-issue.html"/>
   <updated>2009-01-29T12:07:40-08:00</updated>
   <id>http://blog.geekdaily.org/2009/01/seven-ways-to-approach-an-issue</id>
   <content type="html">&lt;p&gt;I was chatting about this with someone yesterday and made a total hash of recounting it, so I thought I’d do a quick blog post to clarify my thoughts.&lt;/p&gt;

&lt;p&gt;This requires that you understand the Circle of Concern/Circle of Influence concept from &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Seven_Habits_of_Highly_Effective_People&quot;&gt;The Seven Habits of Highly Effective People&lt;/a&gt;. There’s a good summary of these concepts at &lt;a href=&quot;http://www.cut-the-knot.org/manifesto/ctk.shtml&quot;&gt;Cut The Knot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now imagine that inside your circle of influence is a smaller circle of responsibility. That’s the things you’re directly responsible for doing; the area outside of responsibility and inside of influence is what you can talk others into doing. ;]&lt;/p&gt;

&lt;p&gt;With that in mind, here’s a good framework (from a USN SSBN commander by way of Covey’s book, “The 8th Habit”) for how to approach an issue which you believe you know how to resolve depending on your level of influence and/or responsibility:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stand Mute&lt;/strong&gt;&lt;br /&gt;
If it’s completely outside of your circle of influence, stand mute. There’s no constructive course you can pursue. Instead, consider whether or not you’re genuinely concerned; if you are, channel your energies into expanding your circle of influence to include issues like this in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Ask Questions&lt;/strong&gt;&lt;br /&gt;
If it’s just outside the edge of your circle of influence (inside or outside), ask questions which tend to confirm your assumptions about the issue. You’ll learn things, you may provide focus and insight, and you might get invited to the solution. You’ll likely expand your influence in the direction of the issue at hand … as long as your questions are pertinent and well thought out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Offer A Solution&lt;/strong&gt;&lt;br /&gt;
If it’s just inside the edge of your circle of influence, propose a solution. This isn’t a lot different than asking questions as noted above; rather than putting your solution up bit by bit, you’re presenting it as a holistic thing, complete with reasoning. It’s really just a change from participant to potential thought leader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. State Intent&lt;/strong&gt;&lt;br /&gt;
If the issue lies just outside your circle of responsibility but well within your circle of influence and you believe that you can take or coordinate positive action, make a plan and present it as your intent to the person or people who have direct responsibility for the issue. This provides them insight into your proposed actions complete with a plan and the opportunity to question underlying assumptions, impact of your proposed actions, etc. They might put forth an alternative proposal, suggest modifications to your plan, or instantly agree and ask you to carry out your intent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Take Action And Report Immediately&lt;/strong&gt;&lt;br /&gt;
If the issue’s at the outside edge of your circle of responsibility, you have a solution which you firmly believe in, and there’s an impact to others, take action and report that action immediately. This allows them to see the impact of your action, judge the effectiveness of your solution, and will increase your circle of influence and responsibility over time as you stack up more and more successes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Take Action and Report Periodically&lt;/strong&gt;&lt;br /&gt;
If the issue’s clearly inside your circle of responsibility and there’s not an immediate impact to others, take action and report that action periodically (e.g. at a weekly checkin or in a weekly summary blog post, hint hint ;-) . This again exposes the impact of your action and, with continued successes, will grow your influence and responsibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Take Action&lt;/strong&gt;&lt;br /&gt;
For those things clearly in the center of your circle of responsibility, just do it. You’re good at it, we already know it (that’s why we made you responsible for it =), and we trust you completely. Go!&lt;/p&gt;

&lt;p&gt;_ &lt;strong&gt;How do you know where the boundaries of your influence and responsibility lie?&lt;/strong&gt; _ Your responsibilities should be clear (and if they’re not, you need to sit your boss down and make that so). As to influence, that’s a bit of an art and a bit of intuition; mostly you judge it by thinking about who’s coming to you with what issues, questions, and concerns.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Values Driving My Value-Driven Life</title>
   <link href="http://blog.geekdaily.org/2008/09/the-values-driv.html"/>
   <updated>2008-09-29T17:04:36-07:00</updated>
   <id>http://blog.geekdaily.org/2008/09/the-values-driv</id>
   <content type="html">&lt;p&gt;I had the great good fortune to attend &lt;a href=&quot;http://www.franklincovey.com/&quot;&gt;FranklinCovey’s&lt;/a&gt; &lt;a href=&quot;http://www.franklincovey.com/tc/solutions/time-management-solutions/focus-achieving-your-highest-priorities&quot;&gt;FOCUS training&lt;/a&gt; with several &lt;a href=&quot;http://www.linkedin.com/in/jerryluk&quot;&gt;members&lt;/a&gt; &lt;a href=&quot;http://www.linkedin.com/in/ikailan&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://www.linkedin.com/in/braitz&quot;&gt;my&lt;/a&gt; &lt;a href=&quot;http://www.linkedin.com/in/christianniles&quot;&gt;team&lt;/a&gt; last week. One of the exercises they give you is to select 4-9 core values and write positive clarifying statements for each. I just finished up and, since one of my statements is “I openly share my values and invite discussion,” here they are:&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;These are the values which drive my life. On my best days, this is who I am; on my worst, they still mostly apply (I hope …)&lt;/p&gt;

&lt;h3 id=&quot;passion&quot;&gt;Passion&lt;/h3&gt;

&lt;p&gt;I actively seek challenges that excite me.&lt;/p&gt;

&lt;p&gt;I convey my excitement openly, genuinely, and infectuously.&lt;/p&gt;

&lt;p&gt;I urge others to identify their values, tap into their passions, and get going!&lt;/p&gt;

&lt;h3 id=&quot;respect&quot;&gt;Respect&lt;/h3&gt;

&lt;p&gt;I consider the circumstances of others in my dealings with them.&lt;/p&gt;

&lt;p&gt;I assume the best and most constructive motivations on the part of others.&lt;/p&gt;

&lt;p&gt;I demonstrate my ignorance of others’ circumstances by asking positive, open-ended questions and listening carefully to the answers.&lt;/p&gt;

&lt;h3 id=&quot;integrity&quot;&gt;Integrity&lt;/h3&gt;

&lt;p&gt;I live by consistent values in a transparent manner, without regard of what’s at stake or who’s watching.&lt;/p&gt;

&lt;p&gt;I make decisions based on my values and what’s right for the situation and people involved, not what’s most personally beneficial or most expedient.&lt;/p&gt;

&lt;h3 id=&quot;candor&quot;&gt;Candor&lt;/h3&gt;

&lt;p&gt;I share my values openly and invite discussion of them.&lt;/p&gt;

&lt;p&gt;I express compliments and concerns freely and frequently, in ways that will be heard and is not hurtful to others.&lt;/p&gt;

&lt;p&gt;I make a point of complimenting the good work of others. I share compliments I’ve heard with the subject of those compliments.&lt;/p&gt;

&lt;p&gt;I share concerns in ways which make them actionable for others.&lt;/p&gt;

&lt;p&gt;I hold myself and others accountable for mistakes. When appropriate, I fully acknowledge my role in bad choices and work to make things right.&lt;/p&gt;

&lt;h3 id=&quot;leadership&quot;&gt;Leadership&lt;/h3&gt;

&lt;p&gt;I step into unowned problems and help find them a home.&lt;/p&gt;

&lt;p&gt;I constantly seek to improve my vision of the best possible future and articulate it to others in a way which allows them to act independently toward that end.&lt;/p&gt;

&lt;p&gt;I look for opportunities to mentor others in growing in line with their personal values.&lt;/p&gt;

&lt;p&gt;I help others engage in long-term critical thinking and help them recognize that they are fully empowered to act as a force for positive change.&lt;/p&gt;

&lt;h3 id=&quot;compassion&quot;&gt;Compassion&lt;/h3&gt;

&lt;p&gt;I take opportunities to do small kindnesses and good deeds whenever I can.&lt;/p&gt;

&lt;p&gt;I relieve pain wherever possible.&lt;/p&gt;

&lt;p&gt;I seek first to understand.&lt;/p&gt;

&lt;h3 id=&quot;courage&quot;&gt;Courage&lt;/h3&gt;

&lt;p&gt;I do not allow concerns about my personal well-being to prevent me from addressing a problem.&lt;/p&gt;

&lt;p&gt;I take positive, direct action even when I dread the work or the outcome.&lt;/p&gt;

&lt;p&gt;I seek creative solutions to intimidating problems, pursuing the most positive outcome for all involved.&lt;/p&gt;

&lt;h3 id=&quot;reliability&quot;&gt;Reliability&lt;/h3&gt;

&lt;p&gt;I meet my commitments. I do not take on commitments which I know I can’t meet.&lt;/p&gt;

&lt;p&gt;I manage expectations openly and clearly.&lt;/p&gt;

&lt;h3 id=&quot;humor&quot;&gt;Humor&lt;/h3&gt;

&lt;p&gt;I use humor to defuse tension and relieve pain.&lt;/p&gt;

&lt;p&gt;I always look for and share the humorous aspects of challenging or grim situations.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Mozilla&#39;s TraceMonkey Avoids Trampling</title>
   <link href="http://blog.geekdaily.org/2008/09/mozillas-tracem.html"/>
   <updated>2008-09-03T10:16:41-07:00</updated>
   <id>http://blog.geekdaily.org/2008/09/mozillas-tracem</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://wiki.mozilla.org/JavaScript:TraceMonkey&quot;&gt;Mozilla’s TraceMonkey JIT Javascript compiler&lt;/a&gt; climbed down from the trees last week only to be somewhat lost in the thundering herd of &lt;a href=&quot;http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html&quot;&gt;Google’s announcement&lt;/a&gt; of &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;the Chrome browser&lt;/a&gt; and its accompanying &lt;a href=&quot;http://code.google.com/apis/v8/intro.html&quot;&gt;V8 Javascript Virtual Machine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Based on Andreas Gal’s 2006 &lt;a href=&quot;http://www.usenix.org/events/vee06/full_papers/p144-gal.pdf&quot;&gt;HotPathVM paper&lt;/a&gt; [PDF, 10pp] as well as &lt;a href=&quot;http://base.google.com/base_media?q=hand1017890191470242229&amp;amp;size=8&quot;&gt;his doctoral dissertation on bytecode compilation in VMs&lt;/a&gt; [zipped PDF, 138pp], &lt;a href=&quot;http://weblogs.mozillazine.org/roadmap/archives/2008/09/tracemonkey_update.html&quot;&gt;TraceMonkey is offering speedups to rival those of the V8 JsVM&lt;/a&gt;. This is very worthy of note as both sides are open source and so can borrow learning and code from each other. Competition is good; open competition is even gooder. ;]&lt;/p&gt;

&lt;p&gt;I’m not educated enough to offer in-depth commentary, so here’s a quick collection of the announcements and discussions from those who are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://shaver.off.net/diary/2008/08/22/the-birth-of-a-faster-monkey/&quot;&gt;Mike Shaver’s original TraceMonkey announcement&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://weblogs.mozillazine.org/roadmap/archives/2008/08/tracemonkey_javascript_lightsp.html&quot;&gt;Brendan Eich’s announcement&lt;/a&gt;, complete with benchmarks and metrics galore&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://andreasgal.com/2008/08/22/tracing-the-web/&quot;&gt;Andreas Gal’s discussion of the underpinnings&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.bailopan.net/blog/?p=84&quot;&gt;David Anderson’s in-depth discussion&lt;/a&gt; of what trace-based compiling is&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2008/09/jresig-tracemonkey&quot;&gt;InfoQ’s interview with John Resig&lt;/a&gt;, jQuery creator and Mozilla’s Javascript Evangelist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m starting to wonder if Chrome’s accidental release wasn’t as much a mailroom mistake as it was a tactic to not be an also-ran.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Google Chrome: The Next Big Thing?</title>
   <link href="http://blog.geekdaily.org/2008/09/google-chrome-t.html"/>
   <updated>2008-09-01T16:13:04-07:00</updated>
   <id>http://blog.geekdaily.org/2008/09/google-chrome-t</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.linkedin.com/in/mariosundar&quot;&gt;A friend at work&lt;/a&gt; recommended I have a look at &lt;a href=&quot;http://blogoscoped.com/google-chrome/&quot;&gt;Google’s explanation of Google Chrome as illustrated by Scott McCloud&lt;/a&gt; [via &lt;a href=&quot;http://blogoscoped.com/archive/2008-09-01-n47.html&quot;&gt;Google Blogoscoped&lt;/a&gt; where they were kind enough to scan the comic they received] and I couldn’t wait. You see, &lt;a href=&quot;http://scottmccloud.com/&quot;&gt;Scott McCloud&lt;/a&gt; is the author of two of my favorite books, “ &lt;a href=&quot;www.amazon.com/exec/obidos/ASIN/006097625X/geekdaily-20&quot;&gt;Understanding Comics&lt;/a&gt;” and “ &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0060953500/geekdaily-20&quot;&gt;Reinventing Comics&lt;/a&gt;” … both must-reads if you’re interested in comic history, the vocabulary of comics, or even just in thinking about how we communicate and interact with things on pages.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://books.google.com/books?id=8UsqHohwwVYC&amp;amp;printsec=frontcover&quot;&gt;The Google Chrome strip&lt;/a&gt; [via &lt;a href=&quot;http://books.google.com/&quot;&gt;Google Books&lt;/a&gt;] is an engaging 38 pages which lightly explains what they’re trying to accomplish and how they’ve gone about it so far. Amusingly, it seems the comic went out a bit earlier than planned, but &lt;a href=&quot;http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html&quot;&gt;Google is taking things in stride, with grace and good humor&lt;/a&gt;, showing the rest of us how it should be done.&lt;/p&gt;

&lt;p&gt;Some of the more interesting choices:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogoscoped.com/google-chrome/12&quot;&gt;Webkit-based&lt;/a&gt;:&lt;/strong&gt; Google Chrome is based on the &lt;a href=&quot;http://webkit.org/&quot;&gt;Webkit&lt;/a&gt; &lt;a href=&quot;http://webkit.org/&quot;&gt;browser engine&lt;/a&gt;, which is also used by Safari, Android, and a number of other mobile device browsers. Google’s developers liked it because it’s fast, memory-efficient, embeddable, easy to adopt, and generally keeps things simple.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogoscoped.com/google-chrome/13&quot;&gt;The V8 Javascript Virtual Machine&lt;/a&gt;:&lt;/strong&gt; written by “the V8 team in Denmark” specifically to address the shortcomings of previous JsVMs in a number of ways, including &lt;a href=&quot;http://blogoscoped.com/google-chrome/15&quot;&gt;compilation to machine language&lt;/a&gt; and &lt;a href=&quot;http://blogoscoped.com/google-chrome/16&quot;&gt;real garbage collection&lt;/a&gt;. I’m pretty excited about this, particularly that &lt;a href=&quot;http://blogoscoped.com/google-chrome/17&quot;&gt;they’ve made V8 browser-independent&lt;/a&gt;.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogoscoped.com/google-chrome/4&quot;&gt;One process per tab&lt;/a&gt;:&lt;/strong&gt; They’ve implemented this as a protection from crashy apps as well as a way to clearly reveal what’s chewing up resources in your browser. This concept also seems to be foundational to their &lt;a href=&quot;http://blogoscoped.com/google-chrome/22&quot;&gt;anonytabs&lt;/a&gt; and &lt;a href=&quot;http://blogoscoped.com/google-chrome/23&quot;&gt;anti-popup measures&lt;/a&gt;; it’s definitely &lt;a href=&quot;http://blogoscoped.com/google-chrome/26&quot;&gt;the basis of their sandbox security measures&lt;/a&gt;.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogoscoped.com/google-chrome/21&quot;&gt;The New Tab Experience&lt;/a&gt;:&lt;/strong&gt; When you open a new tab in Google Chrome, they assume you want to go somewhere rather than see your default page (or a blank page, which I’ve used for years to avoid unnecessary page loads). A nice UX touch that shows the depth to which they’re thinking about this.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogoscoped.com/google-chrome/34&quot;&gt;Gears Inside&lt;/a&gt;:&lt;/strong&gt; It’s no surprise that the Google Chrome browser builds in &lt;a href=&quot;http://gears.google.com/&quot;&gt;Google Gears&lt;/a&gt;, which has been aiming to bring the Web 2.0 experience even when offline for over a year now. I couldn’t find any estimates of how widely installed Gears has become in the past fourteen months, but I’d guess it’s low at present despite &lt;a href=&quot;http://news.cnet.com/8301-10784_3-9954010-7.html?tag=mncol;title&quot;&gt;MySpace&lt;/a&gt; and &lt;a href=&quot;http://news.cnet.com/8301-10784_3-9885341-7.html?tag=mncol;title&quot;&gt;Windows Mobile&lt;/a&gt; having jumped on board in the past six months.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There’s lots of other good bits in the strip, like the &lt;a href=&quot;http://blogoscoped.com/google-chrome/33&quot;&gt;anti-phishing measures page&lt;/a&gt; (which makes an analogy between malware and dog poop which couldn’t have been made nearly so excellently in any other medium, imho) and a &lt;a href=&quot;http://blogoscoped.com/google-chrome/36&quot;&gt;late appearance by Chris DiBona&lt;/a&gt; to sum up the open-sourcedness of it all.&lt;/p&gt;

&lt;p&gt;I have some minor concerns about the extra resource consumption and possible need for interprocess communication (IPC) in their model. However, this is probably because my last significant experience with IPC dates back almost a decade to SGIs running IRIX. It was my experience then that IPC is hard to implement cleanly as well as the most frequent source of race conditions. It’s likely times have changed since then. I hope.&lt;/p&gt;

&lt;p&gt;The biggest disappointment? When the beta is officially released tomorrow, it’ll be Windows only for now. The &lt;a href=&quot;http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html&quot;&gt;official blog post&lt;/a&gt; notes that they’re working hard on versions for MacOS and Linux, too (and I suspect they would have liked those to be available on launch day), so when the &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Google Chrome project page&lt;/a&gt; lights up tomorrow, it won’t be for the rest of us quite yet.&lt;/p&gt;

&lt;p&gt;But I’ll be eagerly watching, just the same. You don’t see a new browser born every day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update: Paul Thurrott’s &lt;a href=&quot;http://community.winsupersite.com/blogs/paul/archive/2008/09/01/first-google-chrome-screenshot.aspx&quot;&gt;WinSuperSite has screenshots purported to be Google Chrome&lt;/a&gt; [via &lt;a href=&quot;http://blogoscoped.com/forum/139142.html#id139287&quot;&gt;Blogoscoped&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Reflections on moderated blog comments</title>
   <link href="http://blog.geekdaily.org/2008/08/reflections-on.html"/>
   <updated>2008-08-31T09:35:00-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/reflections-on</id>
   <content type="html">&lt;p&gt;Ran into another blog today with misleading, subjective assertions about topical content and which moderates all comments. It’s made me realize that, if you intend to blog about current events with any integrity, you absolutely must unmoderate comments and be ready to fight the spam. Otherwise, you’ve risk starting a monolog, not a conversation, and &lt;a href=&quot;http://www.google.com/search?q=blog+monolog+dialog&quot;&gt;the web has enough monologs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At best, the practice of moderating comments on opinion pieces is ill-advised and inconsiderate; at worst, it’s self-serving dishonesty — you should just turn off comments entirely so we all know it’s really a monolog.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Reports of the Business Card&#39;s Death Are Greatly Exaggerated, or why bzCards != biz cards</title>
   <link href="http://blog.geekdaily.org/2008/08/reports-of-the.html"/>
   <updated>2008-08-20T17:40:02-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/reports-of-the</id>
   <content type="html">&lt;p&gt;Caught the article &lt;a href=&quot;http://venturebeat.com/2008/08/19/rmbr-launches-a-mobile-app-to-get-rid-of-business-cards/&quot;&gt;“rmbr launches mobile app to get rid of business cards”&lt;/a&gt; on VentureBeat which covers the announcement &lt;a href=&quot;http://rmbrme.com&quot;&gt;rmbrME&lt;/a&gt;, the new electronic connection tool from &lt;a href=&quot;http://blog.chroniql.com/&quot;&gt;rmbr&lt;/a&gt;. (note: the &lt;a href=&quot;http://rmbr.com/&quot;&gt;rmbr.com&lt;/a&gt; site, which &lt;a href=&quot;http://www.readwriteweb.com/archives/rmbr_using_funware_to_organize_photos.php&quot;&gt;launched as a photo organizing site&lt;/a&gt;, currently redirects to &lt;a href=&quot;http://rmbrme.com/&quot;&gt;rmbrme.com&lt;/a&gt;) The general idea is to trade vCards over email, IM, SMS, etc. and get rid of those pesky piles of pasteboard. If the ease of use isn’t incentive enough, they’re mixing in the &lt;a href=&quot;http://blogs.electricsheepcompany.com/swords/2008/02/18/worlds-in-motion-funware-is-the-future-of-our-virtual-world/&quot;&gt;funware&lt;/a&gt; &lt;a href=&quot;http://venturebeat.com/2008/05/09/funwares-threat-to-the-traditional-video-game-industry/&quot;&gt;idea&lt;/a&gt; via contests and leaderboards.&lt;/p&gt;

&lt;p&gt;You may have guessed by now, but I think they’ve got the beginnings of a good idea and a poor implementation. I’m particularly amused by rmbr founder Gabe Zichermann’s assertion that the business card’s time has come and gone. Here’s why I think he’s wrong:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Business Cards Are Infinitely Customizable:&lt;/strong&gt; I can &lt;a href=&quot;http://www.motherjones.com/news/outfront/1997/07/card.gif&quot;&gt;quickly extend or personalize the information provided by my business card&lt;/a&gt;*. I can also &lt;a href=&quot;http://www.mydetails.biz/images/cardscrib.jpg&quot;&gt;correct bad information on the spot*&lt;/a&gt;, e.g. my title’s changed, or I have a new phone number. And the only device required is any writing instrument.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Business Cards Don’t Require Information Exchange:&lt;/strong&gt; I don’t have to ask you to give me contact info in order to give you my contact info. This preserves a level of anonymity which should not be undervalued. I wouldn’t give contact info to everyone I’ve accepted a business card from; I’ve later chosen to contact some of those people.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Business Cards Are Trivial To Distribute:&lt;/strong&gt; I can hand you a business card in just a few seconds, less if I’m already handing them out. I can place a stack of business cards in a tray on a counter to be taken by those interested without having to make any contact at all. I can drop them in the fishbowl of &lt;a href=&quot;http://www.wilsonbusinessalliance.com/profiles.php?id=sweetmarias&quot;&gt;an excellent bakery and cafe in Wilson, NC&lt;/a&gt; in hopes of winning some goodies for the next time I’m there. I can hand it to &lt;a href=&quot;http://farm2.static.flickr.com/1085/558728700_7e3a14344d.jpg?v=0&quot;&gt;someone who doesn’t have a device&lt;/a&gt;. These examples all demonstrate the business card’s continued practical utility.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Business Cards Are Static:&lt;/strong&gt; They provide a clearly limited, time-sensitive set of information about me. If I change jobs, companies, phone numbers, email, or what-have-you, your data isn’t current anymore. Effectively, the data ages and, in doing so, provides me some additional privacy with regards to those people with whom I’ve not formed a more permanent relationship than the original business card exchange (which, if I have, I likely want to provide a more dynamic link to my contact info). &lt;em&gt;This is also true of a vCard exchange, but unclear with regards to bzCards.&lt;/em&gt; In my opinion, the lack of an analog to this aging process is a flaw in social networks which is becoming evident; it’s currently all or nothing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That said, I applaud the attempt toward a more dynamic contacts list and easier connections. There are some pieces still missing that, imho, are being overlooked by folks headed in that direction, but they’ll come soon enough. And I’m utterly underwhelmed by the idea of competitions to send out the most business cards. It’s quality, folks, not quantity.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* The business card with hand-written phone number comes from a &lt;a href=&quot;http://www.motherjones.com/news/outfront/1997/07/eisenstadt.html&quot;&gt;1997 Mother Jones article&lt;/a&gt;. Ironically, that lovely corrected business card image is from &lt;a href=&quot;http://www.mydetails.biz/why.asp&quot;&gt;the “Why Use It?” page of MyDetails.biz&lt;/a&gt;, another digital business card replacement.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cuzillion: &#39;cuz there&#39;s a zillion pages to check</title>
   <link href="http://blog.geekdaily.org/2008/08/cuzillion-becau.html"/>
   <updated>2008-08-12T23:26:40-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/cuzillion-becau</id>
   <content type="html">&lt;p&gt;Once in a while I get lucky. Most recently, this means that I was asked to write &lt;a href=&quot;http://blog.linkedin.com/blog/2008/08/tech-talk-steve.html&quot;&gt;a blog post for LinkedIn&lt;/a&gt;about the tech talk &lt;a href=&quot;http://stevesouders.com/&quot;&gt;Steve Souders&lt;/a&gt; gave for us last week: Even Faster Web Sites. Unfortunately, in the interests of brevity, I couldn’t dive on something incidental to the talk which fascinated me: &lt;a href=&quot;http://stevesouders.com/cuzillion/&quot;&gt;Cuzillion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://stevesouders.com/cuzillion/&quot;&gt;Cuzillion&lt;/a&gt; is one of those headslappers Steve seems to produce on a regular basis; it’s a tool to model web pages and experiment with load order and methodology in order to better understand performance bottlenecks and find your way to a solution. He uses it to illustrate examples in his talks of late (as he did in &lt;a href=&quot;http://stevesouders.com/docs/linkedin-2080805.ppt&quot;&gt;the slides for his talk at LinkedIn&lt;/a&gt;), which highlights another feature: the ability to share a precise example among the team seeking a solution. It fascinates me because it’s so straightforward and so obviously useful, yet you can twiddle it to great depth, willfully violating &lt;a href=&quot;http://developer.yahoo.com/performance/&quot;&gt;all the well-known best practices&lt;/a&gt;, and see clearly why that’s not a good idea. It’s like checkers: you get the basics instantly, and yet there’s so much more there.&lt;/p&gt;

&lt;p&gt;After playing with it for a while, it occurred to me that I very much want to say, “Cuzillion, go model the way this web page loads so I can play with it.” When &lt;a href=&quot;http://www.stevesouders.com/blog/2008/04/25/cuzillion/&quot;&gt;Steve announced Cuzillion&lt;/a&gt;, he mentioned that he intends to set up a Google Code repo for Cuzillion; when he gets around to that, it might be fun to spend a little time adding that feature.&lt;/p&gt;

&lt;p&gt;Check it.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Stupidity In The Name Of Security</title>
   <link href="http://blog.geekdaily.org/2008/08/stupidity-in-th.html"/>
   <updated>2008-08-12T12:34:37-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/stupidity-in-th</id>
   <content type="html">&lt;p&gt;Just created an account with WordPress.com and find it amusing that they show a password strength meter to encourage your to &lt;a href=&quot;http://www.schneier.com/blog/archives/2007/01/choosing_secure.html&quot;&gt;choose a cryptographically strong password&lt;/a&gt; (which is good), then &lt;strong&gt;display your password in large type that’s clearly readable from 12-15 feet away on the unsecured activation page.&lt;/strong&gt; Oh, and they email it to you, too.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.schneier.com/blog/archives/2006/06/schneier_asks_t.html&quot;&gt;Bruce Schneier&lt;/a&gt; would be amused.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Old &amp; Rusty to Shiny &amp; New, Part 1</title>
   <link href="http://blog.geekdaily.org/2008/08/old-rusty-to-sh.html"/>
   <updated>2008-08-07T09:52:17-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/old-rusty-to-sh</id>
   <content type="html">&lt;p&gt;I’m feeling particularly masochistic today, so I’m going to tackle a project I’ve been putting off for a while: moving a Rails 1.2.6 app in our subversion repository into &lt;a href=&quot;http://github.com/&quot;&gt;github&lt;/a&gt;, then updating it to Rails 2.1.&lt;/p&gt;

&lt;p&gt;The first part, getting from svn to github, should be relatively painless according to github’s &lt;a href=&quot;http://github.com/guides/import-from-subversion&quot;&gt;“Importing From SVN” guide&lt;/a&gt;. It is, as long as you have already created your github repo (I hadn’t) and already have git-svn installed (I didn’t). So here’s the expanded tutorial&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://github.com/repositories/new&quot;&gt;Create your github repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Be sure you have git-svn installed.&lt;/strong&gt; I didn’t, so here’s what I had to do:&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;sudo port uninstall git-core&lt;br /&gt;
sudo port install git-core +svn&lt;/p&gt;

&lt;p&gt;I had a bit of trouble with the serf port breaking during build time:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;---&amp;gt;  Building serf with target allError: Target org.macports.build returned: shell command &quot; cd &quot;/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_www_serf/work/serf-0.2.0&quot; &amp;amp;&amp;amp; make all &quot; returned error 2Command output: /opt/local/share/apr-1/build/libtool --silent --mode=compile /usr/bin/gcc-4.0 -O2 -I/opt/local/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp -I. -I/opt/local/include/apr-1 -I/opt/local/include/apr-1  -c -o buckets/aggregate_buckets.lo buckets/aggregate_buckets.c &amp;amp;&amp;amp; touch buckets/aggregate_buckets.lolibtool: compile: unable to infer tagged configurationlibtool: compile: specify a tag with `--tag&#39;make: *** [buckets/aggregate_buckets.lo] Error 1Error: The following dependencies failed to build: p5-svn-simple subversion-perlbindings serf p5-term-readkeyError: Status 1 encountered during processing.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… so I got all medieval on it, building it manually, then finishing the port install:&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>BarCamp RDU: Fun and Done</title>
   <link href="http://blog.geekdaily.org/2008/08/barcamp-rdu-fun.html"/>
   <updated>2008-08-03T15:51:37-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/barcamp-rdu-fun</id>
   <content type="html">&lt;p&gt;Was a lot of fun. Did the Werewolf and Value-Driven Life sessions and got more interest in both than I expected. Also pitched in on &lt;a href=&quot;http://blog.nicholasnapp.com/&quot;&gt;Nick Napp’s&lt;/a&gt; “10 Ways To Accelerate The Failure Of A Startup” which drew a big crowd and was good, but that was because Nick did all the work and his usual consummately excellent job presenting.&lt;/p&gt;

&lt;p&gt;I’ll be sad to miss it next year; we know our family vacation will be earlier and in Orlando to celebrate our 10th anniversary with the one that brought us together, Mickey Mouse. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>BarCamp RDU in 8 hours!</title>
   <link href="http://blog.geekdaily.org/2008/08/barcamp-rdu-in.html"/>
   <updated>2008-08-01T21:39:25-07:00</updated>
   <id>http://blog.geekdaily.org/2008/08/barcamp-rdu-in</id>
   <content type="html">&lt;p&gt;Was checking in to get the details on where and when to be there and, courtesy of a semi-random chat with &lt;a href=&quot;http://evan.tiggerpalace.com/&quot;&gt;my friend Evan&lt;/a&gt;, decided to propose not one, but &lt;strong&gt;two&lt;/strong&gt; non-technical sessions tomorrow:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Werewolf 101: Rending Your Friends For Fun And Profit!&lt;/li&gt;
  &lt;li&gt;Taking a Leap of Faith: Letting Your Values Run Your Life, A Story in Three Acts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And then, being the nervous sort, I had to write up some fast notes on what I’ll say in either.&lt;/p&gt;

&lt;p&gt;The second one surprised me a bit and, frankly, I’ll be surprised if anyone bites on it. But it’s a topic which I’ve studied to considerable depth and about which I’m passionate … and sometimes people actually want some ideas on how to think about their lives and consider what they want to make of them.&lt;/p&gt;

&lt;p&gt;Six hours to sleep, up and shower, and an hour to drive. Wheee!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(p.s. yes, the WW101 class is really just a ploy to play some &lt;a href=&quot;http://en.wikipedia.org/wiki/Werewolf_(game)&quot;&gt;Werewolf&lt;/a&gt;. And maybe get a game together for that night. Would be fun to go back to the &lt;a href=&quot;http://www.velvetcloakinn.com/&quot;&gt;Velvet Cloak Inn&lt;/a&gt; …)&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Let Our Congress Tweet? Who&#39;s Stopping Them?</title>
   <link href="http://blog.geekdaily.org/2008/07/let-our-congr-1.html"/>
   <updated>2008-07-14T22:19:35-07:00</updated>
   <id>http://blog.geekdaily.org/2008/07/let-our-congr-1</id>
   <content type="html">&lt;p&gt;A quick follow-up: When &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/10/let-our-congress-tweet&quot;&gt;Ellen Miller posted&lt;/a&gt; to further promote Sunlight Foundation’s Let Our Congress Tweet” petition, she made this statement:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Under the current system, members of Congress are forced to break rules to use new technologies and services to do what their constituents ask of them: connect, listen and be held accountable. So, that YouTube video you saw on a lawmaker’s Web site? Illegal! […]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She also linked to the “Unsolicited Mass Communications Restrictions” section of the House Administration Committee’s Member Handbook, presumably indicating that this was the section that supported her statement.&lt;/p&gt;

&lt;p&gt;I read the section (and the bulk of the rest of the handbook for good measure. So &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/10/let-our-congress-tweet/#comment-401&quot;&gt;I asked for clarification&lt;/a&gt; in the comments of her post. What I got was &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/10/let-our-congress-tweet/#comment-403&quot;&gt;a response from John Wonderlich&lt;/a&gt;, who authored &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/08/member-web-use-reconsidered/&quot;&gt;the original post&lt;/a&gt;, saying in essence that the rules are unclear and they’re seeking clarity. Much softer stance, it seems, than the original hard line that our Representatives were being forced to break the law.&lt;/p&gt;

&lt;p&gt;I tried to respond, but it seems the blog isn’t accepting further comments from me. Here’s the comment that wasn’t:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fair enough. I share your interest in transparency. Having spent the time to read these rules, I also heartily endorse any efforts to update and clarify them.&lt;/p&gt;

  &lt;p&gt;That said, I take issue with the sensationalist nature of the copy on http://letourcongresstweet.org/ as well as the assertion that it’s outright illegal rather than unclear. Furthering your cause by scaring people with incomplete information and vague possibilities demeans your mission. The means count as much as the end.&lt;/p&gt;

  &lt;p&gt;I’d also assert that transparency is more about being able to reach in for information than those inside being able to push information out. A commenter at MetaFilter summarizes it well (http://www.metafilter.com/73194/Let-Our-Congress-Tweet#2178791):&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;“How is Yet Another One Way Communication Medium “sunlight”? Sunlight is when I can see what they are doing, even when they don’t want me to. It’s not a press release.”&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;Good luck.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Disappointing that they had to resort to unclarity to fix the clarity thing.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Using mysqldump with subqueries</title>
   <link href="http://blog.geekdaily.org/2008/07/using-mysqldump.html"/>
   <updated>2008-07-14T10:27:46-07:00</updated>
   <id>http://blog.geekdaily.org/2008/07/using-mysqldump</id>
   <content type="html">&lt;p&gt;I needed to dump some very specific portions of a large MySQL database; some of the data were second-degree relations (aka a Rails has-many-through). mysqldump won’t allow a join in the –where clause, but it will allow a subquery, so I ended up with something that looked a bit like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mysqldump --lock-all-tables --where &#39;id in (select user_id from memberships where site_id = 123)&#39; my_database users
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Handy, that. Thanks to &lt;a href=&quot;http://forums.b2evolution.net/viewtopic.php?p=77342&amp;amp;sid=9e61c6edf5057feeceeb86be6c6424f3#77342&quot;&gt;Austriaco who was doing this in a similar context&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Let Our Congress Tweet? You&#39;ve been had.</title>
   <link href="http://blog.geekdaily.org/2008/07/let-our-congres.html"/>
   <updated>2008-07-09T23:54:08-07:00</updated>
   <id>http://blog.geekdaily.org/2008/07/let-our-congres</id>
   <content type="html">&lt;p&gt;If you’re like me, some large number of the people you follow on Twitter have tweeted something like this today:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Congress, change the rules. Talk to us on our social networks. http://LetOurCongressTweet.org Let our Congress Tweet! #LOCT08&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may be tempted to join in. It seems like a noble cause, and whoever’s trying to keep Congress from tweeting must be evil, bad, and wrong, wrong, wrong. Right?&lt;/p&gt;

&lt;p&gt;Maybe not.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://friendfeed.com/johnwonderlich&quot;&gt;John Wonderlich&lt;/a&gt; of &lt;a href=&quot;http://www.sunlightfoundation.com/&quot;&gt;The Sunlight Foundation&lt;/a&gt; — an organization which professes the admirable goal of, among other things, more transparency in government — published a blog post today titled, &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/08/member-web-use-reconsidered/&quot;&gt;“Member Use of the Web Reconsidered”&lt;/a&gt;. I know this because they also registered and launched the site &lt;a href=&quot;http://letourcongresstweet.org/&quot;&gt;LetOurCongressTweet.org&lt;/a&gt; today, whose content implies that Congress fears the internet and that the quality of discourse with our politicians would be vastly improved by allowing them to use “the communication technologies that we already use” as if they were still writing with quills on parchment and dispatching their missives via a coach-and-four.&lt;/p&gt;

&lt;p&gt;Now let’s be clear here. I’m a tree-hugging San Francisco Democrat who firmly believes in transparent government and free speech; of course my first reaction should be to tweet this every hour on the hour. But I’m also a rationalist who likes to understand the issue reasonably fully before I lend my voice, so I clicked through to &lt;a href=&quot;http://blog.sunlightfoundation.com/2008/07/08/member-web-use-reconsidered/&quot;&gt;Wonderlich’s post&lt;/a&gt;, which felt low on facts and high on rhetoric. At one point, Wonderlich engages in this &lt;a href=&quot;http://en.wikipedia.org/wiki/Reductio_ad_absurdum&quot;&gt;reductio ad absurdum&lt;/a&gt; argument:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“If Members can use whatever brand of inkpen, or any brand of paper, or buy whatever shoes they want, they should be given radically expanded freedom to use the Internet […]”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He could just as easily have said, “If Members can drive whatever brand of car they like on whatever roads they please, they should be given radically expanded freedom to drive on sidewalks and in public parks” with just as much semantic content. But at least we’re clear that they’ve moved beyond quill and parchment. And they apparently wear shoes! Hooray!&lt;/p&gt;

&lt;p&gt;However, he does give good links, one of which led me to &lt;a href=&quot;http://www.theopenhouseproject.com/the-open-house-project-report/7-member-web-use-restrictions/&quot;&gt;section 7 of the Open House Foundation’s analysis of the restrictions on House members’ web use&lt;/a&gt;where I found (once I learned to read just the parts excerpted from other reports and ignore the opinion bits) some excellent historical context regarding why those regulations came to be (hint: concerns over using public resources and time for personal purposes and members linking from their official sites to commercial and political sites they favored).&lt;/p&gt;

&lt;p&gt;With this fresh in my mind, I read Rep. Michael Capuano’s &lt;a href=&quot;http://gopleader.gov/UploadedFiles/Capuano_letter.PDF&quot;&gt;letter&lt;/a&gt;. To my eye, the letter recommends the CHA give &lt;em&gt;more&lt;/em&gt; freedom than is currently enjoyed, specifically by allowing the posting of video content on non-House.gov servers as long as the spirit of the current CHA rules and regulations are observed. It makes no reference to tightening any restrictions; instead, in precise language that’s refreshingly devoid of posturing, it clearly recommends:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Official content posted on an external domain must be clearly identified as produced by a House office for official purposes, and meet existing content rules and regulations;&lt;/li&gt;
  &lt;li&gt;To the maximum extent possible, the official content should not be posted on a website or page where it may appear with commercial or political information or any other information not in compliance with the House’s content guidelines.&lt;/li&gt;
  &lt;li&gt;Any link from a House website to an external site on which the Member video is hosted must contain an exit notice.&lt;/li&gt;
  &lt;li&gt;CHA, the Office of Web Assistance (OWA), or other designated House entity should maintain a list of external sites that meet whatever requirements are established by CHA.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In contrast, House Republican Leader John Boehner’s &lt;a href=&quot;http://republicanleader.house.gov/News/DocumentSingle.aspx?DocumentID=96645&quot;&gt;“Internet Freedom Alert” to “Online Community &amp;amp; Activists”&lt;/a&gt; nearly oozes with emotionally charged phrases as he writes “to alert you to an attack on free speech” and raises the concern that the proposed changes “would prohibit Americans from viewing content published by Members of Congress on websites that are not ‘approved’ by the Committee on House Administration.” Doesn’t mention that it’s a limitation on official content. Doesn’t mention that the limitation already exists under current CHA rules and regulations. Doesn’t mention that the recommendations apply only to video content. Pretty much leaves the facts behind early and never looks back.&lt;/p&gt;

&lt;p&gt;Finally, I found my way to Rep. Capuano’s &lt;a href=&quot;http://cha.house.gov/view_press_release.aspx?r=20080709181113&quot;&gt;rebuttal of the earlier “Freedom Alert”&lt;/a&gt;. Indeed, he makes very clear just what I’d read in his original letter: loosening restrictions, video only, intended to prevent subtle abuses. Stand down, mighty Twitter militia; the country’s freedom is just as safe as it was yesterday. No, really.&lt;/p&gt;

&lt;p&gt;I won’t comment on whether I think the current rules are too restrictive; I’ve not read them all, so I can’t say. Instead, I’ll note that Senators Clinton, McCain, and Obama all engaged in many electronic town halls, and &lt;a href=&quot;http://www.techpresident.com/blog/entry/26569/breaking_pdf2008_hosts_obama_mccain_twitter_debate&quot;&gt;are even engaging (by proxy) in a Twitter-based debate&lt;/a&gt;. I get emails from Rep. Pete Stark all the time; he comes by at least twice a year to listen to me and my neighbors gripe and answer our questions. I can get &lt;a href=&quot;http://twitter.com/HouseFloor&quot;&gt;updates of action on the floor of the House of Representatives via Twitter&lt;/a&gt;. _ &lt;strong&gt;I don’t feel like my Congress is limited in any meaningful way from communicating with me&lt;/strong&gt; _ and, frankly, I’m not sure I want them to be tempted by &lt;a href=&quot;http://www.google.com/search?q=Twitter+distraction&quot;&gt;the distraction that Twitter can offer&lt;/a&gt;. Maybe that’s what got &lt;a href=&quot;http://twitter.com/johnboehner&quot;&gt;Rep. Boehner&lt;/a&gt; all fired up in the first place; seems he’s been able to tweet just fine &lt;a href=&quot;http://twitter.com/johnboehner/statuses/37502092&quot;&gt;for more than a year&lt;/a&gt; and even &lt;a href=&quot;http://youtube.com/user/JohnBoehner&quot;&gt;post not-official-House content on YouTube&lt;/a&gt;. He doesn’t seem at all limited, really.&lt;/p&gt;

&lt;p&gt;I’ll also observe that I believe we should be properly thoughtful in changing regulations that limit the freedom of action of our elected Representatives. If there’s one thing this whole episode has made abundantly clear to me, it’s that transparency and openness are better served when we reach in for information of our choosing, not when they push out the information they want us to have.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; &lt;a href=&quot;http://www.blogher.com/haystackprofile/viewprofile/Erin+Kotecki+Vest&quot;&gt;Erin Kotecki Vest&lt;/a&gt; (aka &lt;a href=&quot;http://twitter.com/queenofspain&quot;&gt;queenofspain&lt;/a&gt;) at &lt;a href=&quot;http://www.blogher.com/&quot;&gt;BlogHer&lt;/a&gt; got the same vibe and &lt;a href=&quot;http://www.blogher.com/gop-rep-accuses-dems-censorship-wait-what&quot;&gt;came to much the same conclusion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; I didn’t realize when I wrote this that &lt;a href=&quot;http://news.oreilly.com/2008/07/let-our-congress-tweet-sign-th.html&quot;&gt;Tim O’Reilly feels differently&lt;/a&gt;. His post adds one unverified fact: he states that it’s currently against the CHA rules to tweet from the House floor. It also reduces the purpose of CHA rules to “decorum.” I find that difficult to swallow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; I’ve found the &lt;a href=&quot;http://cha.house.gov/members_handbook.aspx&quot;&gt;CHA’s Member Handbook&lt;/a&gt;. The relevant sections seem to be pages 44-47; I don’t see anything there which prohibits tweeting from the floor. I’m going to keep looking for a more complete ruleset.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Long Time, No See</title>
   <link href="http://blog.geekdaily.org/2008/03/long-time-no-se.html"/>
   <updated>2008-03-28T09:03:04-07:00</updated>
   <id>http://blog.geekdaily.org/2008/03/long-time-no-se</id>
   <content type="html">&lt;p&gt;I’m on the plane to Salt Lake City for &lt;a href=&quot;http://www.mtnwestrubyconf.org/&quot;&gt;Mountain West Ruby Conference&lt;/a&gt; and am fairly excited to get the chance to see several people I haven’t seen for months. In all fairness, the only reason I’m not “really excited” is not seeing my family for two hard travel days with very little sleep likely to happen; sorry, Carl, Cobie, and the rest of you, but Beth, Sam, and Cassie have my heart.&lt;/p&gt;

&lt;p&gt;I also realized that, since I joined &lt;a href=&quot;http://www.linkedin.com/&quot;&gt;LinkedIn&lt;/a&gt;’s Light Engineering Development group*, I’ve been so busy that I haven’t blogged anything significant. While I’ve been silent, my team and I created LinkedIn’s first fully public-facing Rails app, &lt;a href=&quot;http://m.linkedin.com/&quot;&gt;LinkedIn Mobile&lt;/a&gt;; I’ve also been thinking and learning about &lt;a href=&quot;http://opensocial.org/&quot;&gt;OpenSocial&lt;/a&gt;, &lt;a href=&quot;http://microformats.org/&quot;&gt;microformats&lt;/a&gt;, &lt;a href=&quot;http://www.windley.com/events/iiw2008a/&quot;&gt;digital identity&lt;/a&gt;, &lt;a href=&quot;http://diso-project.org/&quot;&gt;web services and discoverability in social networks&lt;/a&gt;, and scalable web architecture for both Rails and J2EE.&lt;/p&gt;

&lt;p&gt;Over the next few weeks, I’m going to start posting a bit more again; if we’re both lucky, there’ll even be some code. =]&lt;/p&gt;

&lt;p&gt;*Light as in “lightweight and agile,” though it’s fun to say, “Yeah, we make light. There’s another team responsible for making dark.”&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LinkedIn Mobile is Live!</title>
   <link href="http://blog.geekdaily.org/2008/02/linkedin-mobile.html"/>
   <updated>2008-02-25T00:12:19-08:00</updated>
   <id>http://blog.geekdaily.org/2008/02/linkedin-mobile</id>
   <content type="html">&lt;p&gt;It’s been a busy few months since &lt;a href=&quot;http://blog.geekdaily.org/2007/11/me-linkedincom.html&quot;&gt;I joined LinkedIn&lt;/a&gt;, but some of that work is finally out there for the world to see: &lt;a href=&quot;http://m.linkedin.com/&quot;&gt;LinkedIn Mobile&lt;/a&gt; is now in public beta. You can get more details from the &lt;a href=&quot;http://blog.linkedin.com/blog/2008/02/linkedin-mobile.html&quot;&gt;LinkedIn Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today’s going to be an exciting day. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>If</title>
   <link href="http://blog.geekdaily.org/if.html"/>
   <updated>2008-02-02T22:44:57-08:00</updated>
   <id>http://blog.geekdaily.org/if</id>
   <content type="html">&lt;p&gt;&lt;em&gt;by Rudyard Kipling&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you can keep your head when all about you&lt;br /&gt;
Are losing theirs and blaming it on you,&lt;br /&gt;
If you can trust yourself when all men doubt you,&lt;br /&gt;
But make allowance for their doubting too;&lt;br /&gt;
If you can wait and not be tired by waiting,&lt;br /&gt;
Or being lied about, don’t deal in lies,&lt;br /&gt;
Or being hated, don’t give way to hating,&lt;br /&gt;
And yet don’t look too good, nor talk too wise:&lt;/p&gt;

&lt;p&gt;If you can dream - and not make dreams your master;&lt;br /&gt;
If you can think - and not make thoughts your aim;&lt;br /&gt;
If you can meet with Triumph and Disaster&lt;br /&gt;
And treat those two impostors just the same;&lt;br /&gt;
If you can bear to hear the truth you’ve spoken&lt;br /&gt;
Twisted by knaves to make a trap for fools,&lt;br /&gt;
Or watch the things you gave your life to broken,&lt;br /&gt;
And stoop and build ‘em up with wornout tools:&lt;/p&gt;

&lt;p&gt;If you can make one heap of all your winnings&lt;br /&gt;
And risk it on one turn of pitch-and-toss,&lt;br /&gt;
And lose, and start again at your beginnings&lt;br /&gt;
And never breathe a word about your loss;&lt;br /&gt;
If you can force your heart and nerve and sinew&lt;br /&gt;
To serve your turn long after they are gone,&lt;br /&gt;
And so hold on when there is nothing in you&lt;br /&gt;
Except the Will which says to them: ‘Hold on!’&lt;/p&gt;

&lt;p&gt;If you can talk with crowds and keep your virtue,&lt;br /&gt;
Or walk with kings - nor lose the common touch,&lt;br /&gt;
If neither foes nor loving friends can hurt you,&lt;br /&gt;
If all men count with you, but none too much;&lt;br /&gt;
If you can fill the unforgiving minute&lt;br /&gt;
With sixty seconds’ worth of distance run -&lt;br /&gt;
Yours is the Earth and everything that’s in it,&lt;br /&gt;
And - which is more - you’ll be a Man my son!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Data Portability In A Nutshell: You Own Your Data</title>
   <link href="http://blog.geekdaily.org/2008/01/data-portabilit.html"/>
   <updated>2008-01-10T17:54:23-08:00</updated>
   <id>http://blog.geekdaily.org/2008/01/data-portabilit</id>
   <content type="html">&lt;p&gt;I’ve already gotten pings (don’t you people have other things to do? ;) about &lt;a href=&quot;http://blog.linkedin.com/blog/2008/01/linkedin-and-da.html&quot;&gt;this morning’s post on the LinkedIn blog&lt;/a&gt;, mostly around a more detailed explanation of the data portability goals with some privacy overtones, so I’ll give a terse summary here:&lt;/p&gt;

&lt;p&gt;Some useful jumping-off points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/dataportability-public/web/actionpacks&quot;&gt;Data Portability “Action Packs”&lt;/a&gt; (aka summaries, executive and other)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/dataportability-public/web/design-goals&quot;&gt;DPW Design Goals and Principles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/dataportability/web/work-to-be-done&quot;&gt;Work To Be Done/How To Contribute&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dataportability.googlegroups.com/web/DP_Blueprint_v0_1.html&quot;&gt;(Incredibly Rough Working Draft) Technical Blueprint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m only just getting caught up with what’s gone before on this effort, so I don’t have much more to offer than to say &lt;strong&gt;openness is good &lt;em&gt;as long as it clearly respects privacy&lt;/em&gt;&lt;/strong&gt;. It’s that last bit about privacy which I think is getting lost in &lt;a href=&quot;http://news.google.com/news?q=%22data+portability%22&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a&amp;amp;um=1&amp;amp;sa=N&amp;amp;tab=wn&amp;amp;oi=property_suggestions&amp;amp;resnum=0&amp;amp;ct=property-revision&amp;amp;cd=1&quot;&gt;the thundering herd of press coverage&lt;/a&gt;, but that’s what motivated me to get involved. It’s my firm, personal belief that portability must account for privacy; you own your profile and your connection to me, but you don’t get my profile and personal data in the bargain (unless I offer it).&lt;/p&gt;

&lt;p&gt;While I don’t agree with &lt;a href=&quot;http://blogs.zdnet.com/Howlett/?p=277&quot;&gt;Mr. Howlett’s title assertion&lt;/a&gt;, I absolutely adore the &lt;a href=&quot;http://www.legislation.org.uk/intro.htm&quot;&gt;UK Data Protection Act&lt;/a&gt; (&lt;em&gt;hey, Congress, you might have read this prior to the &lt;a href=&quot;http://www.gseis.ucla.edu/iclp/dmca1.htm&quot;&gt;DMCA&lt;/a&gt; …&lt;/em&gt;) and its intent and I’d expect it can and will be fully embraced in this effort; in that regard, I think &lt;a href=&quot;http://blogs.talis.com/nodalities/2008/01/data_licenses_for_social_netwo.php&quot;&gt;Danny Ayers has some ideas heading down the right path&lt;/a&gt;, and in fact &lt;a href=&quot;http://scobleizer.com/2008/01/05/plaxo-the-social-monster/&quot;&gt;Robert Scoble had thoughts along these lines&lt;/a&gt; just after &lt;a href=&quot;http://scobleizer.com/2008/01/03/ive-been-kicked-off-of-facebook/&quot;&gt;the debacle that shined a spotlight on data portability in the first place&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Context matters. Context always matters.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Textile, RedCloth, and MonkeyPatching</title>
   <link href="http://blog.geekdaily.org/2007/12/textile-redclot.html"/>
   <updated>2007-12-19T00:36:09-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/textile-redclot</id>
   <content type="html">&lt;p&gt;Okay, I need to go through ~2700 articles, some large, some &lt;em&gt;very&lt;/em&gt; large, and programmatically decide which of them use an interesting amount of &lt;a href=&quot;http://textism.com/tools/textile/&quot;&gt;Textile&lt;/a&gt; formatting. Don’t ask why; it’s not polite to stare at the unfortunate. Just smile and nod and think about how you’d puzzle this one out.&lt;/p&gt;

&lt;p&gt;So I’ve got a bunch of content, some of which may be in Textile format; how can I tell without looking at every piece and making a judgement call? First, I decided to try comparing the text before and after &lt;a href=&quot;http://code.whytheluckystiff.net/redcloth/&quot;&gt;RedCloth&lt;/a&gt; processing, but that didn’t work since RedCloth does some whitespace cleanup (among other things) which mean that feeding it a string devoid of Textile markup doesn’t guarantee you’ll get the same string back. A small part of me is offended by this – it breaks the principle of least astonishment – but I’m enough of a situational ethicist to value the good in what it’s doing for me and move on.&lt;/p&gt;

&lt;p&gt;I started poking around in RedCloth 3.0.4, found the bits which were perpetually going to alter some of my strings (for the better!) and discovered something wonderful – you can pass an ordered list of rules into RedCloth#to_html, allowing you to tweak it just the way you like it. Do you like using – gasp! – long dashes? The :glyphs_textile rule converts them to an HTML entity (— to be precise) along with a bunch of other conversions. And there are even handy shortcuts to specify all of the textile markup rules (:textile) and all of Markdown (:markdown). Yay! Flexibilty rewards to those who read the code closely!&lt;/p&gt;

&lt;p&gt;But why, then, if I do something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RedCloth.new(&#39;foo -- bar -- baz&#39;).to_html(:glyphs_textile, :textile)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Do I get this:&lt;/p&gt;

&lt;p&gt;foo - bar - baz&lt;/p&gt;

&lt;p&gt;It turns out that the glyph and inline rules are run in the same method, inline, which looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    def inline( text ) 
        [/^inline_/, /^glyphs_/].each do |meth_re|
            @rules.each do |rule_name|
                method( rule_name ).call( text ) if rule_name.to_s.match( meth_re )
            end
        end
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the problem? Because inline comes first in the ordered list of regular expressions, all inline rules come straight to the head of the line. It should look more like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    def inline( text ) 
        @rules.each do |rule_name|
            method( rule_name ).call( text ) if rule_name.to_s.match(/^(inline|glyphs)_/)
        end
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… and that’s exactly what I monkey-patched into my app.&lt;/p&gt;

&lt;p&gt;Meanwhile, judging from the &lt;a href=&quot;http://textism.com/tools/textile/index.php&quot;&gt;Textile demo&lt;/a&gt;, Textile should handle my double-dash example above; this is also a bug in the Ruby implementation – and all this time I blamed Textile … sorry! I think &lt;a href=&quot;http://code.whytheluckystiff.net/redcloth/ticket/26&quot;&gt;I’ll send in a patch&lt;/a&gt; as penance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things I’ve Learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Making your code flexible is good for other developers.&lt;/li&gt;
  &lt;li&gt;Being good to other developers means they might send you patches when they find problems.&lt;/li&gt;
  &lt;li&gt;There’s a hidden feature in Textile which allows you to disable Textile for a chunk of text: &lt;tt&gt;&amp;lt;notextile&amp;gt;-not struck-&amp;lt;/notextile&amp;gt; -or- ==-also not struck-==&lt;/tt&gt;&lt;/li&gt;
  &lt;li&gt;Monkey-patching is a nice way to get something fixed in your app quickly.&lt;/li&gt;
  &lt;li&gt;It’s handy to be able to &lt;a href=&quot;http://blog.geekdaily.org/2007/09/setting-constan.html&quot;&gt;silence constant setting warnings&lt;/a&gt; when you have to monkey-patch a constant.&lt;/li&gt;
  &lt;li&gt;Even smart people make bugs (so what hope is there for me?)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>How Quickly We Forget</title>
   <link href="http://blog.geekdaily.org/2007/12/how-quickly-we.html"/>
   <updated>2007-12-14T10:19:22-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/how-quickly-we</id>
   <content type="html">&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;I’m working to set up my MacBook Pro to properly allow email from the Terminal command line (e.g. “generate_big_text&lt;/td&gt;
      &lt;td&gt;Mail -s ‘Your Big Text Has Arrived’ joe@example.com”) and, in the process of running down what needed, found the following line in &lt;a href=&quot;http://www.topology.org/&quot;&gt;Alan Kennington&lt;/a&gt;’s &lt;a href=&quot;http://www.topology.org/linux/postfix.html#suse62&quot;&gt;postfix config pages&lt;/a&gt;:&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p&gt;Who on earth is “fnet”??&lt;br /&gt;
This must be left over from SuSE 7.1.&lt;br /&gt;
This is in the passwd file:&lt;/p&gt;

  &lt;p&gt;root@dog# fgrep fnet /etc/passwdfnet:x:49:14:FidoNet:/var/spool/fnet:/bin/bash&lt;/p&gt;

  &lt;p&gt;Who on earth is FidoNet???&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From &lt;a href=&quot;http://www.topology.org/images/photos/ak/img4005f128a.jpg&quot;&gt;his profile pic&lt;/a&gt;, he’s old enough to have at least *heard* of &lt;a href=&quot;http://en.wikipedia.org/wiki/Fidonet&quot;&gt;the largest non-commercial pre-Internet message forum on the planet&lt;/a&gt;. Really.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Wiimote Makes Your Screen A Canvas</title>
   <link href="http://blog.geekdaily.org/2007/12/wiimote-makes-y.html"/>
   <updated>2007-12-13T21:51:47-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/wiimote-makes-y</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.cs.cmu.edu/~johnny/&quot;&gt;Johnny Chung Lee&lt;/a&gt; of &lt;a href=&quot;http://www.cmu.edu/index.shtml&quot;&gt;Carnegie Mellon University&lt;/a&gt; decided that &lt;a href=&quot;http://www.cs.cmu.edu/~johnny/projects/wii/&quot;&gt;the infrared camera inside the Wiimote could be put to interesting uses&lt;/a&gt; … and he’s right. This is some of the coolest stuff I’ve seen for a while. If some company out there doesn’t build a $50 kit that converts your monitor to a poor man’s &lt;a href=&quot;http://www.wacom.com/cintiq/&quot;&gt;Cintiq&lt;/a&gt; they’re missing a really good opportunity.&lt;/p&gt;

&lt;p&gt;You might also recall one of his earlier efforts, the &lt;a href=&quot;http://www.cs.cmu.edu/~johnny/steadycam/&quot;&gt;$14 DIY Steadicam bracket&lt;/a&gt; featured in &lt;a href=&quot;http://www.makezine.com/&quot;&gt;Make Magazine&lt;/a&gt; &lt;a href=&quot;http://www.makezine.com/01/&quot;&gt;#1&lt;/a&gt;. I’m starting to be a serious fan of his. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Ruby Benchmark Shootout, Round 2</title>
   <link href="http://blog.geekdaily.org/2007/12/ruby-benchmark.html"/>
   <updated>2007-12-05T14:13:28-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/ruby-benchmark</id>
   <content type="html">&lt;p&gt;Back in February, Antonio Cangiano did &lt;a href=&quot;http://antoniocangiano.com/2007/02/19/ruby-implementations-shootout-ruby-vs-yarv-vs-jruby-vs-gardens-point-ruby-net-vs-rubinius-vs-cardinal/&quot;&gt;a fairly impressive run at benchmarking the various Ruby interpreter implementations&lt;/a&gt; and comparing the results. &lt;a href=&quot;http://antoniocangiano.com/2007/12/03/the-great-ruby-shootout/&quot;&gt;He’s just done it again&lt;/a&gt; and, just nine months later, the improvements are fairly dramatic.&lt;/p&gt;

&lt;p&gt;I’d summarize here but frankly I hate trying to reduce the complexity of a benchmark suite to a pithy conclusion. Instead, I’ll inline one of the several results tables here; this one presents the benchmark execution times in seconds:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://antoniocangiano.com/wp-content/uploads/2007/12/total-linux-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://antoniocangiano.com/2007/12/03/the-great-ruby-shootout/&quot;&gt;Befor you draw any conclusions, go read the rest for yourself.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope he’ll provide the raw numbers in some format I can pull into a spreadsheet and play with myself.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Growl for Entourage (via Applescript)</title>
   <link href="http://blog.geekdaily.org/2007/12/growl-for-entou.html"/>
   <updated>2007-12-04T13:06:28-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/growl-for-entou</id>
   <content type="html">&lt;p&gt;So I went looking for a way to connect Microsoft Entourage (yeah, I’m in Exchange land now) with Growl for notifications. In theory, there are many ways, all of them Applescripts. In practice, I couldn’t find one that worked properly … so I grabbed the best one I could find and hacked it from there. I’ve put it in &lt;a href=&quot;http://svn.geekdaily.org/public/applescript&quot;&gt;my public subversion repo&lt;/a&gt;, so if you need it either ctrl-click and download or use svn to nab it.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Make Terminal.app start with a default set of windows</title>
   <link href="http://blog.geekdaily.org/2007/12/make-terminalap.html"/>
   <updated>2007-12-02T11:31:24-08:00</updated>
   <id>http://blog.geekdaily.org/2007/12/make-terminalap</id>
   <content type="html">&lt;p&gt;Due to &lt;a href=&quot;http://blog.geekdaily.org/2007/11/me-linkedincom.html&quot;&gt;recent circumstances&lt;/a&gt;, I’ve moved from my old MacBook Pro with Leopard to a newer, faster MacBook Pro with Tiger … but not soon enough to avoid addiction to the Leopard Terminal.app’s Window Groups feature, which allows you to position, size, and color any number of windows, make them a group, then have that group be what appears every time you start Terminal.app (back in my old &lt;a href=&quot;http://en.wikipedia.org/wiki/4Dwm&quot;&gt;4Dwm&lt;/a&gt; days we called this “session management” … glad MacOS is catching up. ;)&lt;/p&gt;

&lt;p&gt;Turns out there’s something similar in previous versions of Terminal.app, just not so nicely exposed. Setting up a particular startup configuration is pretty straightforward, though:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open Terminal.app&lt;/li&gt;
  &lt;li&gt;Open windows, put ‘em where you want ‘em, change their colors, etc.&lt;/li&gt;
  &lt;li&gt;Select “Save As…” from the File menu; you’ll see this dialog with different settings:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;http://purp.typepad.com/photos/geekpix/terminal_save_dialog.png&quot; alt=&quot;Terminal.app Save As... Dialog&quot; /&gt;
4. Change the settings to match the dialog above:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Type any name you like in the “Save As:” field&lt;/li&gt;
  &lt;li&gt;Change “What to save” to “All Windows”&lt;/li&gt;
  &lt;li&gt;Check the “Open this file when Terminal starts up”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that by default it will save this file in ~/Library/Application Support/Terminal, which seems like a fine place for it to me but YMMV.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Me @ LinkedIn.com</title>
   <link href="http://blog.geekdaily.org/2007/11/me-linkedincom.html"/>
   <updated>2007-11-26T09:10:15-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/me-linkedincom</id>
   <content type="html">&lt;p&gt;Today is my first day as the manager of light engineering development at LinkedIn and I’m incredibly excited about it. Why’s that, you might ask? Because LED is the group that’s bringing agile development and Ruby on Rails to LinkedIn.&lt;/p&gt;

&lt;p&gt;Who says Rails isn’t ready for the enterprise? ;p&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>My New Toy: Pentax K100D Super</title>
   <link href="http://blog.geekdaily.org/2007/11/my-new-toy-pent.html"/>
   <updated>2007-11-25T22:03:10-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/my-new-toy-pent</id>
   <content type="html">&lt;p&gt;I’ve been staring at the specs for the Nikon &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Nikon/nikon_d40.asp&quot;&gt;D40&lt;/a&gt; (and &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Nikon/nikon_d40x.asp&quot;&gt;D40x&lt;/a&gt;), Canon Digital Rebel &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Canon/canon_eos350d.asp&quot;&gt;XT/350D&lt;/a&gt; (and &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Canon/canon_eos400d.asp&quot;&gt;XTi/400D&lt;/a&gt;), and the Pentax &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Pentax/pentax_k100d.asp&quot;&gt;K100D&lt;/a&gt; (and &lt;a href=&quot;http://www.dpreview.com/reviews/specs/Pentax/pentax_k100dsuper.asp&quot;&gt;K100D Super&lt;/a&gt;) for over a year. 6 megapixels vs. 10, shake reduction in camera, dust removal, weight, lenses, reputation … I’ve been mulling this one pretty heavily, more than on our last car purchase (Toyota Sienna with all the geek family features like navigation and dvd … a no brainer ;)&lt;/p&gt;

&lt;p&gt;I had a target rig of camera, basic 18-55mm lens, zoom lens somewhere between 200-300mm, polarizers for both, rechargeable batteries, a couple of reasonable-sized SD cards, and a bag; my budget was ~$750 for the whole deal. Thus, I waited. And waited. And waited. And it was getting closer and closer to working out as long as I mail ordered from someplace in BFE … then Black Friday came.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.pentaxslr.com/home&quot;&gt;Pentax&lt;/a&gt; is offering a &lt;a href=&quot;http://www.pentaximaging.com/purchase/rebates_offers/&quot;&gt;$100 rebate&lt;/a&gt; on the &lt;a href=&quot;http://www.ritzcamera.com/product/SLR1166.htm?bct=t1134&quot;&gt;K100D Super kit&lt;/a&gt;. &lt;a href=&quot;http://www.ritzcamera.com/&quot;&gt;Ritz Camera&lt;/a&gt; offered a free &lt;a href=&quot;http://www.ritzcamera.com/product/251666111.htm&quot;&gt;Quantaray 70-300mm zoom lens&lt;/a&gt;. And now I have my camera.&lt;/p&gt;

&lt;p&gt;Expect pictures soon. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>OLPC: You Know, For Kids ... Theirs *and* Yours.</title>
   <link href="http://blog.geekdaily.org/2007/11/olpc-you-know-f.html"/>
   <updated>2007-11-24T23:44:40-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/olpc-you-know-f</id>
   <content type="html">&lt;p&gt;I just tripped over this video:&lt;/p&gt;

&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param value=&quot;http://www.youtube.com/v/zQbtebeftyA&amp;amp;rel=1&quot; name=&quot;movie&quot; /&gt;
&lt;param value=&quot;transparent&quot; name=&quot;wmode&quot; /&gt;
&lt;embed width=&quot;425&quot; height=&quot;355&quot; wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.youtube.com/v/zQbtebeftyA&amp;amp;rel=1&quot; /&gt;&lt;/object&gt;

&lt;p&gt;… which leads to the &lt;a href=&quot;http://www.laptop.org/&quot;&gt;OLPC&lt;/a&gt; &lt;a href=&quot;http://laptopgiving.org/&quot;&gt;Laptop Giving&lt;/a&gt; website. The gist of it is that for $400 you can get an &lt;a href=&quot;http://laptopgiving.org/en/explore.php&quot;&gt;XO laptop&lt;/a&gt; for your kids … and &lt;a href=&quot;http://www.laptopgiving.org/en/learning-around-the-world.php&quot;&gt;give one to kids&lt;/a&gt; who’ll use it to change the world.&lt;/p&gt;

&lt;p&gt;I think Sam’s going to have a very happy holiday.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cosco Busan, SF Bay, and Kurt Schwehr</title>
   <link href="http://blog.geekdaily.org/2007/11/cosco-busan-sf.html"/>
   <updated>2007-11-16T12:24:41-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/cosco-busan-sf</id>
   <content type="html">&lt;p&gt;Sometimes I’m dense. I’ve been reading &lt;a href=&quot;http://schwehr.org/&quot;&gt;Kurt Schwehr&lt;/a&gt;’s excellent &lt;a href=&quot;http://schwehr.org/blog/&quot;&gt;electronic work log&lt;/a&gt; (wlog? ;) for months and didn’t even think to share it in the wake of the Cosco Busan allision (a term I wouldn’t have known with Kurt’s help =). If you’re a geek, you should just read his whole blog as it’s rich in very cool stuff you don’t see every day … but if not, here’s his postings to date regarding the whole affair:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-08T07_13_49.txt&quot;&gt;SF Bay Bridge Allision&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-08T08_36_41.txt&quot;&gt;An Allision Seen Through AIS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-08T15_56_41.txt&quot;&gt;Cosco Busan Oil Spill&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-09T13_07_54.txt&quot;&gt;Spill Update&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-11T19_06_23.txt&quot;&gt;Cosco Busan Links&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://schwehr.org/blog/archives/2007-11.html#e2007-11-12T16_13_07.txt&quot;&gt;Google Earth - SF Oil Spill&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alameda’s beaches haven’t been hit hard (surprising, really) but there’s a lot of cleanup still to be done. Grrr.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Post-Leopard Checklist</title>
   <link href="http://blog.geekdaily.org/2007/11/post-leopard-ch.html"/>
   <updated>2007-11-12T13:35:44-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/post-leopard-ch</id>
   <content type="html">&lt;p&gt;I’m resettling into my laptop post-Leopard upgrade as a background task today and thought it might be useful (mostly to future-me) to note all the bits I’m twiddling:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Uninstalled and reinstalled &lt;a href=&quot;http://spanningsync.com/&quot;&gt;SpanningSync&lt;/a&gt; to get iCal and GoogleCal talking again&lt;/li&gt;
  &lt;li&gt;Installed &lt;a href=&quot;http://svn.macosforge.org/repository/macports/downloads/MacPorts-1.5.0/&quot;&gt;MacPorts 1.5 for 10.5&lt;/a&gt;; &lt;code&gt;sudo port selfupdate&lt;/code&gt; yielded no changes.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Started installing Ruby gems: rcov uuidtools … I’m sure there are more coming.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Installed &lt;a href=&quot;http://blacktree.com/?quicksilver&quot;&gt;QuickSilver&lt;/a&gt; for the first time. I’ve been watching folks like Evan speed along using it, so I thought I’d give it a try. I’ll probably take time to watch &lt;a href=&quot;http://www.youtube.com/watch?v=EBvFUhTqKK4&quot;&gt;the 10 minute tutorial on YouTube.&lt;/a&gt; Happily just discovered that this eliminates the need for   &lt;a href=&quot;http://www.yellowmug.com/sk4it/&quot;&gt;SizzlingKeys&lt;/a&gt; to control iTunes. Excellent. Installed a metric buttload of plugins for it. If I can achieve a graceful way of adding tasks and appointments, I’ll be a happy camper.&lt;/li&gt;
  &lt;li&gt;Kept &lt;a href=&quot;http://iconfactory.com/software/twitterrific/&quot;&gt;Twitteriffic&lt;/a&gt; 2.1 rather than upgrading to 3.0. I keep hearing grief about 3.0 and ads, which is uninteresting to experience firsthand.&lt;/li&gt;
  &lt;li&gt;Installed RMagick according to &lt;a href=&quot;http://rmagick.rubyforge.org/install-osx.html&quot;&gt;the usual instructions&lt;/a&gt;; however, rather than port install all the supporting libs, then compile the sources I just did &lt;code&gt;sudo port install imagemagick&lt;/code&gt; which seems to have worked, so the sum of the instructions amounts to:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Install X11, Xcode, and X11 SDK (there are people who don’t? ;)&lt;/li&gt;
  &lt;li&gt;install MacPorts&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;&lt;code&gt;sudo port selfupdate &amp;amp;amp;&amp;amp;amp; sudo port install imagemagick&lt;/code&gt;&lt;/tt&gt;&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;&lt;code&gt;sudo gem install rmagick&lt;/code&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s about it for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Round 2 … fight!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Resubscribe to &lt;a href=&quot;http://www.apple.com/downloads/macosx/calendars/usholidaycalendar.html&quot;&gt;US Holidays&lt;/a&gt; and &lt;a href=&quot;http://www.apple.com/downloads/macosx/calendars/movienewreleasecalendar.html&quot;&gt;Movie release&lt;/a&gt; calendars. (I don’t usually track the &lt;a href=&quot;http://www.apple.com/downloads/macosx/calendars/dvdnewreleasecalendar.html&quot;&gt;DVD releases&lt;/a&gt;, but you can if you like)&lt;/li&gt;
  &lt;li&gt;Partitioned my drive with BootCamp Assistant and upgraded to latests &lt;a href=&quot;http://www.parallels.com/en/products/desktop/&quot;&gt;Parallels&lt;/a&gt; in preparation for tonight’s Vista installfest. Found it interesting/amusing that Bootcamp suggested that I could install Vista Home although &lt;a href=&quot;http://www.eweek.com/article2/0,1759,2148526,00.asp&quot;&gt;this is against the MS Vista EULA&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Try installing mysql5 from MacPorts and get it to start. Fail miserably. Oh well.&lt;/li&gt;
  &lt;li&gt;Install the MySQL 5/Intel DMG from MySQL.com&lt;/li&gt;
  &lt;li&gt;Install &lt;a href=&quot;http://tomatocheese.com/library/com.mysql.mysqld.plist&quot;&gt;/Library/LaunchDaemons/com.mysql.mysqld&lt;/a&gt; as root, courtesy of &lt;a href=&quot;http://blog.tomatocheese.com/archives/2007/11/1/migrating_mysql_to_mac_os_x_leopard/&quot;&gt;Joannou Ng&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;sudo launchctl load /Library/LaunchDaemons/com.mysql.mysqld&lt;/tt&gt;&lt;/li&gt;
  &lt;li&gt;Install the mysql gem. This was tricky (or I don’t know how it’s supposed to be done); the usual method failed while building the Makefile. In the end I had to read code to discover that I should install like so: sudo gem install – –with-mysql-config … and even so, it wanted to build a Universal bundle and kept failing due to ‘-arch ppc’ compiler and linker flags. Ripped those out of the Makefile and did a make install … and voila.&lt;/li&gt;
  &lt;li&gt;More gems: parsetree capistrano feedtools fastercsv ferret flexmock mongrel piston rails_analyzer_tool rspec rubygrowl rubyprof sake tzinfo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Still need to work out the Address Book missing thing.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf 2007 Slide Roundup</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-2007-s.html"/>
   <updated>2007-11-12T09:28:06-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-2007-s</id>
   <content type="html">&lt;p&gt;Haven’t been able to find a definitive source for the slides from RubyConf and, judging from my referrer logs, many others are also looking. Here’s my attempt to gather a reference to them in one place; I’ve just copied the schedule from the RubyConf site and am adding links as I find them. I’ll update this as I find more (and please tell me if you know where to find them =)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UBER-UPDATE:&lt;/strong&gt; Ryan Davis (aka &lt;a href=&quot;http://www.zenspider.com/&quot;&gt;zenspider&lt;/a&gt;) keeps an &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/index.html&quot;&gt;annual repository of the RubyConf presentations&lt;/a&gt;. He hasn’t posted 2007 yet, but here’s links to &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/RubyConf2006.html&quot;&gt;2006&lt;/a&gt;, &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/RubyConf2005.html&quot;&gt;2005&lt;/a&gt;, &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/RubyConf2004.html&quot;&gt;2004&lt;/a&gt;, &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/RubyConf2003.html&quot;&gt;2003&lt;/a&gt;, and &lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/RubyConf2002.html&quot;&gt;2002&lt;/a&gt;. Very nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATES:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;20071119: Added link for Luke Kanies’ “Essential Incompleteness” talk&lt;/li&gt;
  &lt;li&gt;20071117: Added link for Andrea O.K. Wright’s “Building Games with Ruby” talk&lt;/li&gt;
  &lt;li&gt;20071117: Added link for Ben Bleything’s “Controlling Electronics” talk&lt;/li&gt;
  &lt;li&gt;20071115: Added link for Charles Nutter’s “JRuby” talk&lt;/li&gt;
  &lt;li&gt;20071114: Added link for Eric Ivancich’s “Ropes” talk&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;rubyconf-2007&quot;&gt;RubyConf 2007&lt;/h1&gt;
&lt;p&gt;Charlotte, North Carolina&lt;/p&gt;

&lt;h2 id=&quot;friday-november-2&quot;&gt;Friday November 2&lt;/h2&gt;

&lt;h3 id=&quot;morning&quot;&gt;Morning&lt;/h3&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;9:00&lt;/td&gt;
      &lt;td&gt;Welcome&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;9:30&lt;/td&gt;
      &lt;td&gt;Marcel Molina&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;rubyhoedown2007.confreaks.com/pdfs/session09.pdf&quot;&gt;What Makes Code Beautiful?&lt;/a&gt; &lt;em&gt;[note: from Ruby Hoedown, anyone seen a more recent deck?]&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10:30&lt;/td&gt;
      &lt;td&gt;Jim Weirich&lt;/td&gt;
      &lt;td&gt;Advanced Ruby Class Design&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;afternoon&quot;&gt;Afternoon&lt;/h3&gt;

&lt;h4 id=&quot;room-1&quot;&gt;Room 1&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;Nathaniel Talbott&lt;/td&gt;
      &lt;td&gt;Why Camping Matters&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Shunichi Shinohara and Kiwamu Kato&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/kiwamu/ap4r-on-rubyconf2007/&quot;&gt;Introduction to AP4R, Asynchronous Processing for Ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Nathan Sobo&lt;/td&gt;
      &lt;td&gt;Treetop: Bringing the Elegance of Ruby to Syntactic Analysis&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4:00&lt;/td&gt;
      &lt;td&gt;Paul Brannan&lt;/td&gt;
      &lt;td&gt;Avoiding Pitfalls in C Extensions&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;room-2&quot;&gt;Room 2&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;Ben Bleything&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://blog.bleything.net/2007/11/17/rubyconf-stuff&quot;&gt;Controlling Electronics with Ruby&lt;/a&gt; &lt;em&gt;[note: blog post with slides and other goodies]&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Andrea O.K. Wright&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.chariotsolutions.com/slides/pdfs/building_games_with_ruby_rubyconf.pdf&quot;&gt;High Art on Top of Low-Level APIs: Building Games with Ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Eric Ivancich&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://learnruby.com/rubyconf-2007-talk.html&quot;&gt;Ropes: An Alternative to Ruby’s Strings&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4:00&lt;/td&gt;
      &lt;td&gt;Ryan Davis&lt;/td&gt;
      &lt;td&gt;Hurting Code for Fun and Profit&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;room-3&quot;&gt;Room 3&lt;/h4&gt;

&lt;p&gt;&lt;cite&gt;Ruby Clinic&lt;/cite&gt;, an expert-guided afternoon of troubleshooting, fixing, and learning. Bring your questions and problems! (Experts to be announced.)&lt;/p&gt;

&lt;h3 id=&quot;evening&quot;&gt;Evening&lt;/h3&gt;

&lt;p&gt;Town meeting with Yukihiro “Matz” Matsumoto, creator of Ruby&lt;/p&gt;

&lt;h2 id=&quot;saturday-november-3&quot;&gt;Saturday November 3&lt;/h2&gt;

&lt;h3 id=&quot;morning-1&quot;&gt;Morning&lt;/h3&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;9:00&lt;/td&gt;
      &lt;td&gt;John Lam&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.iunknown.com/files/RubyConf_2007.pptx&quot;&gt;State of IronRuby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10:00&lt;/td&gt;
      &lt;td&gt;Charlie Nutter&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://dist.codehaus.org/jruby/talks/RubyConf%202007%20-%20JRuby.odp&quot;&gt;JRuby: Ruby for the JVM&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;[note: you may need to ctrl-click/right-click and download the link manually]&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11:00&lt;/td&gt;
      &lt;td&gt;Evan Phoenix&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/evanphx/rubyconf-2007-rubinius-10/&quot;&gt;Rubinius 1.0&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;afternoon-1&quot;&gt;Afternoon&lt;/h3&gt;

&lt;h4 id=&quot;room-1-1&quot;&gt;Room 1&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;Ed Borasky&lt;/td&gt;
      &lt;td&gt;Profiling and Tuning Ruby 1.8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Phil Hagelberg&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://technomancy.us/static/feedback_slides.tar.gz&quot;&gt;Tightening the Feedback Loop&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Eric Hodel&lt;/td&gt;
      &lt;td&gt;Maximizing Productivity&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4:00&lt;/td&gt;
      &lt;td&gt;Francis Hwang&lt;/td&gt;
      &lt;td&gt;Conversations vs. Laws: What do we mean when we say Ruby is dynamic?&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;room-2-1&quot;&gt;Room 2&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;Luke Kanies&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.madstop.com/conference/rubyconf_slides.html&quot;&gt;Essential Incompleteness in Program Modeling&lt;/a&gt; &lt;em&gt;[note: blog post with link to slides]&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Bruce Williams&lt;/td&gt;
      &lt;td&gt;Writing Client and Desktop Applications in Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Michael Neumann&lt;/td&gt;
      &lt;td&gt;Efficient Ruby to Javascript Compilation and Applications&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4:00&lt;/td&gt;
      &lt;td&gt;Laurent Sansonetti&lt;/td&gt;
      &lt;td&gt;Mac OS X Loves Ruby&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;room-3-1&quot;&gt;Room 3&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://relevancellc.com/assets/2007/11/2/Refactotum-5-RubyConf.pdf&quot;&gt;Stuart Halloway presents &lt;cite&gt;Refactotum: Ruby&lt;/cite&gt;&lt;/a&gt;, an afternoon presentation and workshop on the skills you need to prepare and contribute code to open source projects.&lt;/p&gt;

&lt;h3 id=&quot;evening-1&quot;&gt;Evening&lt;/h3&gt;
&lt;p&gt;Keynote by Matz&lt;/p&gt;

&lt;h2 id=&quot;sunday-november-4&quot;&gt;Sunday, November 4&lt;/h2&gt;

&lt;h3 id=&quot;morning-2&quot;&gt;Morning&lt;/h3&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;9:00&lt;/td&gt;
      &lt;td&gt;Dr Nic Williams&lt;/td&gt;
      &lt;td&gt;Use Ruby to Generate More Ruby - RubiGen is Everywhere&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10:00&lt;/td&gt;
      &lt;td&gt;David Chelimsky, Dave Astels&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://blog.davidchelimsky.net/files/BDDWithRspec.RubyConf.2007.pdf&quot;&gt;Behaviour Driven Development with RSpec&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11:00&lt;/td&gt;
      &lt;td&gt;Jay Phillips&lt;/td&gt;
      &lt;td&gt;Next-Gen VoIP Development with Ruby and Adhearsion&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;afternoon-2&quot;&gt;Afternoon&lt;/h3&gt;

&lt;h4 id=&quot;room-1-2&quot;&gt;Room 1&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;William Bereza&lt;/td&gt;
      &lt;td&gt;Enhancing Embedded Development with Ruby&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Kyle Maxwell&lt;/td&gt;
      &lt;td&gt;JRuby in the Wild&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Ben Scofield&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/viget/cleanliness-is-next-to-domainspecificity-156167/&quot;&gt;Cleanliness Is Next to Domain Specificity&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;talk-room-2&quot;&gt;Talk Room 2&lt;/h4&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1:00&lt;/td&gt;
      &lt;td&gt;Justin Gehtland&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://relevancellc.com/2007/11/6/rubyconf-resources-for-cas-and-openid&quot;&gt;Ruby and Identity: OpenID, CAS and Information Card&lt;/a&gt; &lt;em&gt;[blog post,not slides]&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2:00&lt;/td&gt;
      &lt;td&gt;Erik Hatcher&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://code4lib.org/files/solr-ruby.pdf&quot;&gt;solr-ruby: the best open source engine + ruby&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3:00&lt;/td&gt;
      &lt;td&gt;Aaron Bedra&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://aaronbedra.com/assets/2007/11/11/rubyconf.pdf&quot;&gt;Sploitin’ with Ruby (Point, Click, Root)&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>Reading my referrer log ...</title>
   <link href="http://blog.geekdaily.org/2007/11/reading-my-refe.html"/>
   <updated>2007-11-12T09:07:15-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/reading-my-refe</id>
   <content type="html">&lt;p&gt;… and if I were a writer in search of material, I’d write about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://rfacebook.rubyforge.org/&quot;&gt;rFacebook&lt;/a&gt; and &lt;a href=&quot;http://facebooker.rubyforge.org/&quot;&gt;Facebooker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Scoring more points playing Werewolf on &lt;a href=&quot;http://www.facebook.com&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Blocking notifications from the Werewolf app on &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The location of the slides for &lt;a href=&quot;http://rubyconf.org/&quot;&gt;RubyConf 2007&lt;/a&gt; (okay, I’ll do that one next)&lt;/li&gt;
  &lt;li&gt;MP3 streaming servers (huh? &lt;a href=&quot;http://blog.geekdaily.org/2006/03/tiny_mp3_stream.html&quot;&gt;Oh, yeah, right&lt;/a&gt;.)&lt;/li&gt;
  &lt;li&gt;Infinite sessions in the &lt;a href=&quot;http://developer.facebook.com/&quot;&gt;Facebook API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Mock Ajax&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;http://apps.facebook.com/superwall/developers.php&quot;&gt;Superwall API&lt;/a&gt; (oh, wait, I &lt;a href=&quot;http://blog.geekdaily.org/2007/10/an-api-on-an-ap.html&quot;&gt;did that one&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Such googlebaiting. Tsk.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A Mild Leopard Hangover</title>
   <link href="http://blog.geekdaily.org/2007/11/a-mild-leopard-.html"/>
   <updated>2007-11-12T08:51:25-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/a-mild-leopard-</id>
   <content type="html">&lt;p&gt;I installed Leopard last night and, after a few hours, left it doing its TimeMachine thing. It was an overall good experience. Here’s my quick notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I did an old-style backup of my disk by rsyncing it to an external drive. This doesn’t make the Migration Assistant a happy camper, so I got the joy of hand-copying the bits I wanted back over. I now know more about the contents of the Library than I ever wanted.&lt;/li&gt;
  &lt;li&gt;My basic four apps (TextMate, Terminal, Firefox, and Thunderbird) all just picked up where they left off, prefs and all (see above). Yay!&lt;/li&gt;
  &lt;li&gt;My calendar, tasks, and address book all reverted to some earlier time. I think I missed some Library things. Joy. Well, they’re backed up (and on my Treo and Google Calendar). I’ll work it out this week.&lt;/li&gt;
  &lt;li&gt;I’ve finally got Spaces! Used to use You Control Desktops, which did one thing I can’t seem to do in Spaces: different wallpaper per space. Someone’s got to have figured this out.&lt;/li&gt;
  &lt;li&gt;No iPhoto, iDVD, iMovie, or iWeb? I must have missed something (maybe the memo)&lt;/li&gt;
  &lt;li&gt;Had to be sure I got all my dotfiles over (I’m a pretty shell-oriented kinda guy)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.macosxhints.com/article.php?story=20071029181159291&quot;&gt;Changing my login shell to tcsh&lt;/a&gt; turned out to be long and painful, but it’s done for now … until next time …&lt;/li&gt;
  &lt;li&gt;My /etc/hosts is pretty heavily hacked, so that had to come, too&lt;/li&gt;
  &lt;li&gt;MacPorts: copy or reinstall? I opted for the latter. I’ll be refinding things for months, I’m sure, but I want to try to start with the Leopard Ruby I’ve heard such joy about and go from there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Haven’t yet gone through the fun of BootCamp, though I’m oddly looking forward to it. I’m going to see if that plus Parallels can cope with Vista on a partition yet (and how bloaty it’ll be to have an Office install on the Vista partition).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Rails 101 by Peter Marklund</title>
   <link href="http://blog.geekdaily.org/2007/11/rails-101-by-pe.html"/>
   <updated>2007-11-10T22:42:20-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rails-101-by-pe</id>
   <content type="html">&lt;p&gt;On the off-chance you’re not already reading either &lt;a href=&quot;http://marklunds.com/&quot;&gt;Peter Marklund’s blog&lt;/a&gt; or &lt;a href=&quot;http://www.rubyinside.com/&quot;&gt;Peter Cooper’s excellent RubyInside blog&lt;/a&gt;: &lt;a href=&quot;http://www.rubyinside.com/ruby-on-rails-101-a-presentation-648.html&quot;&gt;Peter the Latter points out&lt;/a&gt; that &lt;a href=&quot;http://marklunds.com/articles/one/374&quot;&gt;Peter the Former has posted&lt;/a&gt; his 341 slide (!) deck used to teach a week-long Ruby on Rails basics course. I’ve only skimmed but it looks pretty tasty.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>It&#39;s Official: I&#39;m a Rails Contributor</title>
   <link href="http://blog.geekdaily.org/2007/11/its-official-im.html"/>
   <updated>2007-11-09T11:14:13-08:00</updated>
   <id>http://blog.geekdaily.org/2007/11/its-official-im</id>
   <content type="html">&lt;p&gt;Okay, &lt;a href=&quot;http://groups.google.com/group/rubyonrails-core/browse_thread/thread/43d683ba018f5e7e&quot;&gt;big deal&lt;/a&gt;. Time to get back to work. (he said with a little grin)&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf, Day 2: Maximizing Productivity</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-day--3.html"/>
   <updated>2007-11-03T12:51:59-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-day--3</id>
   <content type="html">&lt;p&gt;Don’t reinvent it if it doesn’t exist; extend what exists.&lt;/p&gt;

&lt;p&gt;Don’t be a coding superhero – you don’t need the latest, greatest&lt;/p&gt;

&lt;p&gt;Be selfish: fix your own problems first, and don’t even feel like you need to release (but do share that you did something like that somewhere that others might notice)&lt;/p&gt;

&lt;p&gt;KISS and YAGNI. Don’t distract yourself.&lt;/p&gt;

&lt;p&gt;YAGNITAGAFI: …they aint’ gonna ask for it. Invest in your own features, don’t make guesses about what they’ll want. They’ll tell you. They may even write it themselves.&lt;/p&gt;

&lt;p&gt;Test: tell your future self (and others) what you know is necessary and what you think might break.&lt;/p&gt;

&lt;p&gt;Autotest to keep yourself from forgetting to test related things.&lt;/p&gt;

&lt;p&gt;Keep everything in sight: Eric likes to be able to see his four shells: code, test, autotest, terminal) in quadrants of the screen. Keeps the edge of chat window handy. Uses &lt;a href=&quot;http://www.sshkeychain.org/&quot;&gt;SSH Keychain&lt;/a&gt; and SpiritedAway to keep essential bits on the menubar/tab accessible.&lt;/p&gt;

&lt;p&gt;Use Heckle.&lt;/p&gt;

&lt;p&gt;Automate everything: setup, migrations, common tasks. Automating setup is good self-defense against support requests.&lt;/p&gt;

&lt;p&gt;Know (and love) your editor. [me: it’s your primary tool, of course].&lt;/p&gt;

&lt;p&gt;Pair programming [me: Eric pairs with zenspider; I’ve heard them called “peas and carrots” ;]&lt;/p&gt;

&lt;p&gt;Ping-pong pairing: write a test, other person fixes and writes next test.&lt;/p&gt;

&lt;p&gt;Polish your docs just before release (but rdoc along the way). README == quick start guide, synopsis and feature overview, links to bug tracker and rdoc. [I’d add contact info for developer]&lt;/p&gt;

&lt;p&gt;Set up a bugtracking with no anonymous submissions. Don’t keep it in your email or a mailing list. It opens up the debugging and fixing to the community of users.&lt;/p&gt;

&lt;p&gt;Have a review partner beat on your code just before release. Local ruby user’s group is a good source. =]&lt;/p&gt;

&lt;p&gt;Releasing with Hoe: packaging uploads emails and blogs all taken care of. This makes it possible to release lightly and often. Small changesets. Less complexity, easier to pin down introduction of problems.&lt;/p&gt;

&lt;p&gt;Go have a life! =]&lt;/p&gt;

&lt;p&gt;Maintenance&lt;/p&gt;

&lt;p&gt;Bug trackers allow collaboration and reduce the load on you. Except when they don’t and instead send it to your email (or mailing lists, or blogs, or somewhere). Find them and move them into the bug tracker.&lt;/p&gt;

&lt;p&gt;Version your tools meaningfully and consistently. (e.g. v1.2.3 == major minor bugs)&lt;/p&gt;

&lt;p&gt;Don’t fear breaking your code into the natural components when it grows too big to be easily dealt with. Find the natural divisions (and dependencies) and pull it apart.&lt;/p&gt;

&lt;p&gt;Inspiration&lt;/p&gt;

&lt;p&gt;“I don’t owe you” … “right now”. You released it to the world so you agreed to help them, but it’s okay not to drop everything. Be okay with criticism; the critic might dig in and fix it themselves.&lt;/p&gt;

&lt;p&gt;Go to a HackNight/HackFest. Talk to people. Help them with their projects; they’ll help you with yours. Go to the pre-/post- dinner/drinks where your laptop isn’t out so you’ll think and talk.&lt;/p&gt;

&lt;p&gt;Look to other domains for interesting ideas. autotest was inspired by Smalltalk.&lt;/p&gt;

&lt;p&gt;Answer your own annoyances – automate or change your workflow. IMAPCleanse was written to read ruby-talk and flag messages that are interesting, and delete aging, unread messages.&lt;/p&gt;

&lt;p&gt;Q: What bugtracker do you recommend?&lt;br /&gt;
A: Eric tends to use RubyForge, doesn’t have a favorite.&lt;/p&gt;

&lt;p&gt;Q: IMAPCleanse for …?&lt;br /&gt;
A: ruby-talk, primarily. Very hard in that volume to keep track of a thread. Then use smart folders to highlight types of messages. [me: would be interesting to see email divided by tabs/sets like for a given mailing list or interest like “New Threads”, “Old Threads I Replied To”, “Old Threads I Didn’t Reply To”]&lt;/p&gt;

&lt;p&gt;Q; How much time do you spend communicating with the community? Do you close out the world occasionally?&lt;br /&gt;
A: Think week-to-week, not day-to-day.&lt;/p&gt;

&lt;p&gt;Q: How do you pair program?&lt;br /&gt;
A: Ryan and Eric ping-pong at one screen, one keyboard. Turns into a contest to write the perfect failure test to force the other to spend maximum time coding the fix. “Coding Gang Bang” … give a person a big window on the projector and all they can do is type what they’re told. [me: yike! I don’t wanna be the typist!]&lt;/p&gt;

&lt;p&gt;Q: How much time do you spend on open source projects?&lt;br /&gt;
A: Sometimes a lot, sometimes a little. Depends on interest. Used to do a lot more but then hit burnout. Balance is very important. Smaller, simpler changes.&lt;/p&gt;

&lt;p&gt;Q: What happened to Robot Coop?&lt;br /&gt;
A: I left and worked for LimeWire for a while, left in August to decompress (worked on RubyGems) and now working on a top secret project.&lt;/p&gt;

&lt;p&gt;Q: You work closely with Ruby Core and have been thinking about productivity … what do you think needs tweaking?&lt;br /&gt;
A: Hard to say. The biggest problem is language barrier. ruby-dev’s titles are usually in english, so you can know what they’re talking about but not what they’re saying. ;]&lt;br /&gt;
A: (from bug manager on RubyForge project): Would love to see unification on one bug tracker.&lt;/p&gt;

&lt;p&gt;Q: You talked about the importance of bugtrackers. The impression is that Ruby Core wants to have bugs/patches submitted to the mailing list, not a tracker.&lt;br /&gt;
A: (Matz) It’s easier for me […] because I’m mail based.&lt;/p&gt;

&lt;p&gt;Q: Do you have a method size limit?&lt;br /&gt;
A: Yes! Roughly one window high (~26 lines). [me: shades of what Drew’s been&lt;/p&gt;

&lt;p&gt;Q: Do you lmit how long your rdoc is?&lt;br /&gt;
A: If it’s that long, the code should likely be refactored as it’s too complicated and needs that much explanation.&lt;/p&gt;

&lt;p&gt;Q; What if you want to document mindset or why you chose a particular implementation?&lt;br /&gt;
A; I make it a short note at the end of the line(s) where the implementation choice was made.&lt;/p&gt;

&lt;p&gt;Q: What methods do you use to increase coding speed?&lt;br /&gt;
A: I type on QWERTY (Ryan: “No, you don’t!”) Oh yeah, what am I saying, I type Dvorak (audience: Yay for pair programming!). Don’t change your keycaps or you won’t learn to touchtype. Autotest shaves a lot of time, ~2-10s per test run.&lt;/p&gt;

&lt;p&gt;Q: Using autotest, do you just not save interim (e.g. broken) code?&lt;br /&gt;
A: No, autotest has trained me not to. Instead, I write small pieces. Small test. Small method. Saves every 30 seconds or so.&lt;/p&gt;

&lt;p&gt;Q: How do you make it easier to pick up what you working on some time ago (a day or more)?&lt;br /&gt;
A; I break the work into chunks of a day or less, or spend a day in exploration.&lt;/p&gt;

&lt;p&gt;Q: How do you go about becoming a better coder?&lt;br /&gt;
A: Pair programming. Test-first. Seeing what other people do and challenging their beliefs. Keep learning.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf, Day 2: Essential Incompleteness in Program Modeling</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-day-2-.html"/>
   <updated>2007-11-03T10:50:25-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-day-2-</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Ahhhh … sleep makes all better. I came late today, caught the Rubinius part of the plenary and so didn’t have any comfortable way to live blog it … so I didn’t.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Walking our way to Godel’s incompleteness, in a hand-wavy sort of way.&lt;/p&gt;

&lt;p&gt;This statement is false.&lt;/p&gt;

&lt;p&gt;This statement is true (but not provable as English has no axioms)&lt;/p&gt;

&lt;p&gt;Godel theorem requires completeness and consistency&lt;/p&gt;

&lt;p&gt;Completeness: all statements are true and provable&lt;/p&gt;

&lt;p&gt;Consistency: all statements relate/are built on other statements.&lt;/p&gt;

&lt;p&gt;Godel says: Any sufficiently complex system cannot be complete or consistent. No sane person sacrifices consistency, so all (useful) modeled systems will be incomplete.&lt;/p&gt;

&lt;p&gt;Godel’s &lt;a href=&quot;http://en.wikipedia.org/wiki/Quine_%28computing%29&quot;&gt;quine&lt;/a&gt;: This statement is not provable.&lt;/p&gt;

&lt;p&gt;Godel’s theorem is general, not specific to mathematics.&lt;/p&gt;

&lt;p&gt;Barrow’s first law: Any Universe simple enough to be understood is too simple to produce a mind able to understand it.&lt;/p&gt;

&lt;p&gt;As folks were investigating set theory and real numbers, hoping these were a system which modeled reality completely and consistently. Bertrand Russell theorized “the set of all sets which do not contain themselves” which is paradoxical. This was disturbing, so they worked to define the system (Principia Mathematica) to eliminate the self-referential nature. Three volumes into this, Godel busted them with his theorem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applying this to Your Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t make inifinite stacks.&lt;/p&gt;

&lt;p&gt;Three parts: reality, your model of it, and your implementation of your model. You know your model will be incomplete *and you control in what ways it’s incomplete*. Exercise your power consciously.&lt;/p&gt;

&lt;p&gt;Applying Ramachandran energy modeling theory: Think of it as potential vs. kinetic energy. Predecision is potential: high energy state, etc.; post-decision starts you in motion, low energy and low tension, high movement. [me: he should have given a one sentence summation or Ramachandran theory at the top of this section; not doing so bogged him down].&lt;/p&gt;

&lt;p&gt;He made some observations re: high vs. low energy states, largely urging that you stay in high energy state as long as you can/need. [me: His observations seem to relate to some interpretations of Wilfred Bion’s work re: group psychology re: groups in working state being high tension]&lt;/p&gt;

&lt;p&gt;Decisions == energy deltas. Unmade decisions are high energy; made, low. Many unmade is expensive but flexible, most made is cheap but less flexible.&lt;/p&gt;

&lt;p&gt;Make decisions as late as possible – you’ll know more. And now we’ve derived agile programming as a good idea.&lt;/p&gt;

&lt;p&gt;Asymptotes: lines or curves which approach a line or curve arbitrarily closely without touching.&lt;/p&gt;

&lt;p&gt;“You can’t perfectly match reality but you can asymptotically approach it”&lt;/p&gt;

&lt;p&gt;Spending time on your model progressively increases the resolution of the model. Move the asymptote closer; don’t take “iteration” to mean “new approach” unless you can’t get closer with your current approach.&lt;/p&gt;

&lt;p&gt;Math hurts your brain in new and interesting ways, provides new ways to think about our problems, and is wicked fun. =]&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In 1979, Doug Hofstadter blew our minds with “ &lt;a href=&quot;http://books.google.com/books?id=aFcsnUEewLkC&amp;amp;dq=godel+escher+bach&amp;amp;pg=PP1&amp;amp;ots=FKVXdfdsxY&amp;amp;sig=GmsoEtdgEeV9SHYSDDc0PeyfLkI&amp;amp;prev=http://www.google.com/search%3Fq%3DGodel%2BEscher%2BBach%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dorg.mozilla:en-US:official%26client%3Dfirefox-a&amp;amp;sa=X&amp;amp;oi=print&amp;amp;ct=title&amp;amp;cad=one-book-with-thumbnail&quot;&gt;Godel Escher Bach&lt;/a&gt;” … over a quarter century later, the underlying ideas are still engaging a roomful of people. Excellent. Meanwhile, in 2__001, JP Lewis gave &lt;a href=&quot;http://www.idiom.com/~zilla/Work/Softestim/kcsest.pdf&quot;&gt;a similar talk&lt;/a&gt; at SIGGRAPH which was poorly received (and horribly, boringly delivered, despite him being a fundamentally interesting person and having a pile of humorous anecdotes from production). Luke’s presented it in a better context and with richer, more interesting sources.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf, Day 1, 4p: Hurting Code for Fun &amp; Profit</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-day--2.html"/>
   <updated>2007-11-02T13:48:55-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-day--2</id>
   <content type="html">&lt;p&gt;Ahhh, a nap makes all well. Last session of the day. Okay, you want to see these slides and the video once it’s posted by ConFreaks.&lt;/p&gt;

&lt;p&gt;“Legacy code is any code you haven’t written.”&lt;/p&gt;

&lt;p&gt;“People will press charges if you hurt them. Code won’t.”&lt;/p&gt;

&lt;p&gt;“My name is Ryan and I like to hurt code. And I’m OK.”&lt;/p&gt;

&lt;p&gt;Ruby Sadism: deriving pleasure from inflicting pain on software, esp. bad software.&lt;/p&gt;

&lt;p&gt;Ruby Asceticism: cahracterized by or … [not fast enough, in the slides] … self-discipline&lt;/p&gt;

&lt;p&gt;unit test is self discipline, YAGNI is abstention&lt;/p&gt;

&lt;p&gt;“Technical debt: skipping design is like borrowing money, refactoring is like repaying principal, interest is paid as time dealing with complexity.” – Ward Cunningham, ComplexityAsDebt, c2.com&lt;/p&gt;

&lt;p&gt;Use the Pareto Principle (aka 80/20 rule) to focus efforts&lt;/p&gt;

&lt;p&gt;Increase the signal:noise ratio. Big alligators, little alligators, swamp.&lt;/p&gt;

&lt;p&gt;“A developer’s obligation is to make sure that the code as written makes the clearest possible statement as to how the solution was understood …” –Ward Cunningham, &lt;a href=&quot;http://c2.com/cgi/wiki?TechnicalDebt&quot;&gt;TechnicalDebt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introspection Oriented Design: Find the “I” … how did I miss that bug, where did I go wrong.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[HE QUOTED COVEY’S FOUR QUADRANTS! I’M VERY EXCITED! COULD YOU TELL?]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Expand your mind; more knowledge is better.&lt;/p&gt;

&lt;p&gt;Write a lot of code. Make a lot of mistakes. Learn.&lt;/p&gt;

&lt;p&gt;Push yourself, then push yourself more.&lt;/p&gt;

&lt;p&gt;Mentarbator vs. Code Cowboy … find your sweet spot in the middle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools to Help&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Continuous integration and Autotest (with the doom guy)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ruby.sadi.st/Flog.html&quot;&gt;Flog:&lt;/a&gt; complexity reporter based on ABC metrics; the higher the score, the harder to test.&lt;/p&gt;

&lt;p&gt;Coverage tools: good to spot gaps, but don’t tell you the quality of your tests. 100% coverage with bad tests means nothing&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://rubyforge.org/projects/seattlerb&quot;&gt;Heckle&lt;/a&gt;: test mutator; if your tests pass after heckle, your tests are bad.&lt;/p&gt;

&lt;p&gt;Be passionate. If you love your code, hate it, hurt it.&lt;/p&gt;

&lt;p&gt;Q: Doesn’t using emacs violate your complexity rules?&lt;br /&gt;
A: Hey, I need an operating system, don’t I?&lt;/p&gt;

&lt;p&gt;Q: When does [code-generation] violate complexity?&lt;br /&gt;
A: When it gives you a bad feeling.&lt;/p&gt;

&lt;p&gt;Q: How much does your Evergreen background influence your philosophy?&lt;br /&gt;
A: Probably inverted my philosophy influenced the school I was compatible with. Stalker.&lt;/p&gt;

&lt;p&gt;Q: You talked about design and about how you should always be thinking about it. Should you design the whole thing in advance or what (Chelimsky)&lt;br /&gt;
A: I design iteratively, TDD-based. If you try to solve the whole problem up front, you’re going to have issues that many have written about.&lt;/p&gt;

&lt;p&gt;Q: How do you work with people who write bad code?&lt;br /&gt;
Hoy: I’ve seen him make somebody cry.&lt;br /&gt;
ZS: Who did I make cry?&lt;br /&gt;
Hoy: It was in private and I’m not going to say. It wasn’t me.&lt;br /&gt;
A: I try not to. Sometimes I’ll throw down the gauntlet and write something competing. Other times I’ll take advantage of ruby’s dynamic nature to just include what I need … I call it duck-raping&lt;/p&gt;

&lt;p&gt;Q: WRT tech depth, how do you not revisit code flags?&lt;br /&gt;
A: I use a tag system (fix refactor hack doc and others). It lets me keep my brain on track and move on. [me: this is important]&lt;/p&gt;

&lt;p&gt;Q: Have you found a way to automate heckle into your build process?&lt;br /&gt;
A: I have one lib (the png lib) that’s fully heckle-proof. Last iteration I hooked heckle into autotest; when it went green, it’d invoke heckle. The problem is the geometric expansion of tests.&lt;/p&gt;

&lt;p&gt;Q: Given that only one of your libs passes heckle, do you just seek a better score?&lt;br /&gt;
A: Heckle shows you the diff of your test and what it changed without making the test fail (e.g. replace an assignment with a nil). A rats nest of code with tight dependencies where it breaks if you change anything will pass Heckle.&lt;/p&gt;

&lt;p&gt;Q; are there tools you need as an ascetic that don’t exist yet?&lt;br /&gt;
A: Yes. Can’t name one off the top of my head.&lt;/p&gt;

&lt;p&gt;Q: Pair programming … useful for you?&lt;br /&gt;
A: Ask Eric. (laughs) I find I get a 250% output increase.&lt;/p&gt;

&lt;p&gt;Q: What’s your test:code ratio?&lt;br /&gt;
A: I don’t measure it often … generally 1.5:1 -ish but with artificial inflation of individual tests per argument, method, etc.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf, Day 1, Plenary Part 2: Advanced Ruby Class Design</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-day--1.html"/>
   <updated>2007-11-02T08:31:08-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-day--1</id>
   <content type="html">&lt;p&gt;&lt;em&gt;No coffee outside. How do they expect me to survive? However, the signs are out for the box lunches and they look to not suck.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jim starts with a slide of a Flame Maple guitar back. Very beautiful.&lt;/p&gt;

&lt;p&gt;Jim’s journey: FORTRAN (Physics),  Lisp (in a fortran class taught by &lt;a href=&quot;http://www.amazon.com/Little-LISPer-Third-Daniel-Friedman/dp/0023397632&quot;&gt;Daniel Friedman&lt;/a&gt;), C, Modula 2, C++, Eiffel, Java, FORTH, TCL, and Perl.&lt;/p&gt;

&lt;p&gt;On learning Lisp: “Yes, these are your father’s parentheses”&lt;/p&gt;

&lt;p&gt;Out to show interesting techniques that aren’t Java-esque.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Box 1: Master of Disguise, Rake::FileList&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s essentially a specialized array which can be init’d with a GLOB, has some extra methods including a custom to_s, and is a lazy evaluator. First cut inherited from Array (very non-Java, this inheriting from a concrete class)&lt;/p&gt;

&lt;p&gt;Be sure to call super in subclass initializers.&lt;/p&gt;

&lt;p&gt;Overrides Array’s various accessor methods to cause them to all auto-resolve on access. This makes fl + […] work, but doesn’t help with […] + fl … so implement to_ary which is automatically called. Which would be peachy except that inheriting from Array causes this not to be called. So don’t inherit from Array; instead contain one (and cause all your previously overridden accessors to access the contained array)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def [](index)
  resolve unless @resolved
  @items[index]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(and he showed an excellent metaprogramming method to handle defining all the accessors)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Box 2: The Art of Doing Nothing, Builder::XmlMarkup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;uses method_missing to construct tag accessors, but what about name collisions (e.g. class)?&lt;/p&gt;

&lt;p&gt;Inherits from BlankSlate (not Object):&lt;/p&gt;

&lt;p&gt;class BlankSlate&lt;br /&gt;
  instance_methods.each do |name|&lt;br /&gt;
    undef_method name unless name =~ /^__/&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;Kernel is a module included on all Objects, so this is icky:&lt;/p&gt;

&lt;p&gt;require ‘blank_slate’&lt;/p&gt;

&lt;p&gt;class Kernel&lt;br /&gt;
  def foo&lt;br /&gt;
    ‘foo’&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;And now BlankSlate is not blank. So use method_added hook (in Kernel) to catch when anyone reopens the class, then use that to have BlankSlate hide/remove the method if someone adds something to Kernel. Excellent, until:&lt;/p&gt;

&lt;p&gt;module Foo&lt;br /&gt;
  dev foo&lt;br /&gt;
    ‘foo’&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;class Object&lt;br /&gt;
  include Foo&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;@#%&amp;amp;! Time for the append_features hook and a nearly identical implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Box 3: Parsing without Parsing,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice to do this:&lt;/p&gt;

&lt;p&gt;User.select { |user|&lt;br /&gt;
  user.name == ‘jim’&lt;br /&gt;
}&lt;/p&gt;

&lt;p&gt;The Naive Implementation&lt;/p&gt;

&lt;p&gt;class User&lt;br /&gt;
  def self.select(&amp;amp;block)&lt;br /&gt;
    find(:all).select(&amp;amp;block)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;… perhaps a bit inefficient as you do a full table scan. ;] Might be good to offload the work to the database (but how to avoid SQL?)&lt;/p&gt;

&lt;p&gt;class User&lt;br /&gt;
  def self.select(&amp;amp;block)&lt;br /&gt;
    cond = block_to_condition(block)&lt;br /&gt;
    find(:all, :conditions =&amp;gt; cond)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;

&lt;p&gt;Use ParseTree: a la &lt;a href=&quot;http://errtheblog.com/post/10722&quot;&gt;Ambition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;user = TableNode.new(“users”)&lt;br /&gt;
result = user.name&lt;br /&gt;
puts result.to_s&lt;br /&gt;
users.name # &amp;lt;– that’s the SQL fragment to reference the db column&lt;/p&gt;

&lt;p&gt;class TableNode &amp;lt; Node&lt;br /&gt;
  def initialize(table_name)&lt;br /&gt;
    @table_name = table_name&lt;br /&gt;
  end&lt;/p&gt;

&lt;p&gt;  def method_missing(sym, *args, …&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[I can’t keep up. We’ll find his slides. I’m going to nap at lunch.]&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf, Day 1, Plenary Part 1: Welcome and Beautiful Code</title>
   <link href="http://blog.geekdaily.org/2007/11/rubyconf-day-1-.html"/>
   <updated>2007-11-02T07:23:10-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/rubyconf-day-1-</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Apologies in advance for quality issues; our crack team of writer just stepped off a red-eye and into the conference. It’s 9:10a and they’re still working on the AV connex. Ah, here we go.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Conference this year is ~15x as big as the first RubyConf. Dave: “For some reason, people keep coming back for more.”&lt;/p&gt;

&lt;p&gt;Plenary sessions in the morning, breakouts in the afternoon with Room 3 for work sessions and other non-presentations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Despite a late start, Dave finished the welcome 10 minutes early. Time for more coffee. And now acquired, having seen Evan (with our awesome Werewolf tees) and Tony Devlin, who say last night’s Werewolfery was good but long. Now up: Marcel, with “What makes code beautiful?” … I’ve &lt;a href=&quot;http://rubyhoedown2007.confreaks.com/session09.html&quot;&gt;seen him do this talk before&lt;/a&gt;, but I’m looking forward to seeing how it’s changed over the last few months.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What’s beautiful? Someone volunteered, “My wife!” which drew applause; someone else volunteered, “His wife!” which drew even louder laughter.&lt;/p&gt;

&lt;p&gt;Plato asserted that the properties of beuaty are deep and structural which appearances hint at. Discovering what those properties are gives you an understanding of what beauty is.&lt;/p&gt;

&lt;p&gt;Marcel’s history: came from literature background, which led him to artificial languages, and here we are. He was early-on interested in looking at ways to make meaning (two sentences can be identical to the last few words and have widely variant meaning) and choosing the properly expressive form for the purpose. Realized over the years of learning and coding that he was really interested in writing what he sees as beautiful code. After evaluating many languages, Ruby rung most true at a subconscious level.&lt;/p&gt;

&lt;p&gt;He desired to write software in search of beautiful code, so pursuing code beauty actively gets him to the desired end faster.&lt;/p&gt;

&lt;p&gt;Pythagoras, passing a blacksmith, noted that the hammering sound had an appealing quality. As he investigated, he discovered that there were mathematical relationships between the size of the hammer and the pitch of the strike, as well as a relation to musical intervals. This eventually became the basis of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Golden_ratio&quot;&gt;golden ratio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thomas Aquinas’ definition of beauty seems the most applicable to software.&lt;/p&gt;

&lt;p&gt;Elements of beauty:&lt;/p&gt;

&lt;p&gt;Proportion: Marcel invites a roomful of people, largely men, to consider his body. But not in depth. Specifically, his hand and arm. They’re very suited to their purposes. If you modified their proportions in  any way, they’d be less suited and thus less beautiful. Two parts of proportion: ratio of parts and economy of size. If everything were 10x, the ratio of parts would be undisturbed, but the economy of size would differ. &lt;em&gt;[I’d argue that there’s something about the system within which the thing exists that determines how economy of scale fits, and that it’s also arguable that form evolves to suit purpose as we cannot efficiently approach purposes for which we are not suited but if they are critical to our survival, we’ll evolve such that we can]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Integrity: Well-suited to its purpose. A crystal hammer might be beautiful, but it would shatter upon use.&lt;/p&gt;

&lt;p&gt;Clarity: Something that’s clear and simple (no more complex than required).&lt;/p&gt;

&lt;p&gt;Coerce example (in &lt;a href=&quot;http://rubyhoedown2007.confreaks.com/pdfs/session09.pdf&quot;&gt;the slides&lt;/a&gt;). Lines of code required can be a measure of proportionality; less is more. How long your unit tests take to run is another &lt;em&gt;[me: and perhaps a better one as it’s a real-world metric which affects how often you’ll run your tests … and the more you run your tests the better your code, right?]&lt;/em&gt;. Integrity is how well it behaves while running (does it leak memory?). Clarity is how expressive and readable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Rick DeNatale comments that his refactor of the coerce example ended up monkey-patching the String class rather than creating a new class. That might be another indicator of simplicity and how Ruby enables it.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kent Beck’s “ &lt;a href=&quot;http://www.amazon.com/Smalltalk-Best-Practice-Patterns-Kent/dp/013476904X&quot;&gt;Smalltalk: Best Practice Patterns&lt;/a&gt;” may not express it as being “beautiful” but it expresses it well.&lt;/p&gt;

&lt;p&gt;Rousseau equated “good” with “beauty in action”.&lt;/p&gt;

&lt;p&gt;Beauty is a moving target. It’s contextual: it’s not your parent’s beauty.&lt;/p&gt;

&lt;p&gt;Bohr: “An expert is a person who has made all the mistakes that can be made in a very narrow field.” &lt;em&gt;[me: this is another demonstration of my “make a lot of small mistakes fast” philosophy]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ruby is optimized for beauty.&lt;/p&gt;

&lt;p&gt;Try to imagine better modes of expression. Ugly things reveal mistakes. Make enough ugly things and you’ll make beautiful ones.&lt;/p&gt;

&lt;p&gt;Q: At what level can we apply this?&lt;br /&gt;
A: All levels, from a line of code to user experience&lt;/p&gt;

&lt;p&gt;Q: [Paraphrased: What’s the role of symmetry?]&lt;br /&gt;
A: [Paraphrased: Wide and varied]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Do Not Watch This While Eating or Drinking</title>
   <link href="http://blog.geekdaily.org/2007/11/do-not-watch-th.html"/>
   <updated>2007-11-01T09:17:00-07:00</updated>
   <id>http://blog.geekdaily.org/2007/11/do-not-watch-th</id>
   <content type="html">&lt;p&gt;Let my mistake be your forewarning. As I’m settling in to finish a last bit of serious work before heading to &lt;a href=&quot;http://rubyconf.com&quot;&gt;RubyConf&lt;/a&gt; tonight, my eyes fell on &lt;a href=&quot;http://www.escapistmagazine.com/articles/view/editorials/zeropunctuation/2541-Zero-Punctuation-The-Orange-Box&quot;&gt;The Escapist’s Zero Punctuation Review&lt;/a&gt; of &lt;a href=&quot;http://orange.half-life2.com/&quot;&gt;Valve’s Orange Box&lt;/a&gt;.&lt;/p&gt;

&lt;embed src=&quot;http://update.videoegg.com/flash/proxy.swf?jsver=1.4&quot; flashvars=&quot;gc=c2hvd0FkPXRydWUmYWRWYXJzPWFyZWE9Z2FtZXMmc2l0ZT1lc2NhcGlzdG1hZ2F6aW5lJmZpbGU9aHR0cCUzQSUyRiUyRnNlbGZzZXJ2ZTMwMCUyRWRvd25sb2FkJTJFdmlkZW9lZ2clMkVjb20lMkZnaWQzODklMkZjaWQxMzg5JTJGOFElMkZCTSUyRjExOTI0NTAxMTB1V0NKdjNQRElBbHlFdHhJQ1VjYSZzd2ZwYXRoPWh0dHAlM0ElMkYlMkZ1cGRhdGUlMkV2aWRlb2VnZyUyRWNvbSUyRmZsYXNoJTJGcHJveHklMkVzd2YlM0Zqc3ZlciUzRDElMkU0JmF1dG9QbGF5PWZhbHNlJnNob3dBZFByaW1hcnk9dHJ1ZSZ3bW9kZT13aW5kb3cmYWxsb3dGbGFzaDlGdWxsc2NyZWVuPXRydWU=&quot; quality=&quot;high&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; scale=&quot;noscale&quot; wmode=&quot;window&quot; width=&quot;400&quot; height=&quot;332&quot; name=&quot;VE_Player&quot; align=&quot;middle&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; /&gt;
&lt;p&gt;&amp;lt;/embed&amp;gt;&lt;/p&gt;

&lt;p&gt;This is blow-coffee-out-your-nose-FUNNY. Now I just wish they had a Wii version of &lt;a href=&quot;http://orange.half-life2.com/portal.html&quot;&gt;Portal&lt;/a&gt;; until then I’ll have to settle for &lt;a href=&quot;http://portal.wecreatestuff.com/&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A Plethora of Rails Podcasts</title>
   <link href="http://blog.geekdaily.org/2007/10/a-plethora-of-r.html"/>
   <updated>2007-10-26T15:55:13-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/a-plethora-of-r</id>
   <content type="html">&lt;p&gt;The guys at &lt;a href=&quot;http://railsenvy.com/&quot;&gt;Rails Envy&lt;/a&gt; (makers of fine Rails spoof commercials) started an audio-only &lt;a href=&quot;http://railsenvy.com/podcast&quot;&gt;podcast&lt;/a&gt; at the beginning of this month. I really like their podcast; it’s short (&amp;lt; 10m, mostly), a bit like a news-snippet fest, and the collective sense of humor that is Jason and Gregg is undiluted. It’s a touch stilted at times (and they call themselves on it) and is sponsored by &lt;a href=&quot;http://pragmaticstudio.com/&quot;&gt;Pragmatic Studio&lt;/a&gt; (which is frequently mentioned in the podcast).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://answers.google.com/answers/threadview?id=700799&quot;&gt;Good stuff, Maynard!&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>My First Rails Plugin: GenerallyUseful</title>
   <link href="http://blog.geekdaily.org/2007/10/my-first-rails-.html"/>
   <updated>2007-10-26T12:45:13-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/my-first-rails-</id>
   <content type="html">&lt;p&gt;I’m having a &lt;a href=&quot;http://www.amazon.com/Fisher-Price-GeoTrax-System-Central-Station/dp/B000NWX2W8&quot;&gt;Fisher-Price moment&lt;/a&gt; today as I publish &lt;a href=&quot;http://agilewebdevelopment.com/plugins/generally_useful&quot;&gt;my first Rails plugin&lt;/a&gt;. It’s nothing spectacular, just some rake tasks I like to have around in my apps plus a little module with functions to programmatically list the available Rails environments and provide some (shorter or useful) aliases for the usual suspects. It’ll grow as I think up and/or trip over more interesting rake tasks.&lt;/p&gt;

&lt;p&gt;Comments, critiques, and cookies always welcome.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cornplastic!</title>
   <link href="http://blog.geekdaily.org/2007/10/cornplastic.html"/>
   <updated>2007-10-25T13:15:26-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/cornplastic</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.geekdaily.org/2006/03/biodegradable_d.html&quot;&gt;A year and a half ago&lt;/a&gt; I tripped over &lt;a href=&quot;http://www.ecoproducts.com/&quot;&gt;Ecoproducts’&lt;/a&gt; line of &lt;a href=&quot;http://www.ecoproducts.com/Business/food_services/food_containers/fs_containers_corn_food_pack.htm&quot;&gt;biodegradable “plastic” disposable food containers&lt;/a&gt; made out of corn. Today I’ve had my &lt;a href=&quot;http://www.f-k.com/component/option,com_content2/Itemid,74/task,view/id,185/cat,34/&quot;&gt;first such container&lt;/a&gt; (made by &lt;a href=&quot;http://www.f-k.com/&quot;&gt;Fabri-Kal&lt;/a&gt;, a competitor) handed to me at &lt;a href=&quot;http://comfortscafe.com&quot;&gt;Comforts&lt;/a&gt;, a deli and cafe in downtown San Anselmo (a lovely, busy place, btw). Were it not labeled I wouldn’t have noticed the difference.&lt;/p&gt;

&lt;p&gt;Nice.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A(nother) Blast From The Past</title>
   <link href="http://blog.geekdaily.org/2007/10/another-blast-f.html"/>
   <updated>2007-10-24T22:14:32-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/another-blast-f</id>
   <content type="html">&lt;p&gt;A very smart friend of mine named &lt;a href=&quot;http://sneeper.livejournal.com/&quot;&gt;Andy&lt;/a&gt; posted &lt;a href=&quot;http://www.youtube.com/watch?v=-4CV05HyAbM&quot;&gt;this video&lt;/a&gt; on his &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt; profile:&lt;/p&gt;

&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param value=&quot;http://www.youtube.com/v/-4CV05HyAbM&amp;amp;rel=1&quot; name=&quot;movie&quot; /&gt;
&lt;param value=&quot;transparent&quot; name=&quot;wmode&quot; /&gt;
&lt;embed width=&quot;425&quot; height=&quot;355&quot; wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.youtube.com/v/-4CV05HyAbM&amp;amp;rel=1&quot; /&gt;&lt;/object&gt;

&lt;p&gt;Besides being engaging, it showed &lt;a href=&quot;http://www.google.com/search?q=the+first+website&quot;&gt;a google search&lt;/a&gt; which leads to the &lt;a href=&quot;http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.html&quot;&gt;w3.org’s archive of the first website ever&lt;/a&gt;. Bonus: the &lt;a href=&quot;http://www.w3.org/History/19921103-hypertext/hypertext/DataSources/bySubject/Overview.html&quot;&gt;first ever categorized list of websites&lt;/a&gt;, back when it seemed like we could invent a taxonomy to cover the internet (shades of &lt;a href=&quot;http://search.yahoo.com/dir&quot;&gt;Yahoo!&lt;/a&gt; ;) and … an even earlier &lt;a href=&quot;http://www.w3.org/History/19921103-hypertext/hypertext/DataSources/WWW/Servers.html&quot;&gt;list of web servers circa 1992&lt;/a&gt; … thus &lt;a href=&quot;http://blog.geekdaily.org/2007/10/a-blast-from-th.html&quot;&gt;referential nature&lt;/a&gt; of the title of this post.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>An API on an API</title>
   <link href="http://blog.geekdaily.org/2007/10/an-api-on-an-ap.html"/>
   <updated>2007-10-24T20:45:56-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/an-api-on-an-ap</id>
   <content type="html">&lt;p&gt;Takin’ it to the next level: RockYou! offers an API to their Super Wall app, allowing your Facebook app to post content on someone’s Super Wall.&lt;/p&gt;

&lt;p&gt;Interesting.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Link: [Facebook&lt;/td&gt;
      &lt;td&gt;Super Wall API](http://apps.facebook.com/superwall/developers.php “Facebook&lt;/td&gt;
      &lt;td&gt;Super Wall”).&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 3, Opening the Social Graph</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-7.html"/>
   <updated>2007-10-09T15:24:59-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-7</id>
   <content type="html">&lt;p&gt;&lt;em&gt;I took a session off to catch up on some other bits. Back in now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenFaced panel: Opening Up the Social Graph&lt;/strong&gt; - &lt;a href=&quot;http://graphingsocial.com/speakers#tantek-celik&quot;&gt;Tantek Celik&lt;/a&gt; (moderator), &lt;a href=&quot;http://graphingsocial.com/speaker#david-recordon-sixapart&quot;&gt;David Recordon&lt;/a&gt; SixApart, &lt;a href=&quot;http://graphingsocial.com/speakers#chamath-palihapitiya-facebook&quot;&gt;Chamath Palihapitiya&lt;/a&gt; Facebook, &lt;a href=&quot;http://graphingsocial.com/speakers@joseph-smarr-plaxo&quot;&gt;Joseph Smarr&lt;/a&gt; Plaxo, &lt;a href=&quot;http://graphingsocial.com/speakers#ted-grubb-satisfaction&quot;&gt;Ted Grubb&lt;/a&gt; Satisfaction Unlimited&lt;/p&gt;

&lt;p&gt;Dave McClure “threw down the gauntlet” to Google and Yahoo: if you want to participate in open standards, show up.&lt;/p&gt;

&lt;p&gt;[I’ve followed Joseph a bit as he’s been talking about Pulse, a social network aggregator. While I don’t know Ted, I know several other folks at Satisfaction via Christina. &amp;lt;/disclaimer&amp;gt;]&lt;/p&gt;

&lt;p&gt;Joseph led with a Pulse demo. Maybe that’s what everyone will do, but I’m not diggin’ it. Damn that boy talks fast.&lt;/p&gt;

&lt;p&gt;David Recordin talks a bit about his role as kinda the gluemeister at 6A, standing among and between all the 6A products and looking at smart choices for them all. Also coming to this problem from the &lt;a href=&quot;http://vox.com/&quot;&gt;vox.com&lt;/a&gt; perspective. He also lent the laptop folks are demoing from.&lt;/p&gt;

&lt;p&gt;Ted shows how Satisfaction is importing user profiles via microformats. MFs are supported all over the place. [me: we should add them to PS] [CW agrees]. Showed how to get the MF profile data from flickr. It also autosyncs, inheriting changes. [me: this lends an interesting model for connecting disparate graphs and makes the connections valuable]&lt;/p&gt;

&lt;p&gt;Chamath got pinged on where he thinks open social graph fits … and almost bit, but stepped back to present FBs take on social graphs. He asserts they believe the world has one social graph. FB has to make sure they make their version of social graph as open as possible (viz they had APIs for social graph data 6 months before FB platform). They intend to get more open over time. Urges to remember that they had to lay a foundation of privacy and respect before people would be comfortable sharing things like name, location, phone, AIM, etc. Scale of this effort is going to be in years, not months.&lt;/p&gt;

&lt;p&gt;6A: David Recordon&lt;br /&gt;
FB: Chamath Palihapitiya&lt;br /&gt;
PX: Joseph Smarr&lt;br /&gt;
SU: Ted Grubb&lt;/p&gt;

&lt;p&gt;6A: consider any obfuscated object (hashed email) same as the underlying object — if they don’t want to share email, don’t use hashed email as an identifier.&lt;/p&gt;

&lt;p&gt;FB: If you can combine a good privacy model with a graph that remains relevant as it grows, you’ll allow sites to remain relevant … unless users decide to choose a different site. In the end, we’re at their mercy. [me: as it should be]&lt;/p&gt;

&lt;p&gt;PX: Everybody does better when users are in control of their information. http://opensocialweb.org/ User Bill of Rights [me: shades of Ira Glass’s commentary about Ten Commandments] It’s not a tech problem; it’s more a social, political, privacy problem which is (hopefully) a better problem to have.&lt;/p&gt;

&lt;p&gt;MOD: What are the problems for the OSG?&lt;/p&gt;

&lt;p&gt;SU: Keeping it as simple and managable for the user&lt;br /&gt;
6A: Defining the problem is still the problem. We need to take a step back to see what consumers want. Dave Winer pointed out that they don’t know what OSG means … we need a consistent model, offline and online, which breaks it down in their terms (I have friends, etc.). Embody social conventions of the offline world: if you have the email address of someone in my contacts, you can have their phone number (you’d email me and ask, I’d say yes, etc.)&lt;/p&gt;

&lt;p&gt;MOD polls the room for who’s members of multiple nets, decreasing hands as he raises the number of nets.&lt;/p&gt;

&lt;p&gt;MOD: How much does this matter?&lt;/p&gt;

&lt;p&gt;[missed the answer. was short and felt unsubstantial]&lt;/p&gt;

&lt;p&gt;PX: For the people I know on FB (a subset of all) I can get some information. Just like in the real world people want to opt in or out&lt;/p&gt;

&lt;p&gt;SU: We want the conversations going inside Satisfaction, but we also want people [companies?] to be able to take those conversations to their own websites. We couldn’t do that as a FB app.&lt;/p&gt;

&lt;p&gt;FB: Info expires because we’re custodians of the information. We don’t own it.&lt;/p&gt;

&lt;p&gt;6A: 24 hour timeout of data you get via the API for more than 24 hours. [me: be sure to segment and age that data]&lt;/p&gt;

&lt;p&gt;FB: If they’re engaged and using you regularly you’ll always have that fresh info. [me: this sort of introduces aging memory to digital info]&lt;/p&gt;

&lt;p&gt;Q: What are you all thinking about OpenID?&lt;br /&gt;
A: Nearly all do or are getting it running. SU is using MF data but not publishing it?&lt;/p&gt;

&lt;p&gt;Q: What about the “Peace and Love” or “Platform Wars” Tim O’Reilly spoke of this morning?&lt;br /&gt;
6A: Ask again in a year.&lt;br /&gt;
FB: We intend to keep providing what it takes to empower developers to engage and please users.&lt;/p&gt;

&lt;p&gt;Q: What does “open” mean?&lt;br /&gt;
PX: You’re open when you free your data.&lt;br /&gt;
SU: Allowing users to own their data.&lt;br /&gt;
6A: Allow users to freely manipulate and remove their info.&lt;br /&gt;
FB: Enable users to decide how they interact with people.&lt;/p&gt;

&lt;p&gt;Q: FB’s API limits access to some data. That’s at odds with being open.&lt;br /&gt;
FB: Our API is evolutionary. We want to keep our users data protected and iterate carefully.&lt;br /&gt;
6A: We’re not yet sharing info via microformats as we don’t think we’ve yet set the stage for users to understand that the info could be regarded as their identity and how it could be shared/used.&lt;/p&gt;

&lt;p&gt;Q: Mark Zuckerberg said FB would deliver openID and microformats when users want it. Who wants it?&lt;br /&gt;
(lots of raised hands and pics)&lt;/p&gt;

&lt;p&gt;Q: FB wants one social graph … don’t you have to open it up?&lt;br /&gt;
FB: We think there’s one in the world, we’re trying to model it accurately and efficiently.&lt;/p&gt;

&lt;p&gt;Q: Bebo and others will likely release APIs which resemble FB. What do you think will be the open app model?&lt;br /&gt;
FB: Clearspring (?) already exists and embodies the model of build once publish many, which gets the details out of the way and allows companies to focus on engaging users.&lt;br /&gt;
PX: Less true of stitching the OSG across many sites. It’s not a theoretical argument at this point.&lt;/p&gt;

&lt;p&gt;MOD: What’s next in terms of supporting OSG?&lt;br /&gt;
PX: Looking to help you syndicate your friends list across many sites.&lt;br /&gt;
SU: Implementing OpenID and syncing hCard&lt;br /&gt;
6A: Build in tools to allow our users to control who they interact with via their content.&lt;br /&gt;
FB: We want as much info to flow across the graph and touch everyone in the world.&lt;/p&gt;

&lt;p&gt;_[Interesting thought: mark all information with a value of how personal it is to you (think: slider with 3-5 presets, a la “more of this/less of this”)]&lt;/p&gt;

&lt;p&gt;Chamath was, I think, the most thoughtful and well-spoken. Joseph obviously has a billion ideas screaming around in his head waiting to get out. No slight to David or Ted implied or intended. And now I’m out, heading to see &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel Spolsky&lt;/a&gt; in Emeryville._&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>TypePad 8 my homewerks.</title>
   <link href="http://blog.geekdaily.org/2007/10/typepad-8-my-ho.html"/>
   <updated>2007-10-09T12:27:56-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/typepad-8-my-ho</id>
   <content type="html">&lt;p&gt;I had a nice live blog going on Jeremiah Robinson’s talk and then I didn’t.&lt;/p&gt;

&lt;p&gt;I’ll have to read the slide show and riff on it later.&lt;/p&gt;

&lt;p&gt;Grrr.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 3, Facebook App Design: Elements of Style</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-6.html"/>
   <updated>2007-10-09T12:14:05-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-6</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Time for Jia Shen. He’s a good speaker with dense content delivered well. This should be fun.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jia Shen of RockYou!&lt;/p&gt;

&lt;p&gt;RockYou does many popular FB apps as well as widgets all around; more than 10% penetration in all leading social networks.&lt;/p&gt;

&lt;p&gt;FB apps are growing ~7x faster than widgets elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concept and Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think mathematically&lt;/p&gt;

&lt;p&gt;Gauge target audience: get specific. how big is it? [me: he touches on &lt;a href=&quot;http://windowmanager.blogspot.com/2005/05/wth-is-tam-sam-som.html&quot;&gt;TAM/SAM/SOM&lt;/a&gt; without knowing it]&lt;/p&gt;

&lt;p&gt;Model which viral channels you’ll be leaning into: invites? notifications?&lt;/p&gt;

&lt;p&gt;Your app name is a viral channel: they add you, it’s in their minifeed, newsfeed, and on left nav.&lt;/p&gt;

&lt;p&gt;Why and how will it spread? How will people share it and share within it? Design your callouts from there.&lt;/p&gt;

&lt;p&gt;Invites: for each install:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;User invites some people&lt;/li&gt;
  &lt;li&gt;Some pct open invite&lt;/li&gt;
  &lt;li&gt;Some pct who open invite install it&lt;/li&gt;
  &lt;li&gt;Some pct who install will uninstall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…must be bigger than 1, more like 2. Over time, this will make growth.&lt;/p&gt;

&lt;p&gt;Validate the use case – typical users will use it?&lt;br /&gt;
Test call to action – will they click?&lt;br /&gt;
Validate viral model – any broken links?&lt;/p&gt;

&lt;p&gt;Dev process should by hyper-agile with tons of instrumentation. Measure everything: invites, clickthrus, demos, minifeeds, etc.&lt;/p&gt;

&lt;p&gt;Prepare for A/B testing. You’re releasing fast, so you want to be able to change things around radically and quickly.&lt;/p&gt;

&lt;p&gt;Site stats (google analytics and quantcast again)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Launch!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Phase it out there: make sure it’s totally working before you make your splash (1-5K users will give good infor for tuning) then go big.&lt;/p&gt;

&lt;p&gt;Promote on ad networks for guranteed performance and hitting your target audience. Tune the ad as you see results.&lt;/p&gt;

&lt;p&gt;Ad nets on FB: RockYou (of course), SocialMedia, et al&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tuning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Validate the viral model: identify the total multipliers and look for weaknesses&lt;/p&gt;

&lt;p&gt;Find new channels: how are users usint it? did you miss something? Integrate with other apps (viz. WereWolves, Vampires, Slayers, etc)&lt;/p&gt;

&lt;p&gt;Tune your underlying channels: make sure your notifications aren’t spammy, that you’re targeting well, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monetizing it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maintain comfortable growth and keep tuning, seeking more engagement. Encourage people to interact in your apps.&lt;/p&gt;

&lt;p&gt;Engagement creates value for you to capture.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Some rehash of what I’ve heard from him before (no surprise) but some new stuff, and interesting to see his talk evolve.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 3, FB Apps with ASP.NET, Silverlight, and Popfly</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-5.html"/>
   <updated>2007-10-09T11:50:55-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-5</id>
   <content type="html">&lt;p&gt;&lt;em&gt;I’ll be really thin here, splitting attention between session and some code. Also, it’s more demo based, so this is largely my comments and inferences rather than Dan’s talk.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Aiming to enable non-developers with Popfly.&lt;/p&gt;

&lt;p&gt;Users are the stars. The “best” users should be treated like rockstars; get to know them and cater to them.&lt;/p&gt;

&lt;p&gt;Embrace self-expression. Be personal.&lt;/p&gt;

&lt;p&gt;Entertain. Evidently people want to earn points to buy virtual poop (example from a session I missed yesterday)&lt;/p&gt;

&lt;p&gt;For devs: Free, client-side file hosting, works with open source AJAX. You can fully control the code.&lt;/p&gt;

&lt;p&gt;The general interface is a node-based graph where you connect outputs to inputs; for my Anim/VFX friends, it’s like Shake but with a white background and nodes look like spinny cubes. Ooo. ;p&lt;/p&gt;

&lt;p&gt;You connect blocks and can see the results interactively. Good iterative development workflow.&lt;/p&gt;

&lt;p&gt;It does dynamic resizing, so making it very small or very big is straightforward.&lt;/p&gt;

&lt;p&gt;Building a block for it is pretty straihgtforward; you can clone others as a start, or start from scratch. It’s just javascript underneath.&lt;/p&gt;

&lt;p&gt;Also makes it easy for users to skin or mash things. Great engagement.&lt;/p&gt;

&lt;p&gt;He shows you can use scriptaculous and, off-hand, says “it’s an open-source library used on Apple.com” … almost like a “see, it’s not part of our empire, really”&lt;/p&gt;

&lt;p&gt;All built on free frameworks (silverlight, et al) so cross-platform, cross-browser compatible.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 3, FB Platform, Apps, Metrics</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-4.html"/>
   <updated>2007-10-09T10:47:50-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-4</id>
   <content type="html">&lt;p&gt;&lt;em&gt;We’re now 50 minutes behind schedule. Woot! Also, Dave McClure “dated himself” by mentioning back when he was programming VB was the rage. Made me chuckle.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Platform, Apps, and Metrics&lt;br /&gt;
Dave Morin, Facebook&lt;/p&gt;

&lt;p&gt;FB is a tech company.&lt;/p&gt;

&lt;p&gt;[I stepped out for a moment]&lt;/p&gt;

&lt;p&gt;Concentrated pretty heavily in 18-24, but outside of that bias it’s fairly in line with average demographics.&lt;/p&gt;

&lt;p&gt;More than 50% users return daily. They like this; they want to be a utility. 60B pages per day, ~6th most trafficed site. They watch this but try not to pay too much attention to it.&lt;/p&gt;

&lt;p&gt;FB doesn’t want to own the social graph, just to map it as efficiently as possible.&lt;/p&gt;

&lt;p&gt;They try to focus on allowing people to represent their identity online well.&lt;/p&gt;

&lt;p&gt;Then, they try to make it really easy for people to communicate, both 1-to-1 and 1-to-many. It strengthens relationships.&lt;/p&gt;

&lt;p&gt;They’ve grown ~3%/week. This has made the social graph stronger. The 43-millionth user gets the same utility from the social graph as the first [me: I’d argue more value, but he’s being modest]&lt;/p&gt;

&lt;p&gt;FB is the largest photo sharing site on the net, because it ties into the social graph.&lt;/p&gt;

&lt;p&gt;FB events was done in a night. And it’s more than 3x bigger than Evite.&lt;/p&gt;

&lt;p&gt;FB Platform: Deep integration, Mass distribution, and New opportunities&lt;/p&gt;

&lt;p&gt;What’s it mean to be open when based on user data? [he left this hanging]&lt;/p&gt;

&lt;p&gt;They want anyone to be able to build an app as good/bad as theirs.&lt;/p&gt;

&lt;p&gt;Three integration points: Profiles, Full Pages (canvas pages), home page&lt;/p&gt;

&lt;p&gt;[he walks thru the elements of profiles, etc. stuff you can get better explained in the wiki]&lt;/p&gt;

&lt;p&gt;Best practices: (looking at photos)&lt;/p&gt;

&lt;p&gt;context is king.&lt;/p&gt;

&lt;p&gt;Canvas page: it’s really important to represent the social context around your application. Show relevant, up-to-date content through the lens of your friends.&lt;/p&gt;

&lt;p&gt;Content page: If a user adds a comment, they’ve bought in and are more likely to upload content, etc. Make sure you engage users as fractionally as they care to; make the threshold very low.&lt;/p&gt;

&lt;p&gt;People aren’t using the minifeed enough. Every time a user acts in some user/group’s direction, put it on the minifeed.&lt;/p&gt;

&lt;p&gt;Media in the feed updates (e.g. pix) drive engagement.&lt;/p&gt;

&lt;p&gt;FB’s opportunity composed of growth, engagement, and monetization. The platform makes growth and engagement as straightforward as possible.&lt;/p&gt;

&lt;p&gt;fbFund was launched to help seed the community with grants without taking equity to help folks “get out from under the man”&lt;/p&gt;

&lt;p&gt;How’s it going: over 5K apps, over 100 new apps a day, over 90K developers, 80% of users have already adopted one or more apps.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;He made good time; we’re now only 25 minutes behind schedule.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 3, Keynote</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-3.html"/>
   <updated>2007-10-09T10:19:03-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-3</id>
   <content type="html">&lt;p&gt;&lt;em&gt;A late start, thankfully, as there was horrible traffic this morning.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Facebook Application Market&lt;br /&gt;
Tim O’Reilly (wearing a Zimbra t-shirt)&lt;/p&gt;

&lt;p&gt;What they really do at O’Reilly: change the world by spreading information to innovators through books and conferences&lt;/p&gt;

&lt;p&gt;Watch the alpha geeks to see where the technology is headed (e.g. pringles can wifi antennas implies ubiquitous network, screen-scraping implies web services, the pedal-powered internet implies alternative energy focus)&lt;/p&gt;

&lt;p&gt;Social nets are all hacks working around not *really* knowing who our social network is (my phone knows, but I have to tell the app)&lt;/p&gt;

&lt;p&gt;http://radar.oreilly.com/research/reports/&lt;/p&gt;

&lt;p&gt;(Tim presents a lot of slide andvery fast … and mostly image based. Good choice)&lt;/p&gt;

&lt;p&gt;87% of FB usage is 2% of the apps, which could be very bad news for all the excited app developers (take it with a grain of salt; it’s early in its life … could just be that you’ve got to be wicked viral and really quickly)&lt;/p&gt;

&lt;p&gt;FB app uptake is not even a power law distribution (?) nor log-log.&lt;/p&gt;

&lt;p&gt;Many apps cluster around the same users, competing for htem.&lt;/p&gt;

&lt;p&gt;Top 5 categories of apps ranked by active users: sports, gaming, chat, fashion, fun (~10%)&lt;/p&gt;

&lt;p&gt;Top 5 by number of apps in category: fun, messaging, gaming, video, chat&lt;/p&gt;

&lt;p&gt;Top 5 with &amp;gt; 100K users: messaging, dating, gaming, video, fun&lt;/p&gt;

&lt;p&gt;Top ten are predominantly is pwned by slide, RockYou.&lt;/p&gt;

&lt;p&gt;Top apps adoption rates have slowed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Web 2.0 Refresher&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s all about openness, sharing, blah, blah, … and peace and love. ;]&lt;/p&gt;

&lt;p&gt;Systems that harness network effect to get better as people use them.&lt;/p&gt;

&lt;p&gt;Building a collective db: pay folks to do it (early Yahoo), get volunteers (Wikipedia now), architect it into the heart of the  (P2P file sharing, Google … and FB)&lt;/p&gt;

&lt;p&gt;Harnessing collective intelligence: web2.0 companies are building collective databases whose value follows the number of participants.&lt;/p&gt;

&lt;p&gt;Remember: the web has always been about users creating content.&lt;/p&gt;

&lt;p&gt;Google’s breakthru was finding meaning in all that original, chaotic UGC and turn it into valuable real-time, user-facing services.&lt;/p&gt;

&lt;p&gt;Wasabe (and Mint) can look at how you spend your money as an implicit action aka vote. [me: Interesting thing to aggregate]&lt;/p&gt;

&lt;p&gt;What’s the equivalent of intelligence when filtering my feed? example: geni.com knows about family, company directory knows who’s working at O’Reilly, amazon knows who’s written books for O’Reilly.&lt;/p&gt;

&lt;p&gt;The phone company knows who your friends are: who’d you call and who called you and how often and such. They won’t do anything with it (c’mon, they’re the phone company). It’d be interesting to get into that data. They’re doing it with email a little; Xobni is doing it a lot.&lt;/p&gt;

&lt;p&gt;Web 2.0 is about the future of the Internet Operating System (data subsystems)&lt;br /&gt;
Location, id, time, products, media types, relationships, price, tags … what else?&lt;/p&gt;

&lt;p&gt;Platforms beat apps every time: Lotus 1-2-3, WordPerfect, Netscape all got beaten by Excel, Word, and IE&lt;/p&gt;

&lt;p&gt;Two types of platform: One Ring to Rule Them All (CW: Two keynotes in a row!) or Small Pieces Loosely Joined. The latter seems the robust model; no one will own it all, but we can all join in.  6A is opening the social graph (David Recordon), XFN microformat, etc.&lt;/p&gt;

&lt;p&gt;Learn everything you can from your users. If google was a restaurant they’d be weighing every unfinished plate, adjusting portion sizes, etc.&lt;/p&gt;

&lt;p&gt;Make your app get better in proportion with the size of your userbase, not just more busy and more crowded. FB is struggling with this a bit.&lt;/p&gt;

&lt;p&gt;Make sure you’re getting a steady diet of data. If data is the “intel inside” of web 2.0, what data do you own? Make sure your apps are gathering interesting data.&lt;/p&gt;

&lt;p&gt;Offer compelling user-facing services.&lt;/p&gt;

&lt;p&gt;Be sure you offer more value than you worry about capturing. Does platform give me and my users control? Users are smart, developers are smart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I want from the social graph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reflect my real social network. 5K address book entries, hundreds of FB friends, mostly folks reaching out to Tim. [me: I bet he says his phone knows who’s really his friend]&lt;/p&gt;

&lt;p&gt;Help me manage those contacts (how to reach them, how they like to be reached, how they’re doing) including my friends, acquaintances, and &lt;strong&gt;even people I don’t know at all&lt;/strong&gt; but have heard about and want to follow. The amount of info I need is inversely relational to how close we are.&lt;/p&gt;

&lt;p&gt;Help me group people meaningfully.&lt;/p&gt;

&lt;p&gt;Relationships are asymmetrical&lt;/p&gt;

&lt;p&gt;Fine grained control over what to see vs. not (e.g. show me their photos and blogs, not their tweets, etc)&lt;/p&gt;

&lt;p&gt;Discover interesting people&lt;/p&gt;

&lt;p&gt;Look at geni.com: a special purpose social network that provides excellent reference material for both people and apps.&lt;/p&gt;

&lt;p&gt;On FB’s relationship offerings when acknowledging a friend request with Steve Case, to whom he’d sold a company: “We hooked up? *laughs* Actually, that probably is accurate …”&lt;/p&gt;

&lt;p&gt;Freebase/MetaWeb is doing interesting things with a structured taxonomy of info.&lt;/p&gt;

&lt;p&gt;What does the person want to display about themselves? What of that do I wish to consume? I’d almost want to rearrange their profile to suit my purpose. [me: this is becoming a theme – profiles are for the consumer/viewer, not the person]&lt;/p&gt;

&lt;p&gt;Jaiku was acquired by Google.&lt;/p&gt;

&lt;p&gt;Your phone knows where you are. How often have you called someone and found out they’re in a different timezone … or in your timezone [me: gathering intelligence about who’s doing what according to where they are/were, viz. Jaiku founder/developer spending a lot of time in Silicon Valley lately]&lt;/p&gt;

&lt;p&gt;“I’m an inventor. I became interested in long term trends because an invention has to make sesne in the world in which it is finished, not he world in which it is started.” — Ray Kurzweil&lt;/p&gt;

&lt;p&gt;Think out to the possible future and design for it, not for now.&lt;/p&gt;

&lt;p&gt;Q&amp;amp;A&lt;/p&gt;

&lt;p&gt;Q: You mentioned you study history, and Microsoft. They dominate a developer community. Are machines the new developer, or is it still people?&lt;br /&gt;
A: It’s still the people, though machines are doing a lot more dynamically in the mix. If you look back at the history of MS, … the real test is whether a large number of developers are able to make significant money on the platform and survive. At the end of the day MS absorbed its dev community, and that’s when it went stagnant. … whoever’s the winner of the web 2.0 wars will end up in that same spot.&lt;/p&gt;

&lt;p&gt;Q: In regards to the criteria you’d advise for startups, on your own domain vs. on FB, etc.&lt;br /&gt;
A: I’m not sure it matters. One of my fundemental beliefs about web 2.0 is that no matter where it is it’s about distribution. Depending on your biz model more distribution may be better. The companies on the top are using all of these well; their fundemental biz is developing relationships with their users thru as many contact points as possible. (Incidentally, people seem to be choosing either web or FB; only about 5% overlap according to someone from iLike). App should be focused on the user and interaction with them. [Be mindful of what data you get vs. waht FB gets]&lt;/p&gt;

&lt;p&gt;Q: You seem to be an advocate for the open social graph . […] Isn’t FB going to fight tooth and nail to resist their users moving out into the social graph [difusing their lead]?&lt;br /&gt;
A: There’s a change in the dynamics. Google’s a good example: they own some private data, but have the same public website info as any other search engine. You can share an awful lot and still differentiate. If Geni and FB were interoperating, FB could know a lot more useful things. There’s a lot of value in this openness; you’re actually getting more than you give up in most cases. FB has more to gain right now by the openness; it’ll enable them to mine more and more datas. All the trends say that openness is good for you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Either I’m running slower this morning or Tim talks really fast. Maybe both. Really good keynote, and worth seeing Tim talk. Meanwhile, I find that I miss things in the presentation when I live blog so I’m going to ratchet down the level of detail. Apologies in advance.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A Blast from the Past</title>
   <link href="http://blog.geekdaily.org/2007/10/a-blast-from-th.html"/>
   <updated>2007-10-08T22:36:09-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/a-blast-from-th</id>
   <content type="html">&lt;p&gt;Tripped over this looking for some other things: &lt;a href=&quot;http://www.webstart.com/atp/www-servers.html&quot;&gt;A list of all the www.*.com hosts&lt;/a&gt; from some indeterminate time long ago January 18, 1996. All 2227 of ‘em.&lt;/p&gt;

&lt;p&gt;If I get ‘round to it, I may see which are still up and owned by the same entity.&lt;/p&gt;

&lt;p&gt;Prolly not.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>One Social Graph To Rule Them All? Not Hardly.</title>
   <link href="http://blog.geekdaily.org/2007/10/one-social-grap.html"/>
   <updated>2007-10-08T21:08:12-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/one-social-grap</id>
   <content type="html">&lt;p&gt;On the heels of my &lt;a href=&quot;http://blog.geekdaily.org/2007/10/the-galaxy-of-i.html&quot;&gt;corny-but-very-workable galactic identity metaphor&lt;/a&gt;, I’ll risk another post on identity to follow up on &lt;a href=&quot;http://blog.geekdaily.org/2007/10/live-blog-gra-2.html&quot;&gt;something said by Reid Hoffman in his keynote today&lt;/a&gt; at the &lt;a href=&quot;http://graphingsocial.com/&quot;&gt;Graphing Social Patterns&lt;/a&gt; conference. It’s being picked up all over the blogosphere: &lt;a href=&quot;http://www.google.com/search?q=%2B%22social+graph%22+%2B%22One+Graph+To+Rule+Them+All%22&quot;&gt;One Social Graph To Rule Them All&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Reid’s conclusion was no, there won’t be. As he themed his talk, it all comes down to use cases and, at the end of the day, those use cases inform what problems you’re solving and how you go about solving them. Each solution you implement closes some (hopefully less interesting) doors and opens some (hopefully more interesting) ones. Just like with people, the choices you make along the way define who you are. &lt;a href=&quot;http://en.wikipedia.org/wiki/Mercator_projection&quot;&gt;Mercator&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Lambert_conformal_conic_projection&quot;&gt;Lambert&lt;/a&gt;, they served different purposes.&lt;/p&gt;

&lt;p&gt;He’s right, and there’s another reason he didn’t really touch on: sometimes folks don’t want the graphs to overlap, or want to actively hide any overlap. One example I’ve been quoting in conversation lately is the S&amp;amp;M Grandma*. She really, really wants those graphs to be separate. Other sides of the world kinda separate. She wants you to think that &lt;a href=&quot;http://www.straightdope.com/mailbag/micegreenland.html&quot;&gt;Greenland is Iceland&lt;/a&gt;. Believe it.&lt;/p&gt;

&lt;p&gt;(I love blogging; it makes me do research and find great sites like &lt;a href=&quot;http://www.radicalcartography.net/&quot;&gt;Radical Cartography&lt;/a&gt; and read cool things in &lt;a href=&quot;http://www.wikipedia.com/&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;* Rule 1, remember?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Graphing Social Patterns Geek Day Tomorrow!</title>
   <link href="http://blog.geekdaily.org/2007/10/graphing-social.html"/>
   <updated>2007-10-08T19:46:00-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/graphing-social</id>
   <content type="html">&lt;p&gt;Tomorrow’s the big payoff for me at &lt;a href=&quot;http://graphingsocial.com/&quot;&gt;Graphing Social Patterns&lt;/a&gt; — it’s &lt;a href=&quot;http://graphingsocial.com/schedule&quot;&gt;“Apps and Developers Day,”&lt;/a&gt; yay! The four talks on either side of lunch look golden (I’m becoming a big fan of &lt;a href=&quot;http://www.facebook.com/profile.php?id=5405706&quot;&gt;Jia Shen&lt;/a&gt; of &lt;a href=&quot;http://rockyou.com/&quot;&gt;RockYou&lt;/a&gt;). I got a quick demo of &lt;a href=&quot;http://www.popfly.com/&quot;&gt;Microsoft’s Popfly&lt;/a&gt; today from &lt;a href=&quot;http://blogs.msdn.com/danielfe/&quot;&gt;Dan Fernandez&lt;/a&gt;, so I’m looking forward to hearing him talk about it in more depth tomorrow.&lt;/p&gt;

&lt;p&gt;I’ll pick up the live blogging again then, but from &lt;a href=&quot;http://twitter.com/cwodtke/statuses/321216492&quot;&gt;what Christina says&lt;/a&gt;, it’s really hard so lower your expectations.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Galaxy of Identity</title>
   <link href="http://blog.geekdaily.org/2007/10/the-galaxy-of-i.html"/>
   <updated>2007-10-08T18:14:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/the-galaxy-of-i</id>
   <content type="html">&lt;p&gt;I’ve been learning about, thinking about, and talking about identity and reputation for some time now and only recently hit upon a comfortable metaphor whose analogy seems to extend far enough in all the needed directions. And it’s geeky, so you know I’m pleased.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consider yourself a planet at the center of your own universe.&lt;/strong&gt; &lt;em&gt;It is, after all, all about you.&lt;/em&gt; You’re located at some unique, identifiable place such that anyone given that location will find you and know it’s you (e.g. OpenID). Arrayed about you are many other celestial bodies, some of which are in tight or loose orbit of you (family, friends, colleagues, etc.), many of which have occasionally tangential orbits (acquaintances); mapping your galaxy is the job of the social graph.&lt;/p&gt;

&lt;p&gt;There are also stars of various (possibly variable) brightness, as well as comets which look a lot like a variable star but occasionally pass very close, increasing their brilliance. Not to mention novas, supernovas, black holes, etc. &lt;em&gt;Yeah, I like this metaphor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But let’s ignore the galaxy for a moment&lt;/em&gt; and focus on the planet-that-is-you (&lt;em&gt;I said it’s all about you, right?&lt;/em&gt;). We can never see all of you at once; at best, we get half. You’ve got terrain — places you’re higher, deeper, broader, narrower than others. You’ve got mysteries, regions no one’s ever seen or documented*. Weather frequently distorts or obscures visibility. There’s some periodic cycle you observe.&lt;/p&gt;

&lt;p&gt;Okay enough metaphorical fun. What can we infer from this model and knowledge of our own globe? Here’s a couple; I’m sure that more will emerge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. No perspective is ever complete&lt;/strong&gt; ; it’s only by observing over time we can begin to get a complete picture. Even then, there’s no map which documents the terrain completely and accurately. That’s usually due to cartographic (e.g. Mercator vs. Polar projection) or political biases (e.g. Greenland is icy, Iceland is green)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Certain perspectives are valuable in certain contexts&lt;/strong&gt; and valueless in others. The &lt;a href=&quot;http://www.google.com/search?q=woub+weather+man&quot;&gt;WOUB Weather Man&lt;/a&gt; is very interested in &lt;a href=&quot;http://www.weather.com/weather/map/USOH0037?x=0&amp;amp;y=0&quot;&gt;one particular perspective&lt;/a&gt;; his interest wanes inversely to how congruent any other view is.&lt;/p&gt;

&lt;p&gt;I’m going to have fun with this metaphor. I hope you’ll enjoy the ride.&lt;/p&gt;

&lt;p&gt;* &lt;a href=&quot;http://www.cafepress.com/shotgunpixie.52899229&quot;&gt;Rule 1: Don’t Visualize.&lt;/a&gt; Rule 2: No, Really, DON’T VISUALIZE. If you break the rules, you suffer the consequences.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 2, Keynote</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-2.html"/>
   <updated>2007-10-08T10:11:38-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-2</id>
   <content type="html">&lt;p&gt;The Business of Facebook Apps&lt;br /&gt;
Reid Hoffman, Founder of LinkedIn&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Social Nets and Platforms&lt;br /&gt;
* Friendster kicked it off in 2003, conversation around it was very feature oriented&lt;br /&gt;
* Now we have FB, MySpace, Ning&lt;/p&gt;

&lt;p&gt;Social Nets v. Professional Networks&lt;br /&gt;
* Difference in context&lt;/p&gt;

&lt;p&gt;One graph to rule them all?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evolution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Social nets started as a feature&lt;/p&gt;

&lt;p&gt;MySpace ecosystem grew out of oversight: didn’t turn off javascript includes&lt;/p&gt;

&lt;p&gt;Ning came along with a set of tinkertoys to make your own flavor of social net&lt;/p&gt;

&lt;p&gt;FB is the first platform based on a real, broad social graph&lt;/p&gt;

&lt;p&gt;Social net takes patterns of social interaction from real life to the web in ways that enable or enrich the experience … can enable applications which can really change people’s lives.&lt;/p&gt;

&lt;p&gt;FB Newsfeed == many-to-many messaging&lt;/p&gt;

&lt;p&gt;Key differentiator: FB allows you to &lt;strong&gt;acquire customers&lt;/strong&gt; about whom you can &lt;strong&gt;know interesting things&lt;/strong&gt; and &lt;strong&gt;message them&lt;/strong&gt; (and &lt;strong&gt;through them, their friends&lt;/strong&gt; )&lt;/p&gt;

&lt;p&gt;FB and LI embody different use cases.&lt;br /&gt;
* Search by name on either, you get something that suits the basic context of the app&lt;br /&gt;
* Search for “open source expert” on either; FB renders not much, LI is more focused on finding someone of that expertise&lt;br /&gt;
* Finding companies for partnerships: not really an FB thing.&lt;/p&gt;

&lt;p&gt;The features and general behavior of users in FB vs. LI tends to highlight the different contexts.&lt;/p&gt;

&lt;p&gt;SEO: what do you want people to find when they google you?&lt;/p&gt;

&lt;p&gt;Trivia: Reid rereads Lord of the Rings every few years.&lt;/p&gt;

&lt;p&gt;Q’s: is there only one social graph? is there one which contains all different sorts of relationships?&lt;/p&gt;

&lt;p&gt;Reid: there will be multiple social graphs based on “the semantics of the connection”&lt;/p&gt;

&lt;p&gt;Geek/Blogger dream: one graph and tag everyone in it.&lt;/p&gt;

&lt;p&gt;(is it important to see all graphs integrate?)&lt;/p&gt;

&lt;p&gt;A sufficiently large graph can provide the foundation of a successful platform; one big graph not required&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possibilities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Current apps: communications, games, music/pics/movies&lt;/p&gt;

&lt;p&gt;Future likely holds iterations of today’s successes&lt;/p&gt;

&lt;p&gt;Interested in seeing where friending apps (Top Friends) and honesty apps (Questions, etc) go.&lt;/p&gt;

&lt;p&gt;Enabling platform and luring heaps of developers results in getting to that 0.5% of interesting/useful ideas.&lt;/p&gt;

&lt;p&gt;With no limits on how many apps get installed and nothing urging users to uninstall apps, you have to work to rise above the noise. Number of installs becomes uninteresting; number of daily users (engagement) is interesting.&lt;/p&gt;

&lt;p&gt;FB apps that don’t work so far: biz, politics, money&lt;/p&gt;

&lt;p&gt;What’s the second act? How do you know it when you see it? [me: you instrument, iterate, play, and learn]&lt;/p&gt;

&lt;p&gt;Economics of FB apps parallels the internet gold rush – cpi installs and advertising inventories/ad network aggregation; these lead to interruptive experiences (crappy ads, etc) and unsupportable models like incented installation or “installations financed by future hope”&lt;/p&gt;

&lt;p&gt;Low cost apps with sufficient appeal will survive, as will apps which fit the FB use case which will further define FB’s use case.&lt;/p&gt;

&lt;p&gt;Still up in the air: any new use case (anything you try to sell others will give away to acquire customers), major apps&lt;/p&gt;

&lt;p&gt;Stickiness and engagement will always matter.&lt;/p&gt;

&lt;p&gt;FB is redefining communication patterns based around sharing. Their photo sharing is particular genius with their version of tagging.&lt;/p&gt;

&lt;p&gt;What’s the future of discovery/search on the web? Your social network will certainly be a piece of this.&lt;/p&gt;

&lt;p&gt;Ecosystems have microcosms; it’s part of the diversity that akes it interesting and sustainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FB will be the entry-point for college-age interesting entrepreneurs&lt;/p&gt;

&lt;p&gt;Interesting ties between existing sites and FB app (iLike, Flixter)&lt;/p&gt;

&lt;p&gt;Economics will be an issue: keep it on the cheap&lt;/p&gt;

&lt;p&gt;Constant newness required for entertainment apps: that’s the current model for engagement&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Q: Why isn’t LI providing a FB app to [help us merge the two graphs]? (noted that others, CraigsList, et al also don’t)&lt;br /&gt;
A: LI will likely provide some FB apps. Biz apps have almost no traction. Bumperstickers, an entertainment app, is one they wrote that has fair traction. Just because you build it doesn’t mean people will jump in (viz profusion of search bars yet most still search from Google or Yahoo). Economics of opportunity development haven’t yet made it possible.&lt;/p&gt;

&lt;p&gt;Q: You mentioned a few things that hadn’t worked on FB platform thus far. Do you believe that ecommerce will someday come, or do you believe that social networks will exclude commercial interests?&lt;br /&gt;
A:  There will be social commerce on the web, but it might be a year or two off. It’ll likely come through sharing (media, etc). Monthly, the most interesting apps on FB are based on communication; the trend will likely continue. There’s always the chance of something new.&lt;/p&gt;

&lt;p&gt;Q: Curious with your position as angel and developer in the space, [how would you recommend someone try to build a social media business]? (references to FB-only, rich experience elsewhere, both … ?)&lt;br /&gt;
A: Right now, the FB+rich website model seems most interesting. There will be angel things funded on FB, but VCs are looking towards returns which FB apps haven’t yet proven out.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 1, Geek Track, Late Afternoon</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-gra-1.html"/>
   <updated>2007-10-07T17:06:12-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-gra-1</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Despite being individually wonderful, fresh-popped popcorn and hot coffee don’t go together at all. Bye bye, popcorn.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jia Shen and Raymond (?) from &lt;a href=&quot;http://rockyou.com&quot;&gt;RockYou!&lt;/a&gt; talking about launching and distributing your FB app. RockYou are the folks who brought Werewolves, Vampires, and SuperWall, as well as GlitterText.&lt;/p&gt;

&lt;p&gt;Widgets for MySpace, Bebo, Friendster, are all like clothing – self-expressive, no user interaction.&lt;/p&gt;

&lt;p&gt;Facebook supports this, but also offers user engagement. It’s like a MMORPG vs. the single-player games of the others.&lt;/p&gt;

&lt;p&gt;Networks with engagement gives you ~7x more distribution.&lt;/p&gt;

&lt;p&gt;(He showed quantcast rockyou.com web statistics)&lt;/p&gt;

&lt;p&gt;RockYou is helping monetize now by offering an ad network on FB, both for use by developers to monetize their apps as well as seeking good matches between their apps and advertisers (e.g. Zombies &amp;amp; Resident Evil movie)&lt;/p&gt;

&lt;p&gt;New application setup page walkthru:&lt;/p&gt;

&lt;p&gt;Add FB Dev app, create a new app, *make sure it’s checked on to allow folks to add it*. You can limit that to developers only further down the config.&lt;/p&gt;

&lt;p&gt;Picking a good name: expressive, short, and catchy.&lt;/p&gt;

&lt;p&gt;Callback URL is your server.&lt;/p&gt;

&lt;p&gt;Interaction is: FB App page -&amp;gt; your callback URL -&amp;gt; returns text (FBML) -&amp;gt; FB puts it on the page&lt;/p&gt;

&lt;p&gt;You can do iframe within FBML, so there’s little advantage to doing iframe instead of FBML.&lt;/p&gt;

&lt;p&gt;Developers of your app will be able to see debug messages (as comments in rendered HTML).&lt;/p&gt;

&lt;p&gt;Post-Add URL: where you go when someone adds the app. Default is profile page; this is a great opportunity to move them into your app’s design flow – help them take the next step&lt;/p&gt;

&lt;p&gt;Post-Remove URL: Isn’t called in user space, but at backend.&lt;/p&gt;

&lt;p&gt;Adding left vs. right: right side’s wider, left will likely place you higher.&lt;/p&gt;

&lt;p&gt;*BE SURE TO SET DEVELOPER MODE* They have a dev app with 300K users because they forgot. You don’t want to deal with this.&lt;/p&gt;

&lt;p&gt;Side Nav URL: set this! users like to nav to the app from there; if you leave it empty, you don’t show up.&lt;/p&gt;

&lt;p&gt;Private installation is good for dev mode – don’t announce you’re adding your test/dev apps.&lt;/p&gt;

&lt;p&gt;Make sure to have a banner/splash/screenshot for the app when you’re ready to submit it. It shows on the profile page.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;insert much configurational fun as we all make dirs on the rockyou dev server. If you want to see what my “app” is up to, it’s &lt;a href=&quot;http://dev2.rockyou.com/class/purp&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each request sends the following pieces in the session:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;fb_sig_session_key: session key (hopefully infinite)&lt;/li&gt;
  &lt;li&gt;fb_sig_user: uid&lt;/li&gt;
  &lt;li&gt;fb_sig_added: boolean 1/0, is it added&lt;/li&gt;
  &lt;li&gt;fb_sig_time: current time, float sec since epoch&lt;/li&gt;
  &lt;li&gt;fb_sig_friends: comma sep’d list of uids&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The wiki is a treasure trove. Keep it open all the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tracking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to know you’re tuning your app in the right direction. Here’s some good stats to track:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Infinite Sessions&lt;/li&gt;
  &lt;li&gt;Page Views&lt;/li&gt;
  &lt;li&gt;Installs/Uninstalls&lt;/li&gt;
  &lt;li&gt;Invites Sent/Opened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have infinite session key, you can look at their info for as long as you’re installed. Allows you to regen their profile regularly, etc.&lt;/p&gt;

&lt;p&gt;Use Google Analytics, Quantcast to capture stats.&lt;/p&gt;

&lt;p&gt;Not sure if FBJS allows Google Urchin yet.&lt;/p&gt;

&lt;p&gt;Google Analytics doesn’t manage to capture good stats (gets bad total uniques/page views) sometimes if you’re doing “fancy things” where Quantcast is very straightforward, brute-force and rock-solid reliable.&lt;/p&gt;

&lt;p&gt;Tracking via post-add URL: how are you getting installed? day-to-day growth is important for sensing how your user community is reacting. Set “next” parameter (&amp;amp;next=…) and send to something that reacts dynamically to that param.&lt;/p&gt;

&lt;p&gt;Tracking via post-remove URL:  gets called at uninstall; just be sure you’re being pinged by FB and catch the user id. You don’t have to ditch their info, but note that they’ve uninstalled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You must have a dev app and a production app.&lt;/p&gt;

&lt;p&gt;FB Dev blog explains how to make test accounts which won’t be removed.&lt;/p&gt;

&lt;p&gt;Use cases: They’re looking at your app but haven’t added; they’ve added; they’re looking at someone’s profile and have/don’t have your app, …. Be sure you consider them all.&lt;/p&gt;

&lt;p&gt;Look at HTML for debug info; it shows you everything FB set and sent in a comment.&lt;/p&gt;

&lt;p&gt;Firebug: use the console to see the AJAX calls to be sure that the request went out right and got a good response.&lt;/p&gt;

&lt;p&gt;Test on all browsers, including IE 6 &amp;amp; 7. Use Fiddler (Windows only HTTP debugging proxy) to see all the calls in IE.&lt;/p&gt;

&lt;p&gt;Be sure your browser isn’t caching content you expect to be updated.&lt;/p&gt;

&lt;p&gt;MS Script Debugger for debugging JS. Allows you to break into JS and step thru.&lt;/p&gt;

&lt;p&gt;File logging, email notifications in your app: you’ll see invisible errors and track production issues.&lt;/p&gt;

&lt;p&gt;Invites&lt;/p&gt;

&lt;p&gt;FB gives multi-selector for picking your friends.&lt;/p&gt;

&lt;p&gt;fb:request_form tag gives you an easy&lt;/p&gt;

&lt;p&gt;After the user clicks the action in invites (either to do it or skip it) you can take care of them (preview, thank, etc). FB tells you who’s been sent an invite (friend_ids)&lt;/p&gt;

&lt;p&gt;Profile FBML is cached at FB, as are images. You can use API to invalidate cache data.&lt;/p&gt;

&lt;p&gt;FB:Refs are also cached.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;FB carries the bulk of the load. Usually scaling is a DB issue on your side.&lt;/p&gt;

&lt;p&gt;Amazon EC2 and S3 are very useful for doing big FB apps.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And then we ran out of time. Jia and Raymond ran a tight session. It kept moving, they actively made sure everyone was moving along well, and I actually got an app running. They kept it really simple, from Hello World to some basic essential concepts, no DB, nothing unnecessary. An ideally structured hands-on workshop.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 1, Geek Track, Post-Lunch</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blog-graph.html"/>
   <updated>2007-10-07T14:07:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blog-graph</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Ahhh, there’s nothing like a conference box lunch. Thankfully so.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The example app Tyler wrote to share: &lt;a href=&quot;http://apps.facebook.com/whyareyouawesome&quot;&gt;Why Are You Awesome?&lt;/a&gt; (and &lt;a href=&quot;http://workshop.monkeypox.org/Whyareyouawesome.zip&quot;&gt;source&lt;/a&gt; and &lt;a href=&quot;http://workshop.monkeypox.org/1-awesome.sql&quot;&gt;db schema ql&lt;/a&gt;) (will also be posted at &lt;a href=&quot;http://unethicalblogger.com/&quot;&gt;Tyler’s blog&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Store session keys in db and you can use them as unique user ID for stats, being sure the user’s got the latest update of your app, etc.&lt;/p&gt;

&lt;p&gt;All the internal FB API calls are built on top of FQL, so writing your app in FQL where possible will give better performance. Ari: “The goal of FQL is not to hide any of the complexity of what we’re going to have to do […] Just to be clear: these queries aren’t just run on a DB server; they’re processed first.”&lt;/p&gt;

&lt;p&gt;FQL supports nested selects; they’re resolved as individual ops, innermost to outermost.&lt;/p&gt;

&lt;p&gt;Template stuff in a separate file as just FBML. (fbml.inc.php)&lt;/p&gt;

&lt;p&gt;Interesting files:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;index.php: the main landing for users&lt;/li&gt;
  &lt;li&gt;logic.inc.php:&lt;/li&gt;
  &lt;li&gt;fbml.inc.php: template stuff including mock AJAX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mock AJAX can be done from a link with three properties:&lt;br /&gt;
&amp;lt;a clickrewriteid=”&amp;lt;div_to_rewrite&amp;gt;” clickrewriteurl=”&amp;lt;query_url&amp;gt;” cickrewriteform=”&amp;lt;form_from_dom_to_send_data_from&amp;gt;” …&amp;gt;FOO!&amp;lt;/a&amp;gt;&lt;/p&gt;

&lt;p&gt;Don’t call require_login for mock AJAX calls. Duh.&lt;/p&gt;

&lt;p&gt;Mock AJAX returns are quite literally pushed into that div, errors included. Catch exceptions aggressively.&lt;/p&gt;

&lt;p&gt;Security-wise, don’t access the fb_sig_{user,profile} . You can use Firebug to check how secure your calls are … if you could use Firebug to change the internals of the call and post as someone else, etc, that’d be bad, now, wouldn’t it? (Tyler did this once to Superwall a bunch of people as Mark Zuckerberg, inviting them to go shopping for NorthFace jackets. Go figger.)&lt;/p&gt;

&lt;p&gt;Make a legit FB test account each for your dev, staging, and live apps. Make your dev, staging apps visible only to you or only to a network of folks who’re helping you. You really don’t want your dev server buried by viral adoption.&lt;/p&gt;

&lt;p&gt;Tyler pushes with rsync and –exclude fu to keep things configurationally close.&lt;/p&gt;

&lt;p&gt;Integrating with your existing app:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add a column to track their FB id with your user id&lt;/li&gt;
  &lt;li&gt;Notice cookies (FB, yours, etc) and let that influence your app’s behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Profile Action Links (the links beneath profile pix) is more a function of the viewer than the person whose profile is being viewed.&lt;/p&gt;

&lt;p&gt;Remember that co-developers can remove you as a developer. Choose wisely. You’re limited to 5 other than you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All in all, was less of a “Let’s make an app!” and more “Here’s a tour of an app.” That’s fine; I wasn’t looking forward to reliving PHP4. Next: Launching and distribution&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live Blog: Graphing Social Patterns, Day 1, Geek Track, Pre-Lunch</title>
   <link href="http://blog.geekdaily.org/2007/10/live-blogging-g.html"/>
   <updated>2007-10-07T12:38:57-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/live-blogging-g</id>
   <content type="html">&lt;p&gt;I’m at &lt;a href=&quot;http://graphingsocial.com/&quot;&gt;Graphing Social Patterns&lt;/a&gt; for the next three days; it’s a conference revolving around the Facebook platform. I’ve watched &lt;a href=&quot;http://gilesbowkett.blogspot.com/&quot;&gt;Giles&lt;/a&gt; live-blog and he always does it so well (and I always appreciate it when he does) so here goes:&lt;/p&gt;

&lt;p&gt;Presented by R. Tyler Ballance of Slide, Ari Steinberg of Facebook&lt;/p&gt;

&lt;p&gt;Useful URLs:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://developers.facebook.com/tools.php&quot;&gt;API console&lt;/a&gt; and &lt;a href=&quot;http://developers.facebook.com/tools.php?fbml&quot;&gt;FBML console&lt;/a&gt;, which returns to you exactly what your app will see: http://developers.facebook.com/tools.php&lt;/p&gt;

&lt;p&gt;They just added bugzilla: http://bugs.developers.facebook.com/&lt;br /&gt;
Developer FB App: http://www.facebook.com/developers/&lt;br /&gt;
Developer docs and wiki.developers.facebook.com&lt;/p&gt;

&lt;p&gt;Subscribe to the platform status feed to keep up with what’s working/broken at the moment: http://www.facebook.com/feeds/api_messages.php&lt;/p&gt;

&lt;p&gt;IRC: #facebook @ irc.freenode.net&lt;/p&gt;

&lt;p&gt;Use JSON. It’s much more compact compared to XML (~3x in some common cases), keeps bandwidth costs low and interactive response high.&lt;/p&gt;

&lt;p&gt;FB is mostly PHP.&lt;/p&gt;

&lt;p&gt;Pros &amp;amp; Cons of FB app langs:&lt;/p&gt;

&lt;p&gt;PHP:&lt;br /&gt;
Pro: super easy to write, officially supported, wide variety of hosting&lt;br /&gt;
Con: Only does XML with FB; PHP makes it easy to write crap&lt;/p&gt;

&lt;p&gt;Python: (PyFacebook API)&lt;br /&gt;
Pro: supports JSON or XML; integrates with Django easily&lt;br /&gt;
Con: hosting folks don’t often host mod_python; uses simplejson by default (cjson is 70-80% faster); Python has a steeper learning curve&lt;/p&gt;

&lt;p&gt;Ruby: (rFacebook API/lib)&lt;br /&gt;
Pro: RoR scales well; RoR encourages clean, readable code; RoR encourages testing; “Very Web 2.0”&lt;br /&gt;
Con: Ruby has an even higher learning curve; rFacebook isn’t as RESTful as it could be; “really easy to write bad code in Ruby”, “rFacebook doesn’t quite conform to Ruby coding standards”&lt;/p&gt;

&lt;p&gt;.NET: (Mono)&lt;br /&gt;
Pro: A variety of existing UserControls; usable from C# or VB.NET; tightly integrated with Visual Studio; supports LINQ (new feature in .NET 3/IIS); *very* well documented (70pp of very detailed docs)&lt;br /&gt;
Con: IIS or mod_mono/Apache2 (latter not fully supported); some aspects require .NET 3.5; very “enterprisey” and complicated (separates biz logic from display layer, etc); tightly bound to XML.&lt;/p&gt;

&lt;p&gt;Other libs: ColdFusion, Perl, Java, C++&lt;/p&gt;

&lt;p&gt;FB Platform is moving so quickly be sure that your chosen client lib can keep up.&lt;/p&gt;

&lt;p&gt;Ari: if you know what you’re doing, you can crank out your own FB API lib in The Language Of Your Choice in ~1-2 hrs.&lt;/p&gt;

&lt;p&gt;Example app: “Why are you awesome?” written in PHP4, &lt;a href=&quot;http://wiki.developers.facebook.com/index.php/FBML&quot;&gt;FBML&lt;/a&gt;-based, with only one request for info from FB.&lt;/p&gt;

&lt;p&gt;The user needs to be called to action – they need to add info, do stuff, manage something, or something else in order to be engaged. Find intriguing social contexts that engage folks.&lt;/p&gt;

&lt;p&gt;Work hard to stay within FB’s UI look and feel to increase user comfort. Compare Friends is an excellent example of going far, far away from it.&lt;/p&gt;

&lt;p&gt;Make sure to add notifications to increase awareness of your app. Make sure they’re not spammy, or people will mark them as spam and you’ll be restricted to being seen only by your app’s users.&lt;/p&gt;

&lt;p&gt;Brevity is the soul of wit.&lt;/p&gt;

&lt;p&gt;Use Mock AJAX to provide some cool interactivity.&lt;/p&gt;

&lt;p&gt;There’s a limit of 40 notifications per day, 10 user-to-user invites per day. Ari: “Ideally, we’d like to have the limits not exist [and everyone to behave sensibly] … we just have the limits there to keep things from getting out of control.”&lt;/p&gt;

&lt;p&gt;FBML-based apps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Don’t have to fetch tons of info (reduces your load). Free gifts is installed ~5M users, 500-900K daily users, and one server.&lt;/li&gt;
  &lt;li&gt;Fewer FB API calls == less exposure to bandwidth latency, etc.&lt;/li&gt;
  &lt;li&gt;Loads about as fast as the rest of FB, very responsive feeling.&lt;/li&gt;
  &lt;li&gt;FBBYB: FB bugs become your bugs (and users don’t make any distinction)&lt;/li&gt;
  &lt;li&gt;FB has had issues with unicode&lt;/li&gt;
  &lt;li&gt;Keep FB’s bugzilla handy all-the-time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iFrame/HTML-based apps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You’ve got nearly absolute control (some browsers may not allow iFrames to set cookies, so do a page reload)&lt;/li&gt;
  &lt;li&gt;Easier to port existing web apps&lt;/li&gt;
  &lt;li&gt;Only constrained to 696 pixel width and terms of service (which you really need to read, particularly about what you can do with data or persistence).&lt;/li&gt;
  &lt;li&gt;You have to call the FB API (lots), which can increase load on servers&lt;/li&gt;
  &lt;li&gt;You don’t have access to FBML&lt;/li&gt;
  &lt;li&gt;You can totally hose the user experience (viz. scrolling iframes, bad self-written controls)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;General Tips:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pick what you’re most comfy with – what you can ship fastest&lt;/li&gt;
  &lt;li&gt;Subscribe to dev feeds; monitor FB’s changes often.&lt;/li&gt;
  &lt;li&gt;Use JSON.&lt;/li&gt;
  &lt;li&gt;You can get an infinite session key using &lt;tt&gt;require install&lt;/tt&gt; (vs. &lt;tt&gt;require login&lt;/tt&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;require add&lt;/tt&gt; will force the user to add the app before interacting, but they may not opt in just to test things&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Let there be lunch and app-hacking afters.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Giles Channels RubyEast</title>
   <link href="http://blog.geekdaily.org/2007/10/giles-channels-.html"/>
   <updated>2007-10-03T14:53:26-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/giles-channels-</id>
   <content type="html">&lt;p&gt;If you can’t tell, I’m catching up a bit after a long period of being buried in other things. Found Giles Bowkett’s notes from RubyEast waiting for me in my RSS reader. It’s his usual incredi-dense summary of a day in the life of a RubyEast attendee. Fun to read and inspires many questions.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://pastie.caboo.se/101783&quot; title=&quot;#101783 - Pastie&quot;&gt;Giles Bowkett’s Live Notes From RubyEast&lt;/a&gt;. [in &lt;a href=&quot;http://pastie.caboo.se/&quot;&gt;pastie&lt;/a&gt;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>DSLs Are Our Future</title>
   <link href="http://blog.geekdaily.org/2007/10/dsls-are-our-fu.html"/>
   <updated>2007-10-03T09:10:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/dsls-are-our-fu</id>
   <content type="html">&lt;p&gt;I have to admit that I’ve been puzzled about the rise of domain-specific languages (DSLs) of late. Not resistant, just curious whether or not it was a fad due to geekish interest or a trend motivated by some unseen force at work. &lt;a href=&quot;http://www.joelonsoftware.com/items/2007/09/18.html&quot;&gt;Joel Spolsky’s Strategy Letter VI&lt;/a&gt; made it click by relating it to a pattern I’d lived through (and yes, I’m that old):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The C programming language was invented with the explicit goal of making it easy to port applications from one instruction set to another. And it did a fine job, but wasn’t really 100% portable, so we got Java, which was even more portable than C. Mmmhmm.&lt;/p&gt;

  &lt;p&gt;Right now the big hole in the portability story is — tada! — client-side JavaScript, and especially the DOM in web browsers. […]&lt;/p&gt;

  &lt;p&gt;What’s going to happen? The winners are going to do what worked at Bell Labs in 1978: build a programming language, like C, that’s portable and efficient. It should compile down to “native” code (native code being JavaScript and DOMs) with different backends for different target platforms, where the compiler writers obsess about performance so you don’t have to. […]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you don’t read &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel on Software&lt;/a&gt;, you should.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Test Helper: assert_not_valid</title>
   <link href="http://blog.geekdaily.org/2007/10/test-helper-a-1.html"/>
   <updated>2007-10-02T11:32:58-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/test-helper-a-1</id>
   <content type="html">&lt;p&gt;I was a little surprised that Rails offers &lt;tt&gt;assert_valid&lt;/tt&gt; but not its implied converse, &lt;tt&gt;assert_not_valid&lt;/tt&gt; … so I wrote it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def assert_not_valid(record, message=&#39;expected not to be valid, but was valid&#39;)
    clean_backtrace do
      assert !record.valid?, message
    end
  end
&lt;/code&gt;&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>Test Helper: assert_equal_multiline_text</title>
   <link href="http://blog.geekdaily.org/2007/10/test-helper-ass.html"/>
   <updated>2007-10-02T11:26:21-07:00</updated>
   <id>http://blog.geekdaily.org/2007/10/test-helper-ass</id>
   <content type="html">&lt;p&gt;I got tired of poring over the crappy output when comparing two large text blobs for equality fails; the more subtle the difference, the harder it is to spot it by eye. So I wrote this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  def assert_equal_multiline_text(a, b, label = nil)
    return true if a == b
    label = label ? label + &#39;, line&#39; : &#39;Line&#39;
    a_lines = a.split(/\n/)
    b_lines = b.split(/\n/)
    (0..([a_lines.length, b_lines.length].min - 1)).each do |i|
      assert_equal a_lines[i], b_lines[i], &quot;#{label} #{i}:&quot;
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… where &lt;tt&gt;label&lt;/tt&gt; is just a nice human-readable name for the things being compares. I call it like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;assert_equal_multiline_text @expected.encoded,   Mailer.create_invoice(payment).encoded,   &quot;Invoice mail&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;My eyes are much happier.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Setting Constants While Testing</title>
   <link href="http://blog.geekdaily.org/2007/09/setting-constan.html"/>
   <updated>2007-09-30T20:59:05-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/setting-constan</id>
   <content type="html">&lt;p&gt;Let’s suppose you’ve got behavior in your app which is dependent on how &lt;tt&gt;RAILS_ENV&lt;/tt&gt; is set and — of course — you want to test that it’s behaving properly. To do this, you need to change the value of &lt;tt&gt;RAILS_ENV&lt;/tt&gt; just before you call that function (and change it back just after). This puzzled me for a while, but I finally figured it out:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FooTest &amp;lt;&amp;lt; Test::Unit::TestCase
  def test_doing_the_thing_with_the_stuff_in_production
    foo = foos(:the_one_to_test)
    orig_rails_env = RAILS_ENV
    suspend_warnings {Foo.const_set(:RAILS_ENV, &#39;production&#39;)}
    assert foo.do_the_thing(:with =&amp;gt; the_stuff)
    suspend_warnings {Foo.const_set(:RAILS_ENV, orig_rails_env)}
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;( &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Module.html#M001713&quot;&gt;&lt;tt&gt;const_set&lt;/tt&gt;&lt;/a&gt; comes from &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Module.html&quot;&gt;Ruby’s &lt;tt&gt;Module&lt;/tt&gt; class&lt;/a&gt;, which also provides &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Module.html#M001712&quot;&gt;&lt;tt&gt;const_get&lt;/tt&gt;&lt;/a&gt;, &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Module.html#M001714&quot;&gt;&lt;tt&gt;const_defined?&lt;/tt&gt;&lt;/a&gt;, and &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Module.html#M001716&quot;&gt;&lt;tt&gt;const_missing&lt;/tt&gt;&lt;/a&gt;. Nifty!)&lt;/p&gt;

&lt;p&gt;That was all well and good for my unit tests, but what about functionals tests? That turned out to be a slight variation on the theme:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FooControllerTest &amp;lt;&amp;lt; Test::Unit::TestCase
  def test_getting_the_thing_with_the_stuff_in_production
    foo = foos(:the_one_to_test)
    orig_rails_env = RAILS_ENV
    suspend_warnings {FooController.const_set(:RAILS_ENV, &#39;production&#39;)}
    get :the_thing_with_the_stuff
    assert :success
    suspend_warnings {FooController.const_set(:RAILS_ENV, orig_rails_env)}
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You’d think that was enough, but &lt;em&gt;noooo&lt;/em&gt;, I’ve even got a function in my ApplicationController which not only behaves differently per RAILS_ENV but also honors a constant (call it &lt;tt&gt;FOOISH&lt;/tt&gt;) which may be set differently (or not set) in each environment. &lt;em&gt;Holy crap!&lt;/em&gt; Dealing with that’s a bit painful since I don’t want to hardcode &lt;tt&gt;FOOISH&lt;/tt&gt;’s current per-environment settings in my tests. Then I tripped over a neat bit of code in &lt;tt&gt;config/boot.rb&lt;/tt&gt; and mutated it into this test helper:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def get_var_from_rails_environment(varname, env = RAILS_ENV)
  global_env_file = File.join(RAILS_ROOT, &#39;config&#39;, &#39;environment.rb&#39;)
  specific_env_file = File.join(RAILS_ROOT, &#39;config&#39;, &#39;environments&#39;, &quot;#{env}.rb&quot;)
  [specific_env_file, global_env_file].each do |env_file|
    IO.readlines(env_file).grep(/^\s*#{varname}\s*=\s*([&#39;&quot;]?)(.*)\1/)
    break if $2
  end
  $2
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This lets me make it clean and easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def test_getting_the_thing_with_the_stuff_fooishly
  orig_fooish = ApplicationController.const_get(:FOOISH)
  orig_rails_env = ApplicationController.const_get(:RAILS_ENV)
  %w(development staging test production).each do |rails_env|
    fooish = get_var_from_rails_environment(&#39;FOOISH&#39;, rails_env)
    next unless fooish
    silence_warnings {
      ApplicationController.const_set(:FOOISH, fooish)
      ApplicationController.const_set(:RAILS_ENV, rails_env)
    }

    get :the_thing_with_the_stuff
      
    silence_warnings {
      ApplicationController.const_set(:FOOISH, orig_fooish)
      ApplicationController.const_set(:RAILS_ENV, orig_rails_env)
    }
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s as elegant as I can make it. Not a bad day’s work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://www.workingwithrails.com/person/6491-ryan-bates&quot;&gt;Ryan Bates&lt;/a&gt; rightly &lt;a href=&quot;http://www.railsforum.com/viewtopic.php?id=11054&quot;&gt;advises caution&lt;/a&gt; in changing RAILS_ENV as you might trigger subtle side effects. Proceed with caution.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Obakucinbidwardston for President</title>
   <link href="http://blog.geekdaily.org/2007/09/obakucinbidward.html"/>
   <updated>2007-09-29T23:04:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/obakucinbidward</id>
   <content type="html">&lt;p&gt;Tonight I finally, reluctantly, watched the Democratic Presidential Candidate Debate held a couple of days ago at Dartmouth College. I’m one of those undecided liberals who’s convinced that we’re doing ourselves harm by moving state primaries earlier, thus extending the presidential campaign. I’ve watched it now, and I’m still undecided, though I’ll say that Sen. Dodd, Gov. Richardson, and former Sen. Gravel are off my list. Dodd weaseled, Gravel was outright bizarre, and Richardson came off a bit too idealistic for even me.&lt;/p&gt;

&lt;p&gt;While I was at it, I checked out the &lt;a href=&quot;http://www.selectsmart.com/president/2008.html&quot;&gt;SelectSmart 2008 Presidential Candidate Selector&lt;/a&gt; to see if their results agreed with my gut feelings. Their ratings are expressed as a percentage match between your theoretical ideal candidate’s positions and the stated positions of the potential candidates. Ironically, it does – I’m still largely undecided. All the Republicans were below a 50% match, all the Dems above it, and the five I’m still pondering (Biden, Clinton, Edwards, Kucinich, Obama) within a 10% band.&lt;/p&gt;

&lt;p&gt;And I’m still undecided.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>CDBaby.com goes back to PHP</title>
   <link href="http://blog.geekdaily.org/2007/09/cdbabycom-goes-.html"/>
   <updated>2007-09-25T00:59:59-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/cdbabycom-goes-</id>
   <content type="html">&lt;p&gt;A bit over two days ago, &lt;a href=&quot;http://dereksivers.com/&quot;&gt;Derek Sivers&lt;/a&gt; posted in the &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/&quot;&gt;O’Reilly Ruby blog&lt;/a&gt; on &lt;a href=&quot;http://xrl.us/back2php&quot;&gt;his experience rewriting CDBaby.com in Ruby on Rails and why he chose to go back to PHP&lt;/a&gt;. Without going point-by-point, Derek said that after a hefty time investment, he abandoned reimplementing the website in Rails and took the lessons learned back to create a fresh, lighter-weight PHP and SQL implementation.&lt;/p&gt;

&lt;p&gt;As you’d expect, this generated a comment storm filled with at least &lt;a href=&quot;http://logicalfallacies.info/&quot;&gt;four types of logical fallacies&lt;/a&gt;, often degenerating to name calling and language specification waving. The vast majority missed the point, many of them &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html#comment-1278201&quot;&gt;after Derek made it unequivocally clear&lt;/a&gt;: &lt;em&gt;he felt was trying to bend Rails in a way it wasn’t meant to bend, so he stopped.&lt;/em&gt; I was going to categorize the comments and poke some fun, but &lt;a href=&quot;http://www.pervasivecode.com/blog/2007/09/23/immature-developer-attitudes-revealed-in-flames-regarding-cdbaby/&quot;&gt;Jamie Flournoy beat me to it&lt;/a&gt; (and with a better overall message, to boot). Add to that some earlier thoughts from &lt;a href=&quot;http://chadfowler.com/2006/12/27/the-big-rewrite&quot;&gt;Chad Fowler&lt;/a&gt; and &lt;a href=&quot;http://www.joelonsoftware.com/printerFriendly/articles/fog0000000069.html&quot;&gt;Joel Spolsky&lt;/a&gt; on why and how to evolve code rather than rewrite it wholesale, you’ve got a balanced point of view, imho.&lt;/p&gt;

&lt;p&gt;Predictably, most commentators got caught up in the X-is-a-better-language-than-not-X argument for nearly any possible value of X. I’m kinda down with &lt;a href=&quot;http://www.paulgraham.com/avg.html&quot;&gt;Paul Graham on this one&lt;/a&gt;: there are better and worse languages. We part ways, however, in that PG feels the continuum is absolute where I believe it’s a matter of perspective, turning on a complex set of factors such as purpose, expertise of the available team, timeline, expected lifecycle, hiring pool, &amp;amp;c.&lt;/p&gt;

&lt;p&gt;It’s arguable, though, that since I don’t know Lisp, I lack the proper perspective. I’ll share three interesting quotes from &lt;a href=&quot;http://www.paulgraham.com/quotes.html&quot;&gt;Paul Graham’s quotes page&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“SQL, Lisp, and Haskell are the only programming languages that I’ve seen where one spends more time thinking than typing.” &lt;em&gt;—Philip Greenspun&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;“We were not out to win over the Lisp programmers; we were after the C++ programmers.  We managed to drag a lot of them about halfway to Lisp.” &lt;em&gt;—Guy Steele, Java spec co-author&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;“Some may say Ruby is a bad rip-off of Lisp or Smalltalk, and I admit that. But it is nicer to ordinary people.” &lt;em&gt;—Matz, LL2&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I guess it’s time to learn Lisp …&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Post Mortem Ruminations</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-pos.html"/>
   <updated>2007-09-11T01:01:00-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-pos</id>
   <content type="html">&lt;p&gt;I’ve been reflecting on the &lt;a href=&quot;http://railsrumble.com&quot;&gt;RailsRumble&lt;/a&gt; and our &lt;a href=&quot;http://artlog.railsrumble.com/&quot;&gt;less-than-successful entry&lt;/a&gt; and thought I’d share some observations while they’re fresh.&lt;/p&gt;

&lt;iframe width=&quot;300&quot; scrolling=&quot;no&quot; height=&quot;300&quot; frameborder=&quot;0&quot; src=&quot;http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Orange,+CA+to+Alameda,+CA&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=40.732051,62.753906&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;s=AARTsJoAPG4Jr9fq9rlwTcGQs4HdfP_IRg&amp;amp;ll=35.782171,-120.036621&amp;amp;spn=5.346634,6.591797&amp;amp;z=6&amp;amp;output=embed&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot;&gt; &lt;/iframe&gt;
&lt;p&gt;&lt;small&gt;&lt;strong&gt;Jen’s Long Drive&lt;/strong&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;First, let me frame this up for you. &lt;a href=&quot;http://blackphoebe.com/msjen/&quot;&gt;Jenifer Hanen&lt;/a&gt; and I jumped into this at the last minute (we were team #140, registered roughly 12 hours before registration closed) in the midst of busy lives and on the basis of a recently-formed friendship but no prior collaborative experience or sense of each others depth, breadth, or style. We live about 400 miles apart, so there aren’t any opportunities for casual communication. I have a wonderful wife and the two best kids on the planet who were very indulgent of what was later termed “my two-day playdate,” (which nearly made me shoot tea out my nose =) but can’t ever be put on full ignore.&lt;/p&gt;

&lt;p&gt;We went in with a low-pressure, let’s-have-fun-while-trying-to-make-something attitude. We knew that busy schedules before and during as well as the vagaries of busy lives could mean any number of interruptions and possibly just end the contest early for us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I got to know Jen better.&lt;/strong&gt; New collaborations are hard; as much as you may think you’ll just get together and throw down, you’ll invest a lot of (fun!) time telling stories, swapping philosophies, and getting a sense of what the other one means when they say something like, “don’t sweat that other stuff.” &lt;em&gt;What’s the other stuff and why am I not sweating it? Should I have been sweating it earlier?&lt;/em&gt; We could have conquered this by getting together sooner, but we were both swamped right up to contest start time and beyond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I learned more abut CSS and Javascript in a weekend&lt;/strong&gt; than at the last three conferences I’ve attended. Hanging out with practitioners of an art is, for me, the best way to learn. But then, I like people and conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I have a much deeper (and clearer) understanding of Capistrano.&lt;/strong&gt; I like the namespaces in Cap 2.0; I also like the big pile of implicit tasks you get.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You never think you’re over-complicating things, even when you are.&lt;/strong&gt; I was. Ironically, it’s one of the things I most watch for (and kill quick) when managing software teams … and I got a very intimate view of the other side of the coin. Probably the single biggest lesson I learned; I’ll blog about it more later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints are good.&lt;/strong&gt; The usual cliches, from Parkinson’s Law to “art is never finished, just abandoned” to “what gets measured gets managed,” are near and dear to my heart. In retrospect, I wish we’d mapped out the time and attached loose deadlines to stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It takes a village.&lt;/strong&gt; There were many of you who helped with advice and well wishes before during and after. Thank you for that.&lt;/p&gt;

&lt;p&gt;I also learned a bunch of stuff that I’d already know if I read &lt;a href=&quot;http://pragmaticprogrammer.com/titles/rails/index.html&quot;&gt;Agile Web Development with Rails&lt;/a&gt; from end to end. I’m going to make time to skim it once through and try to take notes rather than dive in and play with new bits. I’ll post some of the bits here.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Economics &amp; Fishing</title>
   <link href="http://blog.geekdaily.org/2007/09/economics-fishi.html"/>
   <updated>2007-09-10T21:20:57-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/economics-fishi</id>
   <content type="html">&lt;p&gt;Anyone ever notice that nearly every reading in economics involves a fishing story?&lt;/p&gt;

&lt;p&gt;I think it’s so economists can deduct fishing vacations as research.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: It&#39;s Over.</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-its.html"/>
   <updated>2007-09-09T21:14:06-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-its</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt; we don’t have a complete app. It’s unfortunate, but true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt; I’ve learned an incredible amount in two days, and we’ve got a solid start on what it will be.&lt;/p&gt;

&lt;p&gt;I’ll post-mortem the effort in several posts; for now, I’ll observe three things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ms. Jen’s a goddess CSS and Javascript.&lt;/li&gt;
  &lt;li&gt;We worked hard and had fun (and good food and good drink =).&lt;/li&gt;
  &lt;li&gt;My wife’s the most wonderful, generous woman in the world.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Next year …&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Halfway ...</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-hal.html"/>
   <updated>2007-09-08T20:57:23-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-hal</id>
   <content type="html">&lt;p&gt;…and we’re chugging along. A slow start – we both decided that next time we’ll get together the day before to do all the brainstorming, model mapping, etc., but we’re well on our way and things will start being visible soon. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Phase 1 Complete</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-pha.html"/>
   <updated>2007-09-08T02:38:23-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-pha</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://artlog.railsrumble.com/&quot;&gt;Nothing to see yet&lt;/a&gt;, really; there are some sketched-in models and a basic controller underneath it all but no views (yet). If you’re looking for visuals, check the &lt;a href=&quot;http://flickr.com/groups/railsrumble/pool/&quot;&gt;RailsRumble Flickr pool&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The server’s up, running, with all the gems we need (so far), including RMagick (which went quietly if really long). &lt;a href=&quot;http://www.tildeslash.com/monit&quot;&gt;Monit&lt;/a&gt; is keeping an eye on things, and &lt;a href=&quot;http://munin.projects.linpro.no/&quot;&gt;munin&lt;/a&gt;’s running for the fun of it. I know a lot more about the underpinnings of Rails than I did before.&lt;/p&gt;

&lt;p&gt;Time for sleep … it’s gonna be a long day tomorrow. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble.start!</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumblestar.html"/>
   <updated>2007-09-07T21:00:00-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumblestar</id>
   <content type="html">&lt;p&gt;Here we go:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ArtLog is available at &lt;a href=&quot;http://artlog.geekdaily.org/&quot;&gt;http://artlog.railsrumble.com/&lt;/a&gt; . We’re going to deploy early and often, so if it doesn’t seem to be up, try again in a minute.&lt;/li&gt;
  &lt;li&gt;Our development mailing list is up; join via the &lt;a href=&quot;http://lists.geekdaily.org/listinfo.cgi/artlog-dev-geekdaily.org&quot;&gt;web&lt;/a&gt; or &lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#097;&amp;#114;&amp;#116;&amp;#108;&amp;#111;&amp;#103;&amp;#045;&amp;#100;&amp;#101;&amp;#118;&amp;#045;&amp;#114;&amp;#101;&amp;#113;&amp;#117;&amp;#101;&amp;#115;&amp;#116;&amp;#064;&amp;#108;&amp;#105;&amp;#115;&amp;#116;&amp;#115;&amp;#046;&amp;#103;&amp;#101;&amp;#101;&amp;#107;&amp;#100;&amp;#097;&amp;#105;&amp;#108;&amp;#121;&amp;#046;&amp;#111;&amp;#114;&amp;#103;&amp;#063;&amp;#115;&amp;#117;&amp;#098;&amp;#106;&amp;#101;&amp;#099;&amp;#116;&amp;#061;&amp;#115;&amp;#117;&amp;#098;&amp;#115;&amp;#099;&amp;#114;&amp;#105;&amp;#098;&amp;#101;&amp;#038;&amp;#098;&amp;#111;&amp;#100;&amp;#121;&amp;#061;&amp;#115;&amp;#117;&amp;#098;&amp;#115;&amp;#099;&amp;#114;&amp;#105;&amp;#098;&amp;#101;&quot;&gt;email&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Please look at our app as often as you can/care to and &lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#097;&amp;#114;&amp;#116;&amp;#108;&amp;#111;&amp;#103;&amp;#045;&amp;#100;&amp;#101;&amp;#118;&amp;#064;&amp;#108;&amp;#105;&amp;#115;&amp;#116;&amp;#115;&amp;#046;&amp;#103;&amp;#101;&amp;#101;&amp;#107;&amp;#100;&amp;#097;&amp;#105;&amp;#108;&amp;#121;&amp;#046;&amp;#111;&amp;#114;&amp;#103;&amp;#063;&amp;#115;&amp;#117;&amp;#098;&amp;#106;&amp;#101;&amp;#099;&amp;#116;&amp;#061;&amp;#065;&amp;#114;&amp;#116;&amp;#076;&amp;#111;&amp;#103;&amp;#037;&amp;#050;&amp;#048;&amp;#070;&amp;#101;&amp;#101;&amp;#100;&amp;#098;&amp;#097;&amp;#099;&amp;#107;&amp;#033;&quot;&gt;send us comments!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ve got until 9p PDT Sunday to do the deed. Wish us luck!&lt;/p&gt;

&lt;p&gt;Wheeee!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Who&#39;s Rumbling?</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-who.html"/>
   <updated>2007-09-07T15:45:47-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-who</id>
   <content type="html">&lt;p&gt;I’ve found two teams blogging with the &lt;a href=&quot;http://technorati.com/tag/railsrumble&quot;&gt;RailsRumble&lt;/a&gt; tag:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://railsadvocates.blogspot.com/&quot;&gt;RailsAdvocates Finland&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://info-architects.net/&quot;&gt;The Top Secret Project Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you spot any others, let me know. It’s gonna be fun to see what folks are thinking and doing in the next couple of days …&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Choosing the OS for VPS</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-cho.html"/>
   <updated>2007-09-07T13:33:01-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-cho</id>
   <content type="html">&lt;p&gt;The work begins before the contest: they’ve asked that we set up our VPS before the contest starts to avoid an enormous pileup at 12p EDT. Having watched &lt;a href=&quot;http://smartic.us/2007/9/4/smarticast-4-rails-rumble-primer&quot;&gt;the excellent smarticast re: setting up a Linode VPS&lt;/a&gt;, it’s easy to see that Linode’s got things pretty sweetly automated to handle that part. However, I’ve never been a serious Debian user or admin, so as much as I’d love to just follow the instructions, I have to balance that against my ability to debug esoteric system issues like the ones you can encounter installing RMagick … so I started asking around for advice.&lt;/p&gt;

&lt;p&gt;This is where I should note that Linode has a wide array of choices with all your favorites, from CentOS to Ubuntu, as well as some less common (I think) choices like Arch Linux and ActiveGrid. Most of my Linux history splits between Slackware (early days) and RedHat (later and enterprise days), but have heard really good things about Gentoo for its flexibility, stability, and compact footprint. Talking with several smart people, I ended up choosing CentOS 5 as the Rails-production-proven OS which will require the least configuration work and provide the most comfort for me should things head south.&lt;/p&gt;

&lt;p&gt;Many, many thanks to Matt of &lt;a href=&quot;http://eastmedia.com/&quot;&gt;EastMedia&lt;/a&gt;, &lt;a href=&quot;http://brainspl.at/&quot;&gt;Ezra&lt;/a&gt; of &lt;a href=&quot;http://engineyard.com/&quot;&gt;EngineYard,&lt;/a&gt; and &lt;a href=&quot;http://blog.railsmachine.com/&quot;&gt;Bradley&lt;/a&gt; of &lt;a href=&quot;http://railsmachine.com/&quot;&gt;RailsMachine&lt;/a&gt; for their excellent advice about distros, configuration, and well wishes.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RubyConf Registration is Open</title>
   <link href="http://blog.geekdaily.org/2007/09/rubyconf-regist.html"/>
   <updated>2007-09-07T10:59:40-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/rubyconf-regist</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://chadfowler.com/&quot;&gt;Chad’s&lt;/a&gt; announced &lt;a href=&quot;http://chadfowler.com/2007/9/6/rubyconf-registration-is-open&quot;&gt;the opening of RubyConf registration&lt;/a&gt; (at &lt;a href=&quot;http://www.regonline.com/Checkin.asp?EventId=145820&quot;&gt;regonline.com&lt;/a&gt;), though &lt;a href=&quot;http://rubyconf.org/&quot;&gt;the official website&lt;/a&gt; hasn’t yet been updated. Register soon as it’s likely to sell out (again). Meanwhile, the Omni Charlotte has a block of rooms available for RubyConf at $109/night. I’d book fast as that’s a stellar rate in the neighborhood and the Omni has zero availability otherwise.&lt;/p&gt;

&lt;p&gt;Four Ruby conferences in 6 months feels like an addiction; my wife’s certainly questioning my sanity, and rightly so. Still, the immense amount of quick learning and the fantastic folks (and werewolves) at these conferences make it incredibly worth it.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>RailsRumble: Strategy, Phase 1</title>
   <link href="http://blog.geekdaily.org/2007/09/railsrumble-str.html"/>
   <updated>2007-09-05T23:59:27-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/railsrumble-str</id>
   <content type="html">&lt;p&gt;Our first steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://smartic.us/2007/9/4/smarticast-4-rails-rumble-primer&quot;&gt;Configure linode VPS&lt;/a&gt; (and huge thanks to Bryan at &lt;a href=&quot;http://smartic.us/&quot;&gt;Smartic.us&lt;/a&gt; for the screencast!)&lt;/li&gt;
  &lt;li&gt;Install and configure &lt;a href=&quot;http://www.tildeslash.com/monit/&quot;&gt;monit&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Create the app&lt;/li&gt;
  &lt;li&gt;Commit to svn&lt;/li&gt;
  &lt;li&gt;Deploy! (and watch for problems)&lt;/li&gt;
  &lt;li&gt;Add (broken) tests for the gems we’ll need&lt;/li&gt;
  &lt;li&gt;Install the gems&lt;/li&gt;
  &lt;li&gt;Run (now successful) tests&lt;/li&gt;
  &lt;li&gt;Commit to svn repo&lt;/li&gt;
  &lt;li&gt;Deploy!&lt;/li&gt;
  &lt;li&gt;Cause some intentional failures to be sure they recover or warn appropriately&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’re only allowed to touch things during the 48 hours from 9p PDT Friday to 9p PDT Sunday and we want to spend most of that time working on the app (or cooking, drinking, playing with kids, sleeping, etc.) so it makes sense to us to get all the infrastructure in place and working first thing.&lt;/p&gt;

&lt;p&gt;Meanwhile, we’re looking for folks who can poke, prod, and provide feedback on the app starting ~10a Saturday. We’re figuring that more feedback as we iterate is better. If you volunteer, we’ll ping you each time we deploy; look when you can, offer any feedback you have. We figure the more feedback we get during the development period, the better, so please tell all your friends.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Ready to Rumble!</title>
   <link href="http://blog.geekdaily.org/2007/09/ready-to-rumble.html"/>
   <updated>2007-09-05T22:39:29-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/ready-to-rumble</id>
   <content type="html">&lt;p&gt;So, this weekend, &lt;a href=&quot;http://blackphoebe.com/msjen/&quot;&gt;Ms. Jen Hanen&lt;/a&gt; and I are going to participate in the &lt;a href=&quot;http://railsrumble.com/&quot;&gt;RailsRumble&lt;/a&gt;. In the space of 48 hours, starting at 9p PDT, we’re going to build, test – okay: test, build, deploy, and repeat on an app called ArtLog. And we’ll be blogging from now to the end (and beyond) about the experience.&lt;/p&gt;

&lt;p&gt;Lucky you. ;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>0-30% Test Coverage? That&#39;s Nothing.</title>
   <link href="http://blog.geekdaily.org/2007/09/0-30-test-cover.html"/>
   <updated>2007-09-04T00:47:31-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/0-30-test-cover</id>
   <content type="html">&lt;p&gt;I’m finding with some amusement that most cases where rcov says something is 30% covered or less, this means all the function definitions (e.g. &lt;tt&gt;def foo(bar)&lt;/tt&gt;) are covered … and nothing else.&lt;/p&gt;

&lt;p&gt;Time to put all the excellent knowledge gained at Ruby Hoedown and RailsEdge to good use …&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>More cool tech from SIGGRAPH</title>
   <link href="http://blog.geekdaily.org/2007/09/more-cool-tech-.html"/>
   <updated>2007-09-01T09:45:47-07:00</updated>
   <id>http://blog.geekdaily.org/2007/09/more-cool-tech-</id>
   <content type="html">&lt;p&gt;A full 360° display using synced projection onto a rapidly spinning mirror:&lt;/p&gt;

&lt;object width=&quot;425&quot; height=&quot;353&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/FF1vFTQOWN4&quot; /&gt;
&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot; /&gt;
&lt;embed width=&quot;425&quot; height=&quot;353&quot; src=&quot;http://www.youtube.com/v/FF1vFTQOWN4&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; /&gt;&lt;/object&gt;

&lt;p&gt;Seems practical for small displays. I’ll be curious to see if anyone commercializes this; seems like it has obvious medical imaging applications as well as biotech/nanotech.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Thoughts on Software Testing and Rails (a little)</title>
   <link href="http://blog.geekdaily.org/2007/08/thoughts-on-sof.html"/>
   <updated>2007-08-31T15:51:05-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/thoughts-on-sof</id>
   <content type="html">&lt;p&gt;Three good reasons to make sure your code has full, solid test coverage:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Tests are a transfer of confidence from you to the next developer down the line. It’s a joy to walk into a codebase that’s fully covered by solid tests. It means I can safely seek to understand only the part of system I need to alter rather than worry over side effects of my changes. It doesn’t guarantee there won’t be any side effects, but if there are, they’re either (a) found immediately due to the tests, (b) new, or (c) harmless.&lt;/li&gt;
  &lt;li&gt;Tests are distributed ownership. The level of confidence I mentioned above means new developers can hit the ground running and start to take ownership of some portion of the code nearly immediately. In turn, earlier code owners can move on to the next interesting problem rather than taking a new job just to get their hands on a new challenge. Rapid onboarding, continued growth of mature team members – &lt;em&gt;did you hear that, you managers of technologists?&lt;/em&gt; It’s in your best interest to demand your codebase is fully covered by solid tests.&lt;/li&gt;
  &lt;li&gt;Time spent testing saves time. &lt;a href=&quot;http://blog.jayfields.com/2007/08/importance-of-time.html&quot;&gt;Time is your most valuable asset&lt;/a&gt;. Nuff sed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You knew all this, though. You can’t have been a software engineer for any length of time without the test-early-test-often meme coming into your consciousness. What you did with it depends on the culture you were in at the time. For me, it was 1999 when I got my first SIGSOFT proceedings talking about this “coverage testing” thing which sounds &lt;em&gt;really&lt;/em&gt; cool … but the studio where I was working didn’t much value testing and I was the juniormost engineer in a team of nearly 60 developers. They &lt;em&gt;must&lt;/em&gt; know better than me, right? It took me a few years to get over that and start writing tests wherever I could. But I’m not bitter. Really.&lt;/p&gt;

&lt;p&gt;One of the most incredibly great things about the Rails community is its passionate pursuit of testing. I don’t think I’ve ever seen a development community which &lt;a href=&quot;http://manuals.rubyonrails.com/read/book/5&quot;&gt;values&lt;/a&gt; &lt;a href=&quot;http://www.ibm.com/developerworks/web/library/wa-rails4/index.html?ca=drs-&quot;&gt;testing&lt;/a&gt; &lt;a href=&quot;http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet&quot;&gt;so&lt;/a&gt; &lt;a href=&quot;http://clarkware.com/cgi/blosxom/TDD&quot;&gt;highly,&lt;/a&gt; &lt;a href=&quot;http://www.robbyonrails.com/articles/2007/04/10/bdd-is-still-kinky&quot;&gt;discusses&lt;/a&gt; &lt;a href=&quot;http://onestepback.org/&quot;&gt;it&lt;/a&gt; &lt;a href=&quot;http://www.lukeredpath.co.uk/2006/8/29/developing-a-rails-model-using-bdd-and-rspec-part-1&quot;&gt;so&lt;/a&gt; &lt;a href=&quot;http://blog.davidchelimsky.net/&quot;&gt;frequently&lt;/a&gt;, and even goes so far as &lt;a href=&quot;http://www.danielfischer.com/2007/05/14/ruby-on-rails-bdd-with-autotest-growl-rspec/&quot;&gt;to&lt;/a&gt; &lt;a href=&quot;http://railstips.org/2007/7/23/autotest-growl-pass-fail-notifications&quot;&gt;make&lt;/a&gt; &lt;a href=&quot;http://szeryf.wordpress.com/2007/07/30/way-beyond-cool-autotest-growl-doomguy/&quot;&gt;testing&lt;/a&gt; &lt;a href=&quot;http://fozworks.com/2007/7/28/autotest-sound-effects&quot;&gt;cool&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s cool to do the right thing? Excellent.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Alice is Lost!</title>
   <link href="http://blog.geekdaily.org/2007/08/alice-is-lost.html"/>
   <updated>2007-08-31T09:38:48-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/alice-is-lost</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.aliceislost.com/&quot;&gt;Have you seen her?&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Ms. Teen South Carolina</title>
   <link href="http://blog.geekdaily.org/2007/08/ms-teen-south-c.html"/>
   <updated>2007-08-31T09:16:28-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/ms-teen-south-c</id>
   <content type="html">&lt;p&gt;I’d taken peripheral notice of the Ms.-Teen-South-Carolina-Answers-A-Question meme but hadn’t checked it out because, frankly, I knew what I’d find: we’d all be laughing at a teenage girl who, despite spending an inordinate amount of her young life seeking beauty, poise and grace, blew it when presented with one of the slow-pitched softball questions pageants gently lob to their beauty queens in waiting.&lt;/p&gt;

&lt;p&gt;I just &lt;a href=&quot;http://www.youtube.com/watch?v=lj3iNxZ8Dww&quot;&gt;watched the video&lt;/a&gt; this morning and it was all I expected and more. Frustrating and saddening, seeing how many people are reveling in a teenager’s moment of anguish using it as the basis of fallacious arguments against Southerners (I’m one), Americans (me again), and nearly any other way they can slice this to get at their favorite love-to-hate-‘em group.&lt;/p&gt;

&lt;p&gt;Then I saw this video response, courtesy &lt;a href=&quot;http://therealnewsjunkies.ning.com/&quot;&gt;The Real News Junkies&lt;/a&gt;:&lt;/p&gt;

&lt;object width=&quot;425&quot; height=&quot;353&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/JpKlwowYpbg&quot; /&gt;
&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot; /&gt;
&lt;embed width=&quot;425&quot; height=&quot;353&quot; src=&quot;http://www.youtube.com/v/JpKlwowYpbg&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; /&gt;&lt;/object&gt;

&lt;p&gt;Right on. STFU, y’all.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Topology of Social Networks</title>
   <link href="http://blog.geekdaily.org/2007/08/the-topology-of.html"/>
   <updated>2007-08-30T22:08:46-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/the-topology-of</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://redcouch.typepad.com/&quot;&gt;Shel Israel&lt;/a&gt; &lt;a href=&quot;http://redcouch.typepad.com/weblog/2007/08/friendwheel.html&quot;&gt;makes some astute observations&lt;/a&gt; about the nature of one’s social network. He’s far too social (read: non-geeky) to have discussed it in terms of &lt;a href=&quot;http://en.wikipedia.org/wiki/Network_topology&quot;&gt;star vs. mesh topology&lt;/a&gt; but his observation made me consider that these are the two ends of the social network spectrum. More star-like and you’re either a focal point or a nexus; more mesh-like and you’re involved in one or more vibrant, potentially overlapping social communities. I’d also posit that full connection (all members are connected to all other members) is the most vibrant a community can possibly be.&lt;/p&gt;

&lt;p&gt;This got me wondering if anyone’s thinking about topology of social networks; searching a bit says yes, but in communities I didn’t expect: &lt;a href=&quot;http://www.google.com/search?q=%2B%22social+network+topology%22+%2B%27computer+virus%27&quot;&gt;computer&lt;/a&gt; and &lt;a href=&quot;http://www.google.com/search?q=%2B%22social+network+topology%22+%2Bdisease&quot;&gt;human&lt;/a&gt; virus vector studies, &lt;a href=&quot;http://www.google.com/search?q=%2B%22social+network+topology%22+%2Bagents&quot;&gt;automated agents&lt;/a&gt;, and &lt;a href=&quot;http://www.google.com/search?q=%2B%22social+network+topology%22+%2Bterrorism&quot;&gt;counter-terrorism&lt;/a&gt;. In and amongst all that, I tripped over &lt;a href=&quot;http://www.google.com/search?q=social+network+topology&quot;&gt;this gem&lt;/a&gt; which ties in one of my favorite topics, reputation, into the mix. Cool!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>DIY Upper Atmosphere Photography</title>
   <link href="http://blog.geekdaily.org/2007/08/diy-upper-atmos.html"/>
   <updated>2007-08-28T18:35:15-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/diy-upper-atmos</id>
   <content type="html">&lt;p&gt;I can’t wait until Sam’s old enough to think this is cool so we can do it together.&lt;/p&gt;

&lt;p&gt;I might &lt;em&gt;not&lt;/em&gt; wait.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.sbszoo.com/bear/sable/sable3.htm&quot; title=&quot;SABLE-3 Balloon Launch&quot;&gt;SABLE-3 Balloon Launch&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Difficulty of Non-Technical Users</title>
   <link href="http://blog.geekdaily.org/2007/08/the-difficulty-.html"/>
   <updated>2007-08-28T17:41:20-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/the-difficulty-</id>
   <content type="html">&lt;p&gt;Two things struck me about &lt;a href=&quot;http://schwehr.org/blog/archives/2007-08.html#e2007-08-28T11_10_46.txt&quot;&gt;Kurt’s post&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It’s an incredible pleasure to watch a domain expert at work.&lt;/li&gt;
  &lt;li&gt;Every technologist has to deal with the dilemma of non-technical technology users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every technologist should have a measure of their market’s median technical ability and target it carefully. And I’d have to say that differently if both of my readers weren’t technical.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://schwehr.org/blog/archives/2007-08.html#e2007-08-28T11_10_46.txt&quot; title=&quot;Kurt&#39;s Weblog: August 2007 Archives&quot;&gt;Kurt’s Weblog: External Sensors to Verify AIS Ship Data&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Live! Nude! Code!</title>
   <link href="http://blog.geekdaily.org/2007/08/live-nude-code.html"/>
   <updated>2007-08-27T15:50:22-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/live-nude-code</id>
   <content type="html">&lt;p&gt;I love a good code review. Looking at real, honest-to-goodness deployed code is one of the best ways to learn the idiom of a language as well as what gets done through the exigencies of circumstance (a nice way to say, “things I done ‘cause I’m ignernt and inna hurry”). &lt;em&gt;Speaking of dumb and rushed, you should attribute any goofs to my misunderstanding or poor expression of what was actually said; &lt;a href=&quot;http://forum.wordreference.com/showthread.php?t=231515&quot;&gt;I am but an egg&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Watching this session with &lt;a href=&quot;http://chadfowler.com/&quot;&gt;Chad Fowler&lt;/a&gt; and &lt;a href=&quot;http://www.vernix.com/&quot;&gt;Marcel Molina, Jr.&lt;/a&gt; at the helm, I discovered the meta-enjoyment of watching two experts in the idiom of a given language who also have both a frankness and a generosity of spirit review code. They were funny, explicit about their methodology, candid about their ignorance, and inviting of comment from the room. This is how code reviews should be done.&lt;/p&gt;

&lt;p&gt;Marcel likes to start with &lt;tt&gt;&lt;strong&gt;rake stats&lt;/strong&gt;&lt;/tt&gt;. (Note: this caused me to trip over flog, an ABC He generally is looking for as much of the code as possible to be driven down into the models (and quoted &lt;a href=&quot;http://weblog.jamisbuck.org/&quot;&gt;Jamis Buck’s&lt;/a&gt; &lt;a href=&quot;http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model&quot;&gt;“Skinny Controller, Fat Model” blog post&lt;/a&gt;). I seem to recall he liked at least a 2-to-1 ratio of model-to-controller code, but I could easily be mistaken. We were looking at the code for a real app written by someone in the room that was about 5K lines of code, which Marcel referred to as “pretty big” … which makes me think PublicSquare rates as “really big” with its 10K lines, but it hits the 2:1 ratio well. (I could wish it had 100% coverage, but we’ll get there …) &lt;/p&gt;

&lt;p&gt;They started on the biggest model with the thought that it would offer the most opportunity for refactoring. And then the rapid-fire observations started:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache sweepers are much like an ActiveRecord Observer&lt;/strong&gt; but they have access to the controller, too. I seem to recall Chad or Marcel frowning a bit about their use in this case, but I didn’t note why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TextMate’s TODO bundle&lt;/strong&gt; allows you to collect the traditional “# TODO”, “# FIXME”, and any others you’d like to define into a printable, saveable list. Color coding included. Nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using composed_of is an excellent way to create objects&lt;/strong&gt; which can do smart things without requiring a full ActiveRecord class (and db table) behind them. A made-up example; rather than:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;student.full_namestudent.reversed_full_name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… do something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;student.full_namestudent.full_name.reversed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… and you can then create a method wrapper or delegation on student if you’re a strict interpreter of the  &lt;a href=&quot;http://en.wikipedia.org/wiki/Law_of_Demeter&quot;&gt;Law of Demeter&lt;/a&gt; (more below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naked finds in a controller&lt;/strong&gt; (think: @foo = Foo.find_by_bar(…)) &lt;strong&gt;are a red flag&lt;/strong&gt; that some model is missing a needed method. Additionally (and it may be elementary but bears repeating), if you’ll &lt;strong&gt;generally follow the CRUD model in your controllers&lt;/strong&gt; , carving out what you don’t need, you’ll end up with cleaner, more readable apps. This was in line with Chad’s observation that he actually likes to start with the scaffolding and trim back.&lt;/p&gt;

&lt;p&gt;At one point a debate on the proper observation of the Law of Demeter broke out, largely expressed in terms of “dot tolerance” (e.g. “I don’t like to see more than one dot – foo.bar(); foo.bar.baz() should b refactored to something like foo.baz_the_bar()” vs. “I’ll usually allow two dots – foo.bar.baz(); anything past that needs refactoring.”) During the discussion, &lt;a href=&quot;http://www.dcmanges.com/blog/37&quot;&gt;Dan Manges’ post on the Law of Demeter&lt;/a&gt; and &lt;a href=&quot;http://www.pivotalblabs.com/articles/2007/08/05/lovely-demeter-meter-maid&quot;&gt;the response from Alex at Pivotal Labs&lt;/a&gt; were mentioned; the comments on the latter are entertaining and informative. Dave Thomas ended the debate an amusing observation: “[The ‘Law of Demeter’ is] the worst named thing in computer science. There is no law. It’s just ‘The Generally Accepted Good Idea of Demeter’.”&lt;/p&gt;

&lt;p&gt;Hey Technorati! Get this: &lt;a href=&quot;http://technorati.com/tag/therailsedge&quot;&gt;therailsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge&quot;&gt;railsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge2007&quot;&gt;railsedge2007&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Digging It Up with Dave Thomas</title>
   <link href="http://blog.geekdaily.org/2007/08/digging-it-up-w.html"/>
   <updated>2007-08-27T13:06:06-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/digging-it-up-w</id>
   <content type="html">&lt;p&gt;&lt;em&gt;mental note: I should liveblog like &lt;a href=&quot;http://gilesbowkett.blogspot.com/2007/08/dave-thomas-rails-treasures-notes.html&quot;&gt;Giles&lt;/a&gt; did. His terse notes are incredibly readable. I don’t know that my additional pass does anything but delay getting it out there.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the most, if not &lt;em&gt;the&lt;/em&gt; most, information-dense presentation was &lt;a href=&quot;http://pragmaticstudio.com&quot;&gt;Dave Thomas&lt;/a&gt;’ “Buried Treasures: Hidden Rails Tips.” It’s a bit of a misnomer; some of the best learning I had was about TextMate&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PLEASE NOTE: the code below is pseudocode only. It will not run. If you try to run this code, it will likely cause all of your pet’s hair to fall out.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;with_scope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apply scoping conditions, etc., to ActiveRecord finds. Two interesting ways to call this:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;with_scope.(:find =&amp;gt; {:readonly =&amp;gt; true}, :create =&amp;gt; {…}, :conditions, :order, :limit )&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;… or …&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LimitNotExceeded = {:conditions =&amp;gt; &#39;...&#39;, ...}NotExpired = {:conditions =&amp;gt; &#39;...&#39;, ...}with_scope(LimitNotExceeded) do  with_scope(NotExpired) do    find(:all)  endend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;with_options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Great for DRYing up your routes file ( &lt;a href=&quot;http://weblog.jamisbuck.org/2007/1/24/object-with_options&quot;&gt;Jamis Buck agrees&lt;/a&gt;), &lt;strong&gt;but as it’s available on all Ruby objects you&lt;/strong&gt; could use this to factor out repeated options in any block of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;returning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is awesome. Change this crappy construction:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def badly_coded(foo)  status = foo.do_that_thing(:with_that_stuff)  unless status    unless status = foo.do_some_recovery_thing      logger.warning(&quot;That didn&#39;t go right ...&quot;)    end  end  statusend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;… to this nifty, readable one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def shiny_shiny(foo)  returning foo.do_that_thing(:with_that_stuff) do |status|    unless status = foo.do_some_recovery_thing      logger.warning(&quot;That didn&#39;t go right ...&quot;)    end  endend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;each_with_index&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yeah, everyone but me knew about this one, but it’s one I’ve wished for in Perl and Python so it’s nice to have tripped over it in passing. [As &lt;a href=&quot;http://www.bigasterisk.com/&quot;&gt;Drew&lt;/a&gt; points out in the comments, Python has a form of this.]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lookup Constants&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have a cryptic note “Use them for compile time caching” and I don’t have the slides handy so I can’t decrypt right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t Call Models in Migrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IIRC, this came from a quick side discussion: to avoid the race condition where a model column you need to manipulate might not exist in the database quite yet, you should recreate the model object in the migration rather than call it through ActiveRecord. This bit me a while back and I hacked around it with far less grace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Date Formats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are some built-ins:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time.now.to_s(:db)Time.now.to_s(:short)Time.now.to_s(:long)Time.now.to_s(:rfc822)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can add your own:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time::DATE_FORMATS.merge!(:timestamp =&amp;gt; &#39;%Y%m%d.%H%M%S&#39;)Time.now.to_s(:timestamp)=&amp;gt; &quot;20070827.122334&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should never need strftime again. =]&lt;/p&gt;

&lt;p&gt;BTW, &lt;tt&gt;(now..then).to_s(:db)&lt;/tt&gt; makes a proper BETWEEN clause. Sweet!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partitioning Groups: group_by&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; (1..20).group_by {|n| n % 3}=&amp;gt; {0=&amp;gt;[3, 6, 9, 12, 15, 18], 1=&amp;gt;[1, 4, 7, 10, 13, 16, 19], 2=&amp;gt;[2, 5, 8, 11, 14, 17, 20]}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Related are &lt;tt&gt;index_by&lt;/tt&gt; and &lt;tt&gt;in_groups_of&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Groovy String Tricks&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;str = &quot;Ruby on Rails&quot;str.at(3)str.from()str.to()str.first()str.last()str.each_char {...}%w{Foo Bar Baz}.to_sentence(:connector =&amp;gt; &#39;and also&#39;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;generate + svn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t forget to add/remove your generated bits again.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate model foo --svnscript/destroy model foo --svn
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Groovy console Tricks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can create a custom .irbrc file to preserve command history, etc. Dave said he’d post his; until then, here’s &lt;a href=&quot;http://romeda.org/blog/2006/11/irbrc.html&quot;&gt;Blaine Cook’s&lt;/a&gt;, an &lt;a href=&quot;http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb/&quot;&gt;exploded view of Dr. Nic’s&lt;/a&gt;, and &lt;a href=&quot;http://redhanded.hobix.com/inspect/stickItInYourIrbrcMethodfinder.html&quot;&gt;a clever method finder to pop into your .irbrc&lt;/a&gt; [&lt;a href=&quot;http://www.whytheluckystiff.net/ruby/what.irbrc&quot;&gt;irbrc file&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Good to remember that you have an instance of the integration testing ApplicationController as “app”. Mike Clark &lt;a href=&quot;http://clarkware.com/cgi/blosxom/2006/04/04&quot;&gt;blogged a bit about this&lt;/a&gt; last year. Handy.&lt;/p&gt;

&lt;p&gt;A headslapper, in retrospect: you can call &lt;tt&gt;irb SomeClass&lt;/tt&gt; or &lt;tt&gt;irb my_object&lt;/tt&gt; to invoke a subsession inside the scope of that class or instantiated object. I think I’ve got that right.&lt;/p&gt;

&lt;p&gt;And reinforcing &lt;a href=&quot;http://gilesbowkett.blogspot.com/2007/08/evil-rails-console-gotcha-reload.html&quot;&gt;Giles’ observations&lt;/a&gt;, &lt;tt&gt;reload!&lt;/tt&gt; is handy to for getting your code changes into your current console, but it doesn’t reload instantiated objects … so it may not net out. Still, good tool to have handy.&lt;/p&gt;

&lt;p&gt;_ &lt;strong&gt;I’m going to leave out the TextMate shortcuts as I’ve spent too long on this post already. I mentioned this was info-dense, right? &lt;tt&gt;;]&lt;/tt&gt;&lt;/strong&gt; _&lt;/p&gt;

&lt;p&gt;Hey Technorati! Get this: &lt;a href=&quot;http://technorati.com/tag/therailsedge&quot;&gt;therailsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge&quot;&gt;railsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge2007&quot;&gt;railsedge2007&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Context Aware Image Re-Sizing</title>
   <link href="http://blog.geekdaily.org/2007/08/context-aware-i.html"/>
   <updated>2007-08-27T00:29:52-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/context-aware-i</id>
   <content type="html">&lt;p&gt;I was sorry to miss SIGGRAPH this year; now I’m doubly sorry as it seems there was a paper on how to resize and rescale images non-uniformly with the usual artifacts. This is amazingly cool and, as the video demonstrates, has some pretty exceptional uses.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.youtube.com/watch?v=c-SSu3tJ3ns&quot; title=&quot;Context Aware Image Re-Sizing&quot;&gt;Context Aware Image Re-Sizing&lt;/a&gt; [via &lt;a href=&quot;http://radar.oreilly.com/archives/2007/08/context_aware_i.html&quot;&gt;O’Reilly Radar&lt;/a&gt;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Rails and TDD/BDD</title>
   <link href="http://blog.geekdaily.org/2007/08/behavior-driven.html"/>
   <updated>2007-08-24T21:48:44-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/behavior-driven</id>
   <content type="html">&lt;p&gt;&lt;em&gt;I’m going to limit this post to my notes on the excellent learnings from the day of many testing talks at Rails Edge Chicago and follow up with another post for my addle-pated musings thereupon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;First I’d like to observe that &lt;strong&gt;Rails benefits heavily by the fact that Railers care passionately about BDD&lt;/strong&gt; , coverage testing, seeking complete coverage, and beautiful, elegant code. In the past month at various Rails and non-Rails conferences, I’ve heard it hammered over and over again in many ways:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You’ve got to have 100% coverage; anything less is uncertainty.&lt;/li&gt;
  &lt;li&gt;It’s better to submit a test with no patch than a patch with no test.&lt;/li&gt;
  &lt;li&gt;I pretty much don’t accept patches without a test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and many more. This shared mindset results in a community of developers who not only bring an ethic of constant improvement but also who seek to make code ownership irrelevant. More on that in the Conclusions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watching &lt;a href=&quot;http://onestepback.org/&quot;&gt;Jim Weirich&lt;/a&gt; do BDD was a religious experience.&lt;/strong&gt; His talk was titled, “Red, Green, Refactor” which is the concise expression of his process: make a failing test, make the test pass, then do it again. He just sat down and started making tests, then writing just enough code to satisfy the test. It was design on the fly, iteratively building up the model in small increments, testing, and again; part of my joy from this was to watch as an excellent programmer exposed his process, even to the point of incorporating feedback from the room. His rake task for testing tracks the number of times it’s been called. If his talk is to be believed, he does it like this every day. And I believe.&lt;/p&gt;

&lt;p&gt;Incidentally, &lt;strong&gt;Jim writes monster-long test names&lt;/strong&gt; like “test_portfolio_with_one_stock_has_value_same_as_stock_value” &lt;strong&gt;to make his intent instantly readable.&lt;/strong&gt; His point is that you’re only going to type this name once, so don’t let a desire for “manageable” method names get in the way of expressive, semantic naming.&lt;/p&gt;

&lt;p&gt;And he made me realize how cool flexmock is: &lt;tt&gt;flex_mock_obj.should_receive(:quote).times(3).and_return(4,30,100)&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://relevancellc.com/&quot;&gt;Justin Gehtland&lt;/a&gt; and &lt;a href=&quot;http://relevancellc.com/&quot;&gt;Stuart Halloway&lt;/a&gt; are awesome presenters&lt;/strong&gt; and it’s easy to see they enjoy working together. They’re BDD practitioners and advocates of it and it was a pleasure to hear them talk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blog.davidchelimsky.net/&quot;&gt;David Chelimsky&lt;/a&gt;&lt;/strong&gt; is the lead developer of &lt;a href=&quot;http://rspec.rubyforge.org/&quot;&gt;RSpec&lt;/a&gt;, a very thoughtful person (as in “he thinks often and well”, though I’m sure he’s also kind =), and a vicious Werewolf waiting to happen. He did a half-hour speed talk about RSpec, which I’d only just heard about three weeks ago when talking to &lt;a href=&quot;http://eastmedia.com/&quot;&gt;Matt Pelletier&lt;/a&gt; and again a couple of weeks ago at &lt;a href=&quot;http://rubyhoedown2007.confreaks.com/session01.html&quot;&gt;Ruby Hoedown&lt;/a&gt;. The general idea is you define your spec in a domain-specific language (DSL) which can then be executed to demonstrate that you meet spec. This was already on my list, but David’s moved it up quite a lot. He left me with some research:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://dannorth.net/2007/06/introducing-rbehave&quot;&gt;&lt;strong&gt;RBehave&lt;/strong&gt;&lt;/a&gt;: story level behavior testing&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.labnotes.org/2006/09/04/assert_select-cheat-sheet/&quot;&gt;&lt;strong&gt;assert_select&lt;/strong&gt;&lt;/a&gt;: find CSS items in page and assert about them.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://dev.thefrontside.net/crosscheck/wiki/Overview&quot;&gt;CrossCheck&lt;/a&gt;&lt;/strong&gt; : java tool that emulates popular browsers to test your Javascript “in browser”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://www.zenspider.com/ZSS/Products/ZenTest/&quot;&gt;ZenTest/AutoTest&lt;/a&gt;&lt;/strong&gt; : test like mad&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://blog.codefront.net/2007/04/01/get-your-testing-results-via-growl-notifications/&quot;&gt;Test Notifications via Growl&lt;/a&gt;&lt;/strong&gt; : combined with AutoTest, you can just watch things start working as you fix tests. Cool!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;He also gave me reading: &lt;strong&gt;&lt;a href=&quot;http://domaindrivendesign.org/&quot;&gt;Domain Driven Design&lt;/a&gt;&lt;/strong&gt; , by Eric Evans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.elevatedrails.com/&quot;&gt;Mike Mangino&lt;/a&gt;’s&lt;/strong&gt; talk, “Testing for the Real World”, made some excellent points:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Fast tests get run.&lt;/li&gt;
  &lt;li&gt;Slow tests don’t.&lt;/li&gt;
  &lt;li&gt;The only tests that help are the ones that get run.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Actually, &lt;strong&gt;his talk seemed like a barrage of excellent points&lt;/strong&gt; in retrospect; I ended up with a bunch of concise snippets in my notes which I’ll try to reconstitute into full explanations here. Apologies to Mike if I screw it up and libel his abilities; you should assume any errors are in my understanding or ability to explain the concept.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixtures don’t scale well for large quantities of data,&lt;/strong&gt; so if you’re testing against a lot of data you’re best not using them. However, they’re alway useful as templates for test objects; for example, if you’re going to do a bunch of tests which all use the same data with only slight variations (testing each of many validators, &amp;amp;c) it can be handy to get the original object from a fixture and tweak it to suit your test.&lt;/p&gt;

&lt;p&gt;Mocking can reveal the ugly spots when testing a controller. For example, if you find you need to mock a phonebook object to return an entry, an entry object to return a name, and a name object to return a last name … you’ve got issues in the code. In fact, it’s a good generalization that &lt;strong&gt;hard-to-test code very likely needs refactoring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meanwhile, it’s much easier to generate tests for views and controllers if you do them separately. Particularly, Mike recommends mocking helpers in view tests and testing the helpers separately.&lt;/p&gt;

&lt;p&gt;Mike finally said the right words to make the difference between stubbing and mocking stick for me (yeah, I may be dumb but I’m slow). &lt;strong&gt;If the return value is important to the bit you’re testing, mock it; otherwise, stub it.&lt;/strong&gt; He also mentioned that filters are hard to stub, but I didn’t catch an explanation so I’ll have to learn why on my own.&lt;/p&gt;

&lt;p&gt;One of the best snippets: &lt;strong&gt;Tests should be informative first, DRY second&lt;/strong&gt;. You want people who read your tests to instantly get it, not have to slog through various helper functions to figure out what’s going on.&lt;/p&gt;

&lt;p&gt;Oh, and more research: &lt;a href=&quot;http://cruisecontrol.sourceforge.net/&quot;&gt;CruiseControl&lt;/a&gt;, a continuous build/integration tool based on the work of &lt;a href=&quot;http://www.martinfowler.com&quot;&gt;Martin Fowler&lt;/a&gt; and &lt;a href=&quot;http://blog.foemmel.com/&quot;&gt;Matthew Foemmel.&lt;/a&gt; When I tried to have a look at the &lt;a href=&quot;http://cruisecontrolrb.thoughtworks.com/&quot;&gt;Ruby/Rails version&lt;/a&gt; is seemed the server was not responding.&lt;/p&gt;

&lt;p&gt;Hey, Technorati! Get this: &lt;a href=&quot;http://technorati.com/tag/therailsedge&quot;&gt;therailsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge&quot;&gt;railsedge&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/railsedge2007&quot;&gt;railsedge2007&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>MIT&#39;s &#39;clutter detector&#39; could cut confusion - MIT News Office</title>
   <link href="http://blog.geekdaily.org/2007/08/mits-clutter-de.html"/>
   <updated>2007-08-22T14:37:32-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/mits-clutter-de</id>
   <content type="html">&lt;p&gt;This looks promising: some folks at MIT have developed metrics for visual clutter as well as a tool to measure it. Haven’t read &lt;a href=&quot;http://www.journalofvision.org/7/2/17/article.aspx&quot;&gt;the whole paper&lt;/a&gt; yet, but&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://web.mit.edu/newsoffice/2007/clutter-0821.html&quot; title=&quot;MIT&#39;s &#39;clutter detector&#39; could cut confusion - MIT News Office&quot;&gt;MIT’s ‘clutter detector’ could cut confusion - MIT News Office&lt;/a&gt; [via &lt;a href=&quot;http://lifehacker.com/software/notag/-292144.php&quot;&gt;Lifehacker&lt;/a&gt;].&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Scripting News for 8/22/07 « Scripting News Annex</title>
   <link href="http://blog.geekdaily.org/2007/08/scripting-news-.html"/>
   <updated>2007-08-22T13:07:38-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/scripting-news-</id>
   <content type="html">&lt;p&gt;From Dave Winer’s blog &lt;a href=&quot;http://www.scripting.com/&quot;&gt;Scripting News&lt;/a&gt;, &lt;em&gt;&lt;a href=&quot;http://www.scripting.com/stories/2007/08/22/howThingsGetBetter.html&quot;&gt;How Things Get Better&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] Before he had fully settled in I knew it wasn’t going to work. I was able to play out, in my mind, what was about to happen. The software would say nothing to him, so how could he know what to do. I waited and what I predicted did happen. He looked at me and asked “What do I do now?”&lt;/p&gt;

  &lt;p&gt;That’s where the conversation between product and user begins. […]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uncommon common sense. Engage your customers in a conversation and listen carefully – they’ll tell you everything you need to know.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Consistency Pays</title>
   <link href="http://blog.geekdaily.org/2007/08/consistency-pay.html"/>
   <updated>2007-08-21T16:29:42-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/consistency-pay</id>
   <content type="html">&lt;p&gt;&lt;em&gt;A brief observation&lt;/em&gt;: consider well the names you choose for models and their methods. Try very hard to make them intuitive, and not just to a programmer. They’ll haunt you for a long time, especially if you have to expose them via &lt;a href=&quot;http://www.liquidmarkup.org/&quot;&gt;Liquid&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Rails, Oral Tradition, and Getting Started</title>
   <link href="http://blog.geekdaily.org/2007/08/rails-oral-trad.html"/>
   <updated>2007-08-21T15:45:20-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/rails-oral-trad</id>
   <content type="html">&lt;p&gt;Just occurred to me in the aftermath of &lt;a href=&quot;http://blog.geekdaily.org/2007/08/finding-rails-d.html&quot;&gt;last night’s post&lt;/a&gt; that capturing some thoughts about the process of getting started with Ruby on Rails. Just a quick sketch as I’m pressed for time, but here it is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Read and Learn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Buy “ &lt;a href=&quot;http://pragmaticprogrammer.com/titles/rails/&quot;&gt;Agile Web Development with Rails&lt;/a&gt;” (by Dave Thomas, David Heinemeier Hansson, et al) from Pragmatic Programmers and do the whole tutorial.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Buy “ &lt;a href=&quot;http://www.pragmaticprogrammer.com/titles/ruby/&quot;&gt;Programming Ruby&lt;/a&gt;” (by from Pragmatic Programmers and read at least the “Facets of Ruby” section&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Buy “ &lt;a href=&quot;http://pragmaticprogrammer.com/titles/fr_rr/&quot;&gt;Rails Recipes&lt;/a&gt;” (by Chad Fowler) from Pragmatic Programmers (sensing a theme?) as a great way to see known patterns mapped into Rails&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Download and read “ &lt;a href=&quot;http://poignantguide.net/ruby/whys-poignant-guide-to-ruby.pdf&quot;&gt;Why’s (Poignant) Guide to Ruby&lt;/a&gt;” if only because it’s not only informative but beautiful and a delightful departure from the traditional programming language guide.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, &lt;a href=&quot;http://www.sapphiresteel.com/Ruby-and-Rails-Books-the-essential&quot;&gt;Huw Collingbourne has some other book recommendations&lt;/a&gt;. As an aside, I like PragProg books because you can get them as as PDFs (though only if you buy direct from them). It’s nice to be able to haul around my entire reference library without breaking my back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Get Connected&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Join your local &lt;a href=&quot;http://ruby.meetup.com/&quot;&gt;Ruby or Rails meetup&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Attend any Ruby or Rails conferences within easy reach and budget.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Find a mentor, someone you can IM with wonky questions&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Hang out in &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/IRC&quot;&gt;#rubyonrails @ irc.freenode.net&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Join the &lt;a href=&quot;http://groups.google.com/group/ruby-talk-google&quot;&gt;Ruby Talk group on Google Groups&lt;/a&gt; (note: this is just an echo of the ruby-talk mailing list)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Read and Learn, Redux&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Get the code for any open-source Rails project and fix two bugs.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Join the &lt;a href=&quot;http://groups.google.com/group/rubyonrails-core&quot;&gt;rails-core google group&lt;/a&gt; and make a vague attempt to keep up with what they’re talking about.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Start reading good Rails blogs ( &lt;a href=&quot;http://rubyrailways.com/&quot;&gt;Peter Szinek&lt;/a&gt; took a novel approach: &lt;a href=&quot;http://www.rubyrailways.com/the-top-10-rubyrails-blogs/&quot;&gt;let Technorati and Alexa tell you which ones are good&lt;/a&gt;)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s all for now.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Beloit Mindset List for 2011 is out</title>
   <link href="http://blog.geekdaily.org/2007/08/beloit-mindset-.html"/>
   <updated>2007-08-21T10:18:27-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/beloit-mindset-</id>
   <content type="html">&lt;p&gt;Every year for the last 10, Beloit College publishes their Mindset List. It originated as a way to help their faculty better understand the world view of their incoming freshman class. In the last decade, it’s release has become a national event, with nearly every media outlet sharing some form of the list with its audience.&lt;/p&gt;

&lt;p&gt;I could push a lot of spoilers, but I’ll save that for later this week. I’ll just say that as they years march onward, there are fewer and fewer references I don’t immediately get … and more and more which startle me with a reminder of my age.&lt;/p&gt;

&lt;p&gt;(non-spoiler: #4 … really? #9 … really?!)&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.beloit.edu/~pubaff/mindset/2011.php&quot; title=&quot;Beloit College Public Affairs&quot;&gt;Beloit College Mindset List For The Class of 2011&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Finding Rails {Docs,Plugins,Info,Stuff}</title>
   <link href="http://blog.geekdaily.org/2007/08/finding-rails-d.html"/>
   <updated>2007-08-20T21:32:59-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/finding-rails-d</id>
   <content type="html">&lt;p&gt;I’ve now taken to explaining Ruby on Rails as “the fastest way to get from idea to implementation in a form you can iterate on.” Alliterative, I know, but I’ll blame Mom* and we’ll move on.&lt;/p&gt;

&lt;p&gt;One persistent annoyance, though, is understanding where to find certain plugins, how to install them, etc. This is part of the larger issue that &lt;strong&gt;Rails is still an oral tradition&lt;/strong&gt; – that is, if you don’t have someone helping you, you’ll read a lot of source and spend a lot more time puzzling things out than you really wanted to. Or maybe it’s just me. Prolly just me.&lt;/p&gt;

&lt;p&gt;There is much (rightful) admiration for the distributed nature of Rails’ plugin tool. Unfortunately, the distributed nature makes it challenging to find some of the plugins which might be mentioned in a chunk of code you’re admiring. Even more confusing, some plugin which existed in one place just a few months ago can move with little fanfare and less explanation.&lt;/p&gt;

&lt;p&gt;The one that just bit me is browser_filters. It’s in an existing app I inherited and, when I wanted to install it in a new app I’m working on, the plugin script couldn’t find it. After assuming that I was doing something wrong, a little searching showed it had been moved to legacy with the ambiguous comment “Moved acts_as_taggable, browser_filters, and simply_helpful into legacy – all have either been deprecated or rolled into Rails core already [DHH]”.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong. I’m sure that longtime Rails practitioners likely all know which have been deprecated and which promoted into Rails core. I’m also sure that those folks living in Edge Rails (and I hope to be one of them someday) are enjoying the benefits of the non-deprecated plugins right now. I’m growing accustomed to being a half-step behind. I’m catching up.&lt;/p&gt;

&lt;p&gt;One could make a full time job of discovering these details and documenting them. It wouldn’t pay well, though, so until it does we’ll make do with blog posts (like this one), hope that enough of them are out there to help the next generation (like me) along.&lt;/p&gt;

&lt;p&gt;Okay, I’m over it now. ;]&lt;/p&gt;

&lt;p&gt;*Mom == Sally Joan Harmon Meyer, English Composition Teacher and Playful Linguist. Miss you, Mom. World’s (quite) a bit smaller without you.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Changing Feeds</title>
   <link href="http://blog.geekdaily.org/2007/08/changing-feeds.html"/>
   <updated>2007-08-17T21:39:50-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/changing-feeds</id>
   <content type="html">&lt;p&gt;I’m twiddling my feeds, so if you’re subscribed to the old one, you’ll want to change over to:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feeds.geekdaily.org/geekdailyblog&quot;&gt;http://feeds.geekdaily.org/geekdailyblog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’ll go active sometime this weekend (18-19 August).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ThereWolf!</title>
   <link href="http://blog.geekdaily.org/2007/08/therewolf.html"/>
   <updated>2007-08-11T21:43:56-07:00</updated>
   <id>http://blog.geekdaily.org/2007/08/therewolf</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/purp/1088483927/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1132/1088483927_4cfa82bd61.jpg&quot; alt=&quot;HPIM2307.JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We played Werewolf! at the &lt;a href=&quot;http://www.velvetcloakinn.com/&quot;&gt;Velvet Cloak Inn&lt;/a&gt; where Beth and I had stayed the night before. They gave us &lt;a href=&quot;http://www.charterroom.com/&quot;&gt;The Charter Room&lt;/a&gt; for the evening as it’s currently closed for renovations. They were awesome to us, incredibly hospitable; one of the owners, David Smoot, personally worked on the air conditioning issues in the room (it was a toasty 86 when we arrived) and was about to rip the protective cover off the wall when the guy with the key called and got it sorted.&lt;/p&gt;

&lt;p&gt;Werewolf &lt;a href=&quot;http://www.eblong.com/zarf/werewolf.html&quot;&gt;Rules&lt;/a&gt; and more &lt;a href=&quot;http://www.flickr.com/photos/purp/sets/72157601385782743/&quot;&gt;Pictures of the Villagers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;BTW, staying at the Velvet Cloak was incredibly great. Super hospitable, great rooms poolside, strong-fast wifi … and the Charter Room opens again in three weeks! Sorry I’ll miss it this time around, but I promised Mr. Smoot that we’d drop in next time we’re in town. And we will.&lt;/p&gt;

&lt;p&gt;Names as best I remember them (send me more and I’ll fix this; I’m teh suck with last names it seems): Carl Youngblood, Chris Redinger, Joe Martinez, Tony Devlin, Coby Randquist, Rick DiNatale, Ted Behling, Evan Light, Marcel Molina Jr., me, Chad Fowler, Lyle Johnson, Devin Mullins. Not pictured: Ryan Daigle.&lt;/p&gt;

&lt;p&gt;Update: So now I’m home, have slept (a little), and am rapidly correcting names as I learn them have added everyone’s names, and see that I left out the part about how astonishingly fun the games were. They were. I’m really looking forward to Rails Edge now. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Decadence is ...</title>
   <link href="http://blog.geekdaily.org/2007/07/decadence-is.html"/>
   <updated>2007-07-31T11:37:23-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/decadence-is</id>
   <content type="html">&lt;p&gt;… Ditch Plains restaurant at 2:30p on a sunny Tuesday, having walked from 2nd &amp;amp; Houston. Half-bottle of El Coto Crianza. Enormous fruit salad. Gunfighter bench seat in the back corner complete with power, wifi, and a view of the folks wandering by. James at the helm of the place, takin’ fabulous care of yours truly.&lt;/p&gt;

&lt;p&gt;Truly decadent.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.ditch-plains.com/&quot; title=&quot;ditch plains&quot;&gt;ditch plains&lt;/a&gt; [via &lt;a href=&quot;http://www.eleganthack.com/archives/publicsquare_ny_offices.php#004767&quot;&gt;eleganthack&lt;/a&gt;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Programmers == Stinky Bums</title>
   <link href="http://blog.geekdaily.org/2007/07/programmers-sti.html"/>
   <updated>2007-07-30T22:32:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/programmers-sti</id>
   <content type="html">&lt;p&gt;From the latest “Python URL!”:&lt;/p&gt;

&lt;p&gt;“Why would you want to become a programmer?  Programmers smell bad, they have&lt;br /&gt;
no social life, they get treated like crap by everyone.  They can get paid&lt;br /&gt;
pretty well but then they spend all the money on useless electronic junk so&lt;br /&gt;
they still live like bums.  There is only one reason to be a programmer,&lt;br /&gt;
which is that the drive to program burns in you like a fire.  But in that&lt;br /&gt;
case don’t ask how to become a programmer, because you are already one, so&lt;br /&gt;
welcome to the ranks ;-).” - Paul Rubin&lt;/p&gt;

&lt;p&gt;Twue. So twue.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Profiling and Optimizing Rails</title>
   <link href="http://blog.geekdaily.org/2007/07/profiling-and-o.html"/>
   <updated>2007-07-28T16:12:43-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/profiling-and-o</id>
   <content type="html">&lt;p&gt;Picture me doing a happy dance. A very happy dance. I’ve only been playing with Rails since April and I’ve been looking for this since the beginning.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.rubyinside.com/how-to-profile-your-rails-application-and-make-rails-go-vroom-565.html&quot; title=&quot;How to Profile Your Rails Application and Make Rails Go Vroom!&quot;&gt;How to Profile Your Rails Application and Make Rails Go Vroom!&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>CoRaid ATA-over-Ethernet</title>
   <link href="http://blog.geekdaily.org/2007/07/coraid-ata-over.html"/>
   <updated>2007-07-27T10:49:50-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/coraid-ata-over</id>
   <content type="html">&lt;p&gt;Nice tight mini-SANs. This plus GFS is pretty sweet.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.coraid.com/products.html&quot; title=&quot;Coraid :: The Linux Storage People&quot;&gt;Coraid :: The Linux Storage People&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Sparky: The Alexa Toolbar for Firefox</title>
   <link href="http://blog.geekdaily.org/2007/07/sparky-the-alex.html"/>
   <updated>2007-07-19T14:58:10-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/sparky-the-alex</id>
   <content type="html">&lt;p&gt;Invaluable tool for quick info about any website you visit.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.alexa.com/site/download&quot; title=&quot;Alexa - Alexa Toolbar&quot;&gt;Alexa - Alexa Toolbar&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LOLCODE ... OMG!!1</title>
   <link href="http://blog.geekdaily.org/2007/07/lolcode-omg1.html"/>
   <updated>2007-07-18T16:07:46-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/lolcode-omg1</id>
   <content type="html">&lt;p&gt;I can’t stop laughing. Particularly at &lt;a href=&quot;http://lolcode.com/contributions/map-reduce&quot;&gt;this example&lt;/a&gt;. And &lt;a href=&quot;http://lol.ianloic.com/feed/feeds.lolcode.com/lolcode&quot;&gt;this feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;KTHXBYE.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://lolcode.com/home&quot; title=&quot;home · LOLCODE&quot;&gt;LOLCODE&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Three Observations on Reverse Engineering</title>
   <link href="http://blog.geekdaily.org/2007/07/three-observati.html"/>
   <updated>2007-07-17T14:17:49-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/three-observati</id>
   <content type="html">&lt;p&gt;I’m working on the tech slides for our presentation deck today. The purpose is to demonstrate that not only do we have &lt;a href=&quot;http://publicsquarehq.com/&quot;&gt;something&lt;/a&gt; (and we do =), but that it’s easier to buy us than to rebuild us. This got me thinking about what influences how easy or hard it is to reverse engineer a thing. Here’s what struck me as true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It’s straightforward to reverse engineer an existing product feature.&lt;/strong&gt; The cost of doing so varies in direct proportion to the opacity and complexity of the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It’s more difficult to reverse engineer existing workflow as embodied in code (e.g. a pipeline)&lt;/strong&gt; as it requires knowledge of the pipeline’s foundations as well as an understanding of the nuances of its implementation. Lacking the nuances, you’ll repeat the mistakes of others; lacking the foundations, you’ll go horribly astray. The cost of doing so varies in direct proportion to your knowledge of the process, its basis and nuances, and your experience in working with it and its variations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Most difficult is to reverse engineer strategy,&lt;/strong&gt; which can be considered as the implicit fundamental knowledge and intent in which a product’s features and workflow are grounded. The cost of doing this varies in direct proportion to your insight into the mind(s) formulating and executing that strategy.&lt;/p&gt;

&lt;p&gt;You are not your product. You are not your workflow. You are your ideas.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>&quot;Beta&quot; is the Web 2.0 &quot;In Construction Guy&quot;</title>
   <link href="http://blog.geekdaily.org/2007/07/beta-is-the-web.html"/>
   <updated>2007-07-14T13:49:43-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/beta-is-the-web</id>
   <content type="html">&lt;p&gt;I’m sitting in this year’s &lt;a href=&quot;http://www.communitynext.com/&quot;&gt;Community Next Viral Marketing Conference&lt;/a&gt; where &lt;a href=&quot;http://www.socializr.com/user/jonathan&quot;&gt;Jonathan Abrams&lt;/a&gt; (of &lt;a href=&quot;http://www.socializr.com/&quot;&gt;Socializr&lt;/a&gt;) just noted that his web app “is gamma … which is just like beta, but sillier.” He’s right; the beta badge has become the “in construction” of Web 2.0.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Next Big Thing</title>
   <link href="http://blog.geekdaily.org/2007/07/the-next-big-th.html"/>
   <updated>2007-07-09T17:47:13-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/the-next-big-th</id>
   <content type="html">&lt;p&gt;If you’ve ever talked with &lt;a href=&quot;http://redcouch.typepad.com/weblog/&quot;&gt;Shel Israel&lt;/a&gt; (co-author of &lt;a href=&quot;http://www.amazon.com/Naked-Conversations-Changing-Businesses-Customers/dp/047174719X&quot;&gt;Naked Conversations&lt;/a&gt;), you’ve likely watched him strew the conversation with priceless observations pithily dressed so they’ll cling to your grey matter like Paris Hilton somehow clings to her celebrity. I don’t know that he’s read &lt;a href=&quot;http://www.madetostick.com/&quot;&gt;“Made To Stick&lt;/a&gt;,” but he’s certainly tuned in to its message.&lt;/p&gt;

&lt;p&gt;The one he dropped on the table today which made my brain explode, quoted as closely as I can manage:&lt;/p&gt;

&lt;p&gt;“Computers lack common sense. […] Integrating common sense with computing power [is the next big thing].”&lt;/p&gt;

&lt;p&gt;This immediately rings true. The rise of social media, of crowdsourcing, of online communities are all based on finding ways to integrate common sense into the system. It’s the thing people continually bring to the party that no amount of engineering will ever conquer (with apologies to &lt;a href=&quot;http://www.onintelligence.org/&quot;&gt;Jeff Hawkins&lt;/a&gt;, many of whose aims I share).&lt;/p&gt;

&lt;p&gt;All the better that &lt;a href=&quot;http://publicsquarehq.com/&quot;&gt;PublicSquare&lt;/a&gt; fully embraces this; it’s how I know we’re on the right track.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Models &lt; Drops</title>
   <link href="http://blog.geekdaily.org/2007/07/merge-your-liqu.html"/>
   <updated>2007-07-06T14:51:51-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/merge-your-liqu</id>
   <content type="html">&lt;p&gt;A member of the &lt;a href=&quot;http://groups.google.com/group/liquid-templates?hl=en&quot;&gt;Liquid Templates group&lt;/a&gt; contributes an 18-line extension to &lt;a href=&quot;http://www.liquidmarkup.org/&quot;&gt;Liquid&lt;/a&gt; that lets you specify which attributes, methods, and associations to expose to liquid templates, like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SomeClass     # could be an AR model   liquid_methods :attrA, :methB, :associationC, ...  ...end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just for ducks, here’s the entirety of his extension code, sans comments:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Module  def liquid_methods(*allowed_methods)    drop_class = eval &quot;class #{self.to_s}::LiquidDropClass &amp;lt; Liquid::Drop; self; end&quot;    define_method :to_liquid do      drop_class.new(self)    end    drop_class.class_eval do      allowed_methods.each do |sym|        define_method sym do          @object.send sym        end      end      def initialize(object)        @object = object      end    end  endend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Veddy nize.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Link: [extension for drops - Liquid Templates&lt;/td&gt;
      &lt;td&gt;Google Groups](http://groups.google.com/group/liquid-templates/browse_thread/thread/bf48cfebee9fafd9?hl=en “extension for drops - Liquid Templates&lt;/td&gt;
      &lt;td&gt;Google Groups”).&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>Confessions of a RambleGeek</title>
   <link href="http://blog.geekdaily.org/2007/07/confessions-of-.html"/>
   <updated>2007-07-06T01:16:52-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/confessions-of-</id>
   <content type="html">&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Random thoughts after a month of being a caffeinated technomad:&lt;/p&gt;

&lt;p&gt;An iPod at appropriate volume and a ballcap at the right down-angle work as a limited sensory deprivation chamber. That is, until the baby shows up.&lt;/p&gt;

&lt;p&gt;The Alameda Public Library is heaven to a mobile office person. The study rooms are particularly lovely.&lt;/p&gt;

&lt;p&gt;I used to like StumbleUpon a lot. I still do. But I’m way deeper into del.icio.us than I ever was before.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.flickr.com/photos/purp/731737329/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1325/731737329_319b3a4526_m.jpg&quot; alt=&quot;RambleGeek Jim&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;An EVDO rev A card, while it sucks battery, lets you choose the less crowded cafe with no wifi but good coffee/art/treats.&lt;/p&gt;

&lt;p&gt;Restaurants that close between lunch and dinner yet still let you camp out in their shaded outdoor seating are things of rare beauty. Treasure them by not abusing their kindness.&lt;/p&gt;

&lt;p&gt;A decent computer microphone/headset combo and Skype put together are pretty dang awesome. Even better if you pony up for SkypePro, SkypeIn, and SkypeUltimate – $78/year for all the incoming, outgoing, and portability you need.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Not Living In A Cave ...</title>
   <link href="http://blog.geekdaily.org/2007/07/not-living-in-a.html"/>
   <updated>2007-07-05T12:47:33-07:00</updated>
   <id>http://blog.geekdaily.org/2007/07/not-living-in-a</id>
   <content type="html">&lt;p&gt;… just refuse to post about the tech of the moment.&lt;/p&gt;

&lt;p&gt;You know the one.&lt;/p&gt;

&lt;p&gt;From Apple.&lt;/p&gt;

&lt;p&gt;Yeah, that.&lt;/p&gt;

&lt;p&gt;Not gonna give it more press. It’s got enough.&lt;/p&gt;

&lt;p&gt;But I desperately want one. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Boobs, Injuries, &amp; Dr. Pepper</title>
   <link href="http://blog.geekdaily.org/2007/06/boobs-injuries-.html"/>
   <updated>2007-06-27T11:37:24-07:00</updated>
   <id>http://blog.geekdaily.org/2007/06/boobs-injuries-</id>
   <content type="html">&lt;p&gt;Okay, this is a geek blog. And a lame one as I so rarely link to someone else’s blog. Come to think of it, this is pretty much masturbation to techporn in prose for all that I care about readership. I’m no linkwhore.&lt;/p&gt;

&lt;p&gt;So you know it’s serious if I say, YOU MUST READ &lt;a href=&quot;http://boobsinjuriesanddrpepper.blogspot.com/&quot;&gt;THIS BLOG&lt;/a&gt;. Particularly, &lt;a href=&quot;http://boobsinjuriesanddrpepper.blogspot.com/2007/06/outdone.html&quot;&gt;THIS ENTRY&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You’ll blow milk out your nose. And she ain’t gonna clean it up for you.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://boobsinjuriesanddrpepper.blogspot.com/&quot; title=&quot;Boobs, Injuries, &amp;amp; Dr. Pepper&quot;&gt;Boobs, Injuries, &amp;amp; Dr. Pepper&lt;/a&gt; &lt;a href=&quot;http://boobsinjuriesanddrpepper.blogspot.com/&quot;&gt;.&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Circle of (typographic) Life</title>
   <link href="http://blog.geekdaily.org/2007/06/the-circle-of-t.html"/>
   <updated>2007-06-27T10:07:25-07:00</updated>
   <id>http://blog.geekdaily.org/2007/06/the-circle-of-t</id>
   <content type="html">&lt;p&gt;I find it amusing that, in the early-to-mid-eighties we put a lot of typesetters out of work as desktop publishing eliminated the need to memorize cryptic typographic encodings.&lt;/p&gt;

&lt;p&gt;http://hobix.com/textile/&lt;/p&gt;

&lt;p&gt;We’ve come full circle.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>SW Dev: Back to the Mac</title>
   <link href="http://blog.geekdaily.org/2007/06/sw_dev_back_to_.html"/>
   <updated>2007-06-15T23:32:18-07:00</updated>
   <id>http://blog.geekdaily.org/2007/06/sw_dev_back_to_</id>
   <content type="html">&lt;p&gt;For the last decade, my software development has been a UNIXy thing, filled with xemacs, gcc, xxdiff, and gdb. In &lt;a href=&quot;http://www.linkedin.com/in/jimmeyer&quot;&gt;my new role&lt;/a&gt;, I’m becoming MacOS-centric again and discovering amazing new tools with all the wonderful Macish &lt;em&gt;je ne sais quoi&lt;/em&gt; as well as all the bits I miss from my former environment.&lt;/p&gt;

&lt;p&gt;For me, the job of software development is all about four things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Design&lt;/li&gt;
  &lt;li&gt;Code&lt;/li&gt;
  &lt;li&gt;Test &amp;amp; Debug&lt;/li&gt;
  &lt;li&gt;Release&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or, to break them down from a tools perspective:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Scribble (&amp;amp; Erase &amp;amp; Scribble Again): &lt;strong&gt;whiteboards and notepads&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Type (poorly ;p): &lt;strong&gt;text editor&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Execute, Tweak, Repeat: &lt;strong&gt;debugger, diff/merge tool&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Copy (with a flourish): &lt;strong&gt;deployment tools&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whiteboards and notepads are universal and ubiquitous (though as a member of the cafe mobile workforce, I’m still in search of a good whiteboard analog). Debugger choice is mostly guided by the language you’re using. Deployment tools are largely a function of the platform upon which your tools run. That leaves text editor and diff/merge tool as the highly personal choices which shape your development experience.&lt;/p&gt;

&lt;p&gt;Text editor is obvious; every experienced coder knows with certainty exactly which is the best text editor that should be used by everyone has a (usually strong) preference. For me, it was XEmacs with a carefully crafted set of customizations painstakingly preserved from one job to the next — familiarity bred, in this case, great speed. Luckily, the Rails crowd made it clear from the start that the only choice was TextMate; this was validated by a few weeks familiarization. Awesome tool. Almost as good as XEmacs. =]&lt;/p&gt;

&lt;p&gt;Diff/merge tools were less obvious. It was only this week I found myself in need of one and was delighted to see my old friend &lt;a href=&quot;http://furius.ca/xxdiff/&quot;&gt;xxdiff&lt;/a&gt; available as a MacOS app; that is, until I discovered that &lt;a href=&quot;http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1738239&amp;amp;group_id=2198&amp;amp;atid=102198&quot;&gt;it consumes CPU cycles while idle&lt;/a&gt; and has a focus battle with &lt;a href=&quot;http://virtuedesktop.info/&quot;&gt;Virtue Desktop&lt;/a&gt; (that’s likely Virtue’s fault; I wish it weren’t moribund, but &lt;a href=&quot;http://forums.cocoaforge.com/viewtopic.php?t=12392&quot;&gt;Leopard’s Spaces killed it without even being delivered&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;A bit of poking around, though, and I discovered &lt;a href=&quot;http://sourcegear.com/diffmerge/&quot;&gt;DiffMerge&lt;/a&gt;. It lacks a bunch of the command line flags I’m used to, but it makes up for it (mostly) with excellent polish and good customization twiddles. I’m falling in like with it.&lt;/p&gt;

&lt;p&gt;But I’ll throw it over for xxdiff in a heartbeat once the CPU issue is fixed and Leopard’s out. =]&lt;/p&gt;

&lt;p&gt;Link: &lt;u&gt;&lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate — The Missing Editor for Mac OS X&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://software.ericsink.com/entries/DiffMerge.html&quot; title=&quot;Free Diff Tool: SourceGear DiffMerge&quot;&gt;Free Diff Tool: SourceGear DiffMerge&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>More Tech, Less Smarts</title>
   <link href="http://blog.geekdaily.org/2007/06/more_tech_less_.html"/>
   <updated>2007-06-14T23:33:02-07:00</updated>
   <id>http://blog.geekdaily.org/2007/06/more_tech_less_</id>
   <content type="html">&lt;p&gt;A little over a year ago, we bought a new family car (minivan, really, but we’re still in denial =) which includes a navigation system. It’s pretty spiffy, but it’s led me to discover two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Technology is Dumb&lt;/strong&gt;&lt;br /&gt;
I use the nav system when I’m heading somewhere I don’t already know how to find. Since I’m usually starting from home and since I know the surrounding area pretty well, there’s a good chunk of the route I already know. With only five ways off this island, the nav system gets it about half right by knowing that two of them are fairly unavoidable and trying to fit all routes through those two. Of course, I ignore it when I know better; I wish it would notice my strong preference as expressed by my choice of routes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Technology Makes You Dumb&lt;/strong&gt;&lt;br /&gt;
Used to be that I’d spend a fair bit of time figuring out how to get from A to B when I hadn’t been to B before; at the very least, I’d scribble down the address and phone number, then pull out the Thomas Guide and work it out. That involved noticing which intersections I’d have to pass, which ones would mean I’d gone too far, and all of that. I’d learn just a bit more about the area. Not so any longer.&lt;/p&gt;

&lt;p&gt;The phone numbers in your speed dial; your pocket calculator … those dumb devices are making you dumber.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A Change of Pace</title>
   <link href="http://blog.geekdaily.org/2007/06/a_change_of_pac.html"/>
   <updated>2007-06-04T21:11:21-07:00</updated>
   <id>http://blog.geekdaily.org/2007/06/a_change_of_pac</id>
   <content type="html">&lt;p&gt;One or both of you who read this blog may already know this, but today was my first full-time day with Cucina Media, we the makers of Public Square.&lt;/p&gt;

&lt;p&gt;Today I:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fed my kids breakfast&lt;/li&gt;
  &lt;li&gt;Saw them off to school (Beth took them)&lt;/li&gt;
  &lt;li&gt;Talked with my partners about what the week holds in store&lt;/li&gt;
  &lt;li&gt;Talked with our development partners about what we need to do in the next few weeks&lt;/li&gt;
  &lt;li&gt;Met with a couple of prospective customers&lt;/li&gt;
  &lt;li&gt;Talked at length with &lt;a href=&quot;http://www.eleganthack.com/&quot;&gt;Christina&lt;/a&gt; about the focus of our next week, month, and quarter&lt;/li&gt;
  &lt;li&gt;Chatted with &lt;a href=&quot;http://www.milkbar.com/&quot;&gt;Rob,&lt;/a&gt; a long-time friend and colleague who’s just returned to the US after &lt;a href=&quot;http://www.robandhollygolightly.com/&quot;&gt;~9 months in Asia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Picked up Sam after pre-school&lt;/li&gt;
  &lt;li&gt;Went grocery shopping with Sam in tow&lt;/li&gt;
  &lt;li&gt;Cooked dinner for the family&lt;/li&gt;
  &lt;li&gt;Played &lt;a href=&quot;http://www.become.com/shop?pid=207339209&amp;amp;q=sababa+uno+elmo+edition&amp;amp;utm_campaign=become&amp;amp;utm_source=yahoo&amp;amp;utm_medium=ssp&amp;amp;utm_term=sababa+uno+elmo+edition&quot;&gt;Elmo Uno&lt;/a&gt; with Beth and Sam&lt;/li&gt;
  &lt;li&gt;Posted to my blog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was an intense business day, with five meetings squeezed into six hours. We discussed everything from what needs to be done in the next week to the different opportunities out there for us and what it would mean – to our company and to our values – to take this or that one. Values. Objectives. What we want to do and why. Good stuff like that.&lt;/p&gt;

&lt;p&gt;It was a very happy day. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Radio Open Source: David Weinberger</title>
   <link href="http://blog.geekdaily.org/2007/05/radio_open_sour.html"/>
   <updated>2007-05-29T21:45:46-07:00</updated>
   <id>http://blog.geekdaily.org/2007/05/radio_open_sour</id>
   <content type="html">&lt;p&gt;Sent to me by &lt;a href=&quot;http://www.eleganthack.com/blog/&quot;&gt;Christina,&lt;/a&gt; and leapt upon because (a) I really enjoyed &lt;a href=&quot;http://www.audible.com/adbl/site/products/ProductDetail.jsp?productID=FR_ADBL_041115&amp;amp;BV_UseBVCookie=Yes&quot;&gt;his Library of Congress lecture&lt;/a&gt;, and (b) I’m feeling guilty for low blog entry count. From the summary of the April 26, 2007 edition of “ &lt;a href=&quot;http://www.radioopensource.org/&quot;&gt;Open Source with Christopher Lydon&lt;/a&gt;”:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s hard to summarize his theory of everything in one sentence, but this is pretty close: “To get as good at browsing as we are at finding — and to take full advantage of the digital opportunity — we have to get rid of the idea that there’s a best way of organizing the world.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m excited to see the buzz around David’s latest book, “ &lt;a href=&quot;http://www.amazon.com/Everything-Miscellaneous-Power-Digital-Disorder/dp/0805080430/ref=pd_bbs_sr_1/102-9593370-1098547?ie=UTF8&amp;amp;s=books&amp;amp;qid=1180500252&amp;amp;sr=8-1&quot;&gt;Everything is Miscellaneous&lt;/a&gt;,” as I think he’s very right. I’m also coming to the conclusion that taxonomies are merely folksonomies with a contextual hierarchy and which context might be shared. But I still have a lot to learn.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.radioopensource.org/weinbergers-miscellany/&quot; title=&quot;Open Source » Blog Archive » Weinberger’s Miscellany&quot;&gt;Open Source » Blog Archive » Weinberger’s Miscellany&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The Tagline Graveyard</title>
   <link href="http://blog.geekdaily.org/the_tagline_graveyard.html"/>
   <updated>2007-05-19T12:48:48-07:00</updated>
   <id>http://blog.geekdaily.org/the_tagline_graveyard</id>
   <content type="html">&lt;p&gt;Sometimes, when I change my tagline, I like to keep the previous one. Simple as that.&lt;/p&gt;

&lt;p&gt;?? - 2007.05.19: _ &lt;strong&gt;Be careful with that axe, Eugene!&lt;/strong&gt; _&lt;br /&gt;
2007.05.19 - 2007.05.28: _ &lt;strong&gt;If lazy == efficient then this is the most efficient blog on the internet.&lt;/strong&gt; _&lt;br /&gt;
2007.05.28 - 2007.08.16: _ &lt;strong&gt;teh future is n0w&lt;/strong&gt; _&lt;br /&gt;
2007.08.16 - 2007.09.11: _ &lt;strong&gt;now with 100% post-consumer recycled bit content!&lt;/strong&gt; _&lt;br /&gt;
2007.09.11 -: _ &lt;strong&gt;… it is by will alone i set my mind in motion …&lt;/strong&gt; _&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Sir Tony Hoare The Elegant</title>
   <link href="http://blog.geekdaily.org/2007/05/sir_tony_hoare_.html"/>
   <updated>2007-05-17T21:35:25-07:00</updated>
   <id>http://blog.geekdaily.org/2007/05/sir_tony_hoare_</id>
   <content type="html">&lt;p&gt;I’m in Portland for &lt;a href=&quot;http://conferences.oreillynet.com/rails/&quot;&gt;RailsConf&lt;/a&gt; where I met Matt Smith with &lt;a href=&quot;http://www.semantra.com/&quot;&gt;Semantra.&lt;/a&gt; Some of the things we talked about put me in mind of some papers &lt;a href=&quot;http://research.microsoft.com/~thoare/&quot;&gt;Prof. C.A.R. “Tony” Hoare&lt;/a&gt; did a while back and, while attempting to find them online, I ran across his 1980 Turing Award acceptance speech, “The Emperor’s Old Clothes” [&lt;a href=&quot;http://www.cs.ucsb.edu/~ravenben/papers/coreos/Hoa81.pdf&quot;&gt;pdf&lt;/a&gt;] in which he says,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“I have regarded it as the highest goal of programming language design to enable good ideas to be elegantly expressed.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That ties in nicely with the belief I heard expressed years ago that complexity and beauty are intertwined such that over-complex things are generally not perceived as beautiful.&lt;/p&gt;

&lt;p&gt;Incidentally, the search wandered me in and through Wikipedia’s &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_important_publications_in_computer_science&quot;&gt;List of Important Publications in Computer Science&lt;/a&gt;. A feast for the thinking geek.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Moleskine USB Drive</title>
   <link href="http://blog.geekdaily.org/2007/04/moleskine_usb_d.html"/>
   <updated>2007-04-26T10:39:02-07:00</updated>
   <id>http://blog.geekdaily.org/2007/04/moleskine_usb_d</id>
   <content type="html">&lt;p&gt;If you’re a Moleskine fan, here’s a fun twist: a guy built a USB drive into one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;note@20070426.1040: The link’s getting Boing’d pretty hard right now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.zonageek.com/blog/archivos/2007/04/23-121420.php&quot;&gt;80GB Moleskine hard drive&lt;/a&gt; &lt;a href=&quot;http://www.boingboing.net/2007/04/25/80gb_moleskine_hard_.html&quot; title=&quot;Boing Boing: 80GB Moleskine hard drive&quot;&gt;[via Boing Boing]&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Running the Numbers</title>
   <link href="http://blog.geekdaily.org/2007/04/running_the_num.html"/>
   <updated>2007-04-20T13:01:11-07:00</updated>
   <id>http://blog.geekdaily.org/2007/04/running_the_num</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.chrisjordan.com/&quot;&gt;Chris Jordan&lt;/a&gt; is a photographer with an eye for visualizing real-world datasets. I suspect that he’s a fan of &lt;a href=&quot;http://www.edwardtufte.com/&quot;&gt;Edward Tufte&lt;/a&gt; (and likely vice versa).&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.chrisjordan.com/current_set2.php?id&quot; title=&quot;current work&quot;&gt;Running the Numbers&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>We Are What We Know</title>
   <link href="http://blog.geekdaily.org/2007/04/we_are_what_we_.html"/>
   <updated>2007-04-20T10:02:41-07:00</updated>
   <id>http://blog.geekdaily.org/2007/04/we_are_what_we_</id>
   <content type="html">&lt;p&gt;In 1900, Ladies’ Home Journal compiled 29 predictions of life in the year 2000. It’s fascinating to note where they hit (prevalent autos, gyms in all schools, etc.) and where they missed (“Storekeepers who expose food to air breathed out by patrons or to the atmosphere of the busy streets will be arrested with those who sell stale or adulterated produce.”) More fun for me, though, are the underlying theme of electricity and the absolute absence of computing.&lt;/p&gt;

&lt;p&gt;I hope they did it again in 2000.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.yorktownhistory.org/homepages/1900_predictions.htm&quot; title=&quot;1900 Predictions&quot;&gt;1900 Predictions&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Exquisite Book Desecration</title>
   <link href="http://blog.geekdaily.org/2007/04/exquisite_book_.html"/>
   <updated>2007-04-19T12:07:42-07:00</updated>
   <id>http://blog.geekdaily.org/2007/04/exquisite_book_</id>
   <content type="html">&lt;p&gt;These are absolutely captivating.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.funforever.net/archives/dont-try-this-at-home&quot; title=&quot;Fun Forever » Don’t try this at home!&quot;&gt;Fun Forever » Don’t try this at home!&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Olde Skool Web Syte</title>
   <link href="http://blog.geekdaily.org/2007/04/olde_skool_web_.html"/>
   <updated>2007-04-12T18:30:49-07:00</updated>
   <id>http://blog.geekdaily.org/2007/04/olde_skool_web_</id>
   <content type="html">&lt;p&gt;I can’t stop looking at this site.&lt;/p&gt;

&lt;p&gt;Genius.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://noonebelongsheremorethanyou.com/&quot; title=&quot;No one belongs here more than you. Stories by Miranda July&quot;&gt;No one belongs here more than you. Stories by Miranda July&lt;/a&gt;. [&lt;a href=&quot;http://www.eleganthack.com/archives/ia_shmia.php#004764&quot;&gt;via&lt;/a&gt;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>How To Get My Attention</title>
   <link href="http://blog.geekdaily.org/2007/02/how_to_get_my_a.html"/>
   <updated>2007-02-08T00:48:08-08:00</updated>
   <id>http://blog.geekdaily.org/2007/02/how_to_get_my_a</id>
   <content type="html">&lt;p&gt;Wrote this for work to explain and make easier the process of grabbing my focus when needed. Thought it’d be fun to preserve it here, too. All the contact info has been X’d out; you’ve got it if you need it. ;]&lt;/p&gt;

&lt;h2 id=&quot;how-to-get-my-attention&quot;&gt;How To Get My Attention&lt;/h2&gt;

&lt;p&gt;I’ve been asked several times in the last week for the best ways to find me and/or get my attention. Seemed worthy of a wiki page (and a blog entry).&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;For very urgent issues, call my cell phone at XXX/XXX-XXXX.&lt;/li&gt;
  &lt;li&gt;To give me quick short info, by SMS at xxxxxxx@xxxxxxx.xxx. I can also send short responses.&lt;/li&gt;
  &lt;li&gt;If you want my soonest attention to an email, send it to me&lt;br /&gt;
directly (not through an alias) and put the word “URGENT” in the title.&lt;br /&gt;
&lt;em&gt;Know that I don’t often get to read email until very late in the day.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;If you want my immediate attention to an email, call or text&lt;br /&gt;
me after you send it. I’ll do what I can if I’m in a place where I can&lt;br /&gt;
read your email.&lt;/li&gt;
  &lt;li&gt;If you want me to act on an email, tell me what action you want me to take.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;why-are-you-so-hard-to-find&quot;&gt;Why Are You So Hard To Find?&lt;/h3&gt;

&lt;p&gt;Generally, I’m either walking around talking to folks or in a meeting. This means I’m not usually at my desk to answer my phone or read my email, which in turn means it can be hard to find me. The busier the day, the harder it is to find me.&lt;/p&gt;

&lt;h3 id=&quot;but-i-all-paged-you&quot;&gt;But I All-Paged You!&lt;/h3&gt;

&lt;p&gt;I mostly don’t answer all-pages. Usually it’s because I’m in the middle of a meeting or conversation that is moving something along and don’t want to stop to find out whether or not the reason for the all-page is urgency or convenience.&lt;/p&gt;

&lt;p&gt;The problem with all-paging is that it’s so cheap and painless for the person paging that we casually all-page because it would be more convenient to talk to them right now than to send them email or leave them voicemail&lt;sup&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/sup&gt; without regard to whether the matter at hand is really &lt;a href=&quot;http://walkerfenton.blogspot.com/2007/02/dont-let-urgent-get-in-way-of-important.html&quot; title=&quot;http://walkerfenton.blogspot.com/2007/02/dont-let-urgent-get-in-way-of-important.html&quot;&gt;urgent&lt;/a&gt;, not to mention whether or not we’ll inconvenience the person being paged. And, since every time there’s a page you’ve got to listen to see if it’s for you, we’re interrupting every person in the studio multiple times per hour in order for two people to connect. If it takes each person just 10 seconds to listen, process, ignore the page, and get their head back into their work, can you imagine how much time we waste every day&lt;sup&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/sup&gt; … and how much we fragment people’s ability to concentrate?&lt;sup&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;I’ve been in a conversation at my desk when my phone rang twice and, as I reached for it, stopped ringing … and then I was immediately all-paged. When I called back, it was to see if I had lunch plans. Well intentioned, but not urgent in any way, and not worth interrupting the business conversation I was having. I used to get all-paged for similarly non-urgent-but-convenient-to-the-paging-party things three or four times daily.&lt;/p&gt;

&lt;p&gt;So now I mostly don’t answer all-pages. I’ll answer if I’m not in a meeting or working against a deadline, but those two cover most of my time.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; Don’t even get me started on the fact that
our voicemail doesn’t pick up after 4 rings. If I can ever get mildly
caught up, that’s gonna change.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; Here’s my guess: we’re 186 people, so that’s
roughly 30 minutes per all page (180 * 10 secs = 1800 secs = 30 min).
I’d conservatively estimate we average 5 pages per hour during the 8.5
working hours we have. That’s &lt;strong&gt;roughly 21.25 person hours we sacrifice daily to the all-paging system&lt;/strong&gt;. Ugh.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;3&lt;/sup&gt; I could quote endless literature and scientific studies but it turns out it’s easier just to &lt;a href=&quot;http://www.google.com/search?q=%2Bfocus+%2Bproductivity+%2Bflow&quot; class=&quot;external text&quot; title=&quot;http://www.google.com/search?q=+focus +productivity +flow&quot; rel=&quot;nofollow&quot;&gt;google it&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h3 id=&quot;but-how-can-i-get-you-if-i-need-you-immediately&quot;&gt;But how can I get you if I need you immediately?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;My cell phone is XXX-XXX-XXXX.&lt;/strong&gt; Use it for “I need an answer right now” kinds of things. If I think I’m not interruptable, I won’t answer. If you think I need to interrupt whatever I’m doing, call back immediately and I’ll answer. Bonus points for calling me from your cell phone so I have an opportunity to know it’s you (yes, I’ll add your name to my phone after the first time =).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can push text (~120 chars) to my phone at xxxxxxx@xxxxxxx.xxx&lt;/strong&gt;. Use that to give me important FYIs and to get very short responses. I have unlimited text messaging; please use this as often as you need.&lt;/p&gt;

&lt;h3 id=&quot;do-you-ever-read-email&quot;&gt;Do you ever read email?&lt;/h3&gt;

&lt;p&gt;As of this writing (7 Feb 2007), I get roughly 1100 emails per day, of which roughly two-thirds are machine-generated and only about a quarter (~300) are safe for me to ignore. The rest I must process&lt;sup&gt;4&lt;/sup&gt; if I’m to stay current. Most days I manage to do okay; others I fall behind.&lt;/p&gt;

&lt;p&gt;I process email up to five times daily:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Between 6-7a&lt;/strong&gt; (&lt;em&gt;sometimes&lt;/em&gt;) for about 30-40 minutes to deal with all the automated messages from the night and know what I’m in for when I arrive. This is mostly read-only time; replying takes too long.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Between 9-9:30a&lt;/strong&gt; (&lt;em&gt;almost always&lt;/em&gt;) for 15-20 minutes to reply to anything I put off the first time as well as to send out queries and action items to others.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Between 12:30-2p&lt;/strong&gt; (&lt;em&gt;always&lt;/em&gt;) for about 5 minutes to skim the morning’s mail for anything that seems urgent.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Between 6-7p&lt;/strong&gt; (&lt;em&gt;usually&lt;/em&gt;) for about 30-40 minutes to handle anything that needs an answer by the end of the day.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Between 10p-midnight&lt;/strong&gt; (&lt;em&gt;always&lt;/em&gt;) to read anything else that needs reading and respond to anything that needed a longer response than I could give earlier.l&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the day, I’ll drop some of these; on the worst of days,&lt;br /&gt;
I’ll do the 9-9:30a, 12:30-2p, and 10p-midnight. On average, I seem to&lt;br /&gt;
get about an hour during the workday to process, read, and respond to&lt;br /&gt;
email.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;4&lt;/sup&gt; I say “process” because I don’t actually
read all ~1100. Many I discard out of hand as uninteresting spam due to
membership on the “edit” or “film” aliases, which get a notice for
every published asset ever made. Some I skim titles and decide if they
need reading. I &lt;em&gt;do&lt;/em&gt; read anything sent to me specifically.&lt;/small&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-can-i-get-your-attention-in-that-vast-sea-of-email&quot;&gt;How can I get your attention in that vast sea of email?&lt;/h3&gt;

&lt;p&gt;In order to make my time effective, I have a number of tools and tricks:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Email me at xx@xxxxxxx.xxx&lt;/strong&gt; and you fall into a special folder which is the first thing I process. It doesn’t guarantee I’ll read it right away, but it does mean it’ll get read that day, mostly.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Put the word URGENT at the front of the subject&lt;/strong&gt; and&lt;br /&gt;
you’ll get read even if I have only five minutes; you’ll usually get a&lt;br /&gt;
response, though it may be terse if I’m pressed for time. Please don’t&lt;br /&gt;
take this personally; I’m trying to be sure you know I saw your mail&lt;br /&gt;
and, if you need action from me, that you know what to expect.&lt;/li&gt;
  &lt;li&gt;**If you only have one line of info, put it in the subject and end with “&lt;eom&gt;&quot;**. EOM means &quot;end of message&quot; and it tells me I don&#39;t need to read anything but the title.&lt;/eom&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tell me what to do.&lt;/strong&gt; If you need me to act, I need you&lt;br /&gt;
to tell me what you want me to do; e.g. buy something, tell you when&lt;br /&gt;
the something will arrive, look into why it hasn’t arrived, send it&lt;br /&gt;
back because it’s not what we thought it was, etc. If you don’t ask me&lt;br /&gt;
to do something, I’m going to think you CC’d me to make sure I’m aware&lt;br /&gt;
of what’s going on.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;If it must be long, summarize at the top.&lt;/strong&gt; You’ll see me do this for most any email I write that’s more than one screen; it usually looks like this:&lt;/p&gt;

    &lt;p&gt;Subj: Last Weekend’s Foo CrisisThe Short Story:The foo broke last weekend. We fixed it, but it took 10 hours during whichthe farm was completely down. We’re taking steps to be sure this can’t happen again.The Epic Saga:At 8:47p last Saturday, the foo began spewing errors; by 9:14p it had failedcompletely, taking batcho with it. We began investigating …&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…that way the reader can decide quickly if they want more details now or later (or never).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Bobby McFerrin + 11</title>
   <link href="http://blog.geekdaily.org/2007/01/bobby_mcferrin_.html"/>
   <updated>2007-01-25T21:23:57-08:00</updated>
   <id>http://blog.geekdaily.org/2007/01/bobby_mcferrin_</id>
   <content type="html">&lt;p&gt;Beth and I left Sam and Cassie with a friend and went to see &lt;a href=&quot;http://www.calperfs.berkeley.edu/presents/season/2006/world_stage/bm.php&quot;&gt;Bobby McFerrin and Voicestra&lt;/a&gt; at Zellerbach last night. Was a great show; he’s as silly, reverent, and amazing and with 11 talented improvisational vocalists to work with, it was a decadently visceral experience.&lt;/p&gt;

&lt;p&gt;Seeing the show brought back memories of the only other time I’ve seen him in concert, way back in 1985 at the River Oaks Theatre in Houston. He was the second act of a double bill that night, with Stanley Jordan (!). I remember going with Rich Simental (aka Roadrunner, aka RoadRich from the pre-Internet BBS days where we answered to our handles more often than our names) and Matt Tye Whose-Surname-And-Handle-Escape-Me.&lt;/p&gt;

&lt;p&gt;It was pre-Voicestra; in fact, at the end of the show, Bobby invited “a few people from the audience” to come up on stage and sing with him. I’m pretty sure the three of us just teleported from the excellent seats Matt’s Tye’s mom got for us (she was with Rice or U of H, who were putting on the show) straight onto the stage, along with 21 other folks. And we followed it up with my first visit to &lt;a href=&quot;http://www.marfreless.net/&quot;&gt;Marfreless.&lt;/a&gt; A night I’ll never forget. Blow-you-away incredible.&lt;/p&gt;

&lt;p&gt;Was in the middle of a particularly spiritual piece of last night’s concert when I remembered that Matt Tye died not long after that night years ago. I couldn’t keep my eyes dry for a while after that. He was a smart, gentle, generous soul and the world’s a poorer place for his absence. It’s got me remembering Toast Terrace, Penny Lane, BBS parties across from the old Zilker shooting range, and a host of handles: RoadRich, SSR, Rael, Wiggly Toes, +Rich, JTK, ref, jas, Johnny Mnemonic, Big Boy, SysLep, Reaper, sine, cq, Wall, Gryph, JoeD, HowardTheDuck, Phant, Trav, Info …&lt;/p&gt;

&lt;p&gt;Hope the world’s working out for all of you, if you happen to look in.&lt;/p&gt;

&lt;p&gt;–purp&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Walgreens != Privacy</title>
   <link href="http://blog.geekdaily.org/2007/01/walgreens_priva.html"/>
   <updated>2007-01-23T12:28:56-08:00</updated>
   <id>http://blog.geekdaily.org/2007/01/walgreens_priva</id>
   <content type="html">&lt;p&gt;Was renewing a Walgreens prescription by phone the other day when suddenly it quoted my phone number to me and asked me to confirm or deny it. This with no authentication other than a prescription number.&lt;/p&gt;

&lt;p&gt;Don’t leave a prescription bottle where some black hat might see it …&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Procrastination is ...</title>
   <link href="http://blog.geekdaily.org/2007/01/procrastination.html"/>
   <updated>2007-01-23T11:33:25-08:00</updated>
   <id>http://blog.geekdaily.org/2007/01/procrastination</id>
   <content type="html">&lt;p&gt;If you &lt;a href=&quot;http://www.arnoldkling.com/econ/contents.html&quot;&gt;read up on economics&lt;/a&gt;, you know that finding the value of &lt;a href=&quot;http://www.arnoldkling.com/econ/markets/consumer.html&quot;&gt;utility&lt;/a&gt;is one of the core, elusive bits folks would like to be able to calculate; if they could, they’d be able to predict with fair accuracy how markets will react to a given phenomenon. Piers Steel, a professor from Univ. of Calgary, has factored in procrastination. Neat!&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Link: [A formula for procrastination&lt;/td&gt;
      &lt;td&gt;CNET News.com](http://news.com.com/A+formula+for+procrastination/2100-1008_3-6149636.html?tag=nefd.lede “A formula for procrastination&lt;/td&gt;
      &lt;td&gt;CNET News.com”). [&lt;a href=&quot;http://soniaarrison.com/2007/01/11/theres-now-a-mathematical-formula-for-procrastination/&quot;&gt;via&lt;/a&gt;]&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>Spöka-y!</title>
   <link href="http://blog.geekdaily.org/2007/01/spkay.html"/>
   <updated>2007-01-01T12:16:57-08:00</updated>
   <id>http://blog.geekdaily.org/2007/01/spkay</id>
   <content type="html">&lt;p&gt;When &lt;a href=&quot;http://www.ambientdevices.com/&quot;&gt;Ambient Devices&lt;/a&gt; first came out with their &lt;a href=&quot;http://www.ambientdevices.com/cat/orb/orborder.html&quot;&gt;Ambient Orb&lt;/a&gt;, a wireless softly glowing globe which you can buy for a silly price and pay a monthly fee to have it track something online, I knew I wanted one but not at that price point. Fortunately, many other geeks &lt;a href=&quot;http://infosthetics.com/archives/2005/05/diy_ambient_orb.html&quot;&gt;found&lt;/a&gt; &lt;a href=&quot;http://flat-earth.ece.cmu.edu/~agr/bt_orb/&quot;&gt;this&lt;/a&gt; &lt;a href=&quot;http://todbot.com/blog/2006/10/23/diy-ambient-orb-with-arduino-update/&quot;&gt;interesting,&lt;/a&gt; &lt;a href=&quot;http://www.hogsmack.com/infomate/&quot;&gt;too,&lt;/a&gt; and &lt;a href=&quot;http://weblogs.java.net/blog/kohsuke/archive/2006/11/diyorb_my_own_e.html&quot;&gt;chose&lt;/a&gt; to &lt;a href=&quot;http://devices.natetrue.com/wlcolor&quot;&gt;hack&lt;/a&gt; things to make it so. The folks at Ambient even make it easy by supplying &lt;a href=&quot;http://www.ambientdevices.com/developer/DIYOrbNotes.html&quot;&gt;DIY notes&lt;/a&gt; and &lt;a href=&quot;http://www.ambientdevices.com/developer/DIYOrbSuppliers.html&quot;&gt;sources for parts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An aside: I used some of those pages to make a Secret Santa gift from a lightbulb. Nifty fun, that. =]&lt;/p&gt;

&lt;p&gt;Then I ran across Spöka (pronounced SPOO-kah) at Ikea. Little &lt;a href=&quot;http://www.ikea.com/PIAimages/51517_PE151266_S3.jpg&quot;&gt;red&lt;/a&gt;, &lt;a href=&quot;http://www.ikea.com/PIAimages/51515_PE151264_S3.jpg&quot;&gt;blue&lt;/a&gt;, and &lt;a href=&quot;http://www.ikea.com/PIAimages/51516_PE151265_S3.jpg&quot;&gt;green&lt;/a&gt; ghost nightlights for $13. Soft diffuse light, just like an Orb. Cute shapes with faces. Already got all the power and stuff inside; also turns out to be fairly easy to disassemble, contains a rechargeable battery pack that will run it for 4-6 hours, and has &lt;em&gt;tons&lt;/em&gt; of space inside for a builder to tuck in some custom circuits. Have a look at &lt;a href=&quot;http://www.flickr.com/photos/purp/sets/72157594452129318/&quot;&gt;pics from the brief autopsy I did&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m pretty sure I can tuck an &lt;a href=&quot;http://www.arduino.cc/&quot;&gt;Arduino&lt;/a&gt; board and USB port neatly into one of these; I like the idea of it doing bluetooth and/or wifi, too. That plus some &lt;a href=&quot;http://www.superbrightleds.com/TriColor%20LED.htm&quot;&gt;RGB LEDs&lt;/a&gt; and this is gonna be &lt;strong&gt;&lt;em&gt;way&lt;/em&gt;&lt;/strong&gt; fun. (If you do something fun with one of these, please toss me a comment and a pointer to your project if it’s online)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; the Ikea website doesn’t seem to have Spöka anymore. The Emeryville Ikea has scads of them, though; I may have to go buy a few extra just in case. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Track My Baggage Closely, Please!</title>
   <link href="http://blog.geekdaily.org/2006/10/track_my_baggag.html"/>
   <updated>2006-10-15T13:01:01-07:00</updated>
   <id>http://blog.geekdaily.org/2006/10/track_my_baggag</id>
   <content type="html">&lt;p&gt;Fun lifehack via &lt;a href=&quot;http://www.schneier.com/&quot;&gt;Bruce Schneier&lt;/a&gt;: if you want your checked bags to be tracked very carefully (and never get lost), buy a starter pistol. They’re considered a weapon; once you place it in your bag (unloaded, of course) with your very valuable camera/computer equipment and disclose it, the TSA will keep a very close eye on it for you. Handy.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://lexardigital.typepad.com/mattbrandon/2006/08/tighter_securit.html#comment-21184785&quot; title=&quot;Matt Brandon Weblog: Tighter Security, what does this mean to the Photographer?&quot;&gt;Matt Brandon Weblog: Tighter Security, what does this mean to the Photographer?&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Weak security in our daily lives@Everything2.com</title>
   <link href="http://blog.geekdaily.org/2006/10/weak_security_i.html"/>
   <updated>2006-10-15T10:55:36-07:00</updated>
   <id>http://blog.geekdaily.org/2006/10/weak_security_i</id>
   <content type="html">&lt;p&gt;Reading &lt;a href=&quot;http://www.schneier.com/crypto-gram-0610.html#9&quot;&gt;Bruce Schneier’s Crypto-Gram&lt;/a&gt; today where he points out an &lt;a href=&quot;http://everything2.com/&quot;&gt;Everything2&lt;/a&gt; entry which calculates the &lt;a href=&quot;http://en.wikipedia.org/wiki/De_Bruijn_sequence&quot;&gt;DeBruijn sequence&lt;/a&gt; required to hack a car with the &lt;a href=&quot;http://www.thefordsource.com/store/car_accessories/images/freestyle/thumbs/freestyle_keyless_th.gif&quot;&gt;standard 5-button keyless entry pad&lt;/a&gt;, which they believe would take ~20 minutes to key in.&lt;/p&gt;

&lt;p&gt;Securing expensive assets with what amounts to a cheap combination lock is a pretty dorky idea.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://everything2.com/index.pl?node_id=1520430&quot; title=&quot;Weak security in our daily lives@Everything2.com&quot;&gt;Weak security in our daily lives@Everything2.com&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Chaos Theory In Practice, Part 1</title>
   <link href="http://blog.geekdaily.org/2006/09/chaos_theory_in.html"/>
   <updated>2006-09-05T07:26:00-07:00</updated>
   <id>http://blog.geekdaily.org/2006/09/chaos_theory_in</id>
   <content type="html">&lt;p&gt;For us, Labor Day weekend was all about bailing ourselves out of the disorganized, cluttery chaos we’d allowed to take root since the birth of our daughter, Cassie, in mid-April. We tried a number of times to stem the tide with limited success; usually we’d reclaim some section of the house only to lose another. Not a satisfying victory.&lt;/p&gt;

&lt;p&gt;We’d both read &lt;a href=&quot;http://en.wikipedia.org/wiki/Getting_Things_Done&quot;&gt;Getting Things Done&lt;/a&gt; by &lt;a href=&quot;http://www.davidco.com/&quot;&gt;David Allen&lt;/a&gt;, so we decided to base our approach on that. David might be less than pleased with us, though, as we divided things into 12 categories:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Reference/Aging:&lt;/em&gt; things we’ll get rid of when some known period of time has passed; for example, tax records, term contracts, etc. At first we tried to differentiate inside this category, but we ended up with so little in other piles that we decided to just lump it by year and expire it when after 7 years, when we expire our tax records.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Reference/Permanent&lt;/em&gt; &lt;em&gt;aka “permaref”:&lt;/em&gt; things we’ll keep for the conceivable future or which are attached to some significant item. For example, car maintenance records, a healthcare provider directory, extended warranty information.&lt;em&gt; &lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Projects/Now:&lt;/em&gt; either can be dealt with in &amp;lt; 2 minutes or must be dealt with in the next seven days&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Projects/Later:&lt;/em&gt; anything that doesn’t belong in “Now”&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Things Which Have A Home In Our House&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Things Whice Have A Home Outside Our House&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Things Which Need A Home In Our House&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Things Which Need A Home Outside Our House&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Trash/Shred&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Trash/Recycle&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Trash/Garbage&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Other:&lt;/em&gt; The category for “I don’t know what to do with this” aka “You figure it out.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note that categories 5-8 are really just a special subset of the two projects categories which we wanted to handle slightly differently; category 12 is just another way of saying “someone else’s inbox.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What We Did&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, we wandered the house with boxes and grabbed anything that wasn’t where it should be. No stopping to rearrange; you could only put something where it belonged if it took zero steps to get it there (a long reach was okay). We ended up with approximately a cubic yard of stuff; think of that as 27 cubic feet, which is 8 medium moving cubes (18x18x18” or 3.375 cubic feet each), or roughly 18  bankers boxes (12x12x18” or 1.5 cubic feet each). Clutter accumulates quickly.&lt;/p&gt;

&lt;p&gt;Next, we sorted it all to categories. Objects sorted quickly; paperwork (the bulk of what had accumulated) sorted slowly. Still, it turns out that you can do a rough sort incredibly fast if you arrange things so you can easily reach a container for each category and resolve to spend no more than a few seconds per item. We did ours on our living room floor with a paper bag labelled for each non-trash category; as we emptied boxes, we’d shift the contents of the most-full bag into that box and keep going. We’d sort for an hour or so, then take a break to play with kids, eat a meal, or just stretch and do something different for a while. At the end of each sorting session, we’d dump the trash and deal with the “Things Which Have A Home” piles as quickly as we could.&lt;/p&gt;

&lt;p&gt;We finished our sort in about 8-9 hours split over two days. The net remaining material, by category:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Reference/Aging:&lt;/em&gt; 3.75 cubic feet, approx. 2.5 banker boxes&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Reference/Permanent:&lt;/em&gt; .38 cubic feet, approx. .25 banker boxes&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Projects/Now:&lt;/em&gt; .75 cubic feet, approx. 0.5 banker boxes&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Projects/Later:&lt;/em&gt; 1.5 cubic feet, approx. 1 banker box&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Things Which Need A Home:&lt;/em&gt; 1.5 cubic feet, approx. 1 banker box&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Other:&lt;/em&gt; 1.5 cubic feet, approx. 1 banker box&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we managed to go from 27 cubic feet to a bit over 9 cubic feet. It’s amazing how much more orderly things feel for it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next week: Project Sorting.&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Meyer&#39;s Conjecture on Philosophy</title>
   <link href="http://blog.geekdaily.org/2006/07/meyers_conjectu.html"/>
   <updated>2006-07-15T15:33:13-07:00</updated>
   <id>http://blog.geekdaily.org/2006/07/meyers_conjectu</id>
   <content type="html">&lt;p&gt;All fundamental tenets of a philosophical system must be able to fit in a single SMS. Anything longer isn’t basic enough.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Parallel:&lt;/em&gt; Brevity is the soul of wisdom.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>One Red Paperclip. One House. One Year.</title>
   <link href="http://blog.geekdaily.org/2006/07/one_red_papercl.html"/>
   <updated>2006-07-09T22:09:15-07:00</updated>
   <id>http://blog.geekdaily.org/2006/07/one_red_papercl</id>
   <content type="html">&lt;p&gt;You probably already know about the &lt;a href=&quot;http://oneredpaperclip.blogspot.com/&quot;&gt;One Red Paperclip&lt;/a&gt; guy. He’s managed to &lt;a href=&quot;http://oneredpaperclip.blogspot.com/2006/07/503-main-street.html&quot;&gt;make his final trade&lt;/a&gt;, which he’ll officially complete on July 12, &lt;a href=&quot;http://oneredpaperclip.blogspot.com/2005/07/one-red-paperclip.html&quot;&gt;one year after he started&lt;/a&gt;. Pretty cool what you can do with the internet. (via &lt;a href=&quot;http://www.boingboing.net/2006/07/08/guy_successfully_tra.html&quot;&gt;BoingBoing&lt;/a&gt;)&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Hey Apple, Let Me iWander!</title>
   <link href="http://blog.geekdaily.org/2006/07/hey_apple_let_m.html"/>
   <updated>2006-07-09T15:16:09-07:00</updated>
   <id>http://blog.geekdaily.org/2006/07/hey_apple_let_m</id>
   <content type="html">&lt;p&gt;[note: this is a repost from a long-neglected blog I started last summer while at SIGGRAPH]&lt;/p&gt;

&lt;p&gt;I’m currently doing a work-from-hotel morning since there’s nothing at the conference that lured me away this morning, listening to my rather eclectic ~4K song playlist on my iPod on shuffle. This leads to some interesting, occasionally jarring, boundaries between songs; it also got me thinking more about something I’ve wanted for a while.&lt;/p&gt;

&lt;p&gt;If you’re like me, you have moods. Sometimes my moods do an energetic sprint through hours of Pete Tong’s Essential Mixes. Other times, they dance delightful undulations down the sandy beaches of Angelique Kidjo’s Black Ivory Soul. Occasionally they strut, oozing an attitude of down-home Texas hip as only Stevie Ray Vaughan or Lyle Lovett can manage.&lt;/p&gt;

&lt;p&gt;(We’ll ignore the immature, pissed-off moods that stomp into Evanescence, shoot you the finger, and slam the door in your face. They just want attention. Don’t give in.)&lt;/p&gt;

&lt;p&gt;For me, the analogy is apt: music makes a path for me and, when I find I’m on the right one for the moment, I want to follow it until I come to a crossroad where another path seems more interesting.&lt;/p&gt;

&lt;p&gt;I want to iWander.&lt;/p&gt;

&lt;p&gt;If you think about it, it should be easy. Every song starts with some implicit metadata attached: title, artist, album, year, genre – though the last is often argued over, especially out on the electronica/dance/techno/alternative fringe. Apple adds some more: your rating, grouping, playlists, last played, artwork, etc. I want to be able to add more, defining relationships between artists, songs, albums, etc. that exist only for me. I want to be able to change paths – say, from playlist to album, then perhaps genre, etc. – to follow my mood.&lt;/p&gt;

&lt;p&gt;An example might go something like this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Texas Flood, Stevie Ray Vaughan, Greatest Hits&lt;br /&gt;
&lt;em&gt;Man, I loved living in Austin while he was there. More of him.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Pride and Joy, Stevie Ray Vaughan, MTV Unplugged, Vol 1&lt;br /&gt;
 &lt;em&gt;I remember when he did this at Austin City Limits. That reminds me of the time we saw Indigo Girls there …&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Romeo and Juliet, Indigo Girls, Rites of Passage&lt;br /&gt;
 &lt;em&gt;That was a good night; seeing them, Nancy Griffith, and Mary Chapin Carpenter on the stage was phenomenal&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;This Shirt, Mary Chapin Carpenter, Hitchhiker Exampler&lt;br /&gt;
&lt;em&gt;Wow. For a cheap sampler of music from a mediocre cable show, this is amazing. Let’s hear it all again.&lt;/em&gt;&lt;br /&gt;
[…]&lt;/li&gt;
  &lt;li&gt;Make It Easier, Indigo Girls, Hitchhiker Exampler&lt;br /&gt;
&lt;em&gt;Oh, yeah, they have a tune on this one, too. I must be in a mood.&lt;/em&gt;&lt;br /&gt;
[…]&lt;/li&gt;
  &lt;li&gt;Talkin’ at the Texaco, James McMurtry, Hitchhiker Exampler&lt;br /&gt;
&lt;em&gt;He knows small-town like nobody’s business, that’s sure. Didn’t David Garza do something fun like this?&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Big Stick, Twang-Twang-Shock-a-Boom, Me So Twangy&lt;br /&gt;
&lt;em&gt;Bummer they couldn’t get along … they were awesome.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and so forth. Stevie Ray Vaughan could have just as easily branched to Robert Cray or Eric Clapton (great guitarists all and SRV died in a plane crash while on tour with both of them).&lt;/p&gt;

&lt;p&gt;There’s even a commercial angle: it’s not legal for me to share my music with others, but give me a way to share my metadata and I can find other people who have similar but diverging tastes and find new music I’ll probably like … and, as a bonus, I can judge that likelihood by evaluating the nature of the association between the two (“Austin City Limits? That’s a hick show … ewww.” or “David Garza was in a band? Wow!”) and follow the paths that seem interesting through the iTunes Music Store and on down the sidewalk.&lt;/p&gt;

&lt;p&gt;Hey, Apple, you listening?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cool Blog: Creating Passionate Users</title>
   <link href="http://blog.geekdaily.org/2006/07/cool_blog_creat.html"/>
   <updated>2006-07-09T15:08:38-07:00</updated>
   <id>http://blog.geekdaily.org/2006/07/cool_blog_creat</id>
   <content type="html">&lt;p&gt;Wandering through some blogs and ran across Kathy Sierra’s “Creating Passionate Users” blog, about which I can’t say enough nice things. She hits a number of my favorite issues, such as:&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://headrush.typepad.com/creating_passionate_users/2006/03/ultrafast_relea.html&quot; title=&quot;Creating Passionate Users: Ultra-fast release cycles and the new plane&quot;&gt;Creating Passionate Users: Ultra-fast release cycles and the new plane&lt;/a&gt;.&lt;br /&gt;
Link: &lt;a href=&quot;http://headrush.typepad.com/creating_passionate_users/2006/01/death_by_riskav.html&quot; title=&quot;Creating Passionate Users: Death by risk-aversion&quot;&gt;Creating Passionate Users: Death by risk-aversion&lt;/a&gt;.&lt;br /&gt;
Link: &lt;a href=&quot;http://headrush.typepad.com/creating_passionate_users/2005/12/the_hires_user_.html&quot; title=&quot;Creating Passionate Users: The hi-res user experience&quot;&gt;Creating Passionate Users: The hi-res user experience&lt;/a&gt;.&lt;br /&gt;
Link: &lt;a href=&quot;http://headrush.typepad.com/creating_passionate_users/2005/09/conversational_.html&quot; title=&quot;Creating Passionate Users: Conversational writing kicks formal writing&#39;s ass&quot;&gt;Creating Passionate Users: Conversational writing kicks formal writing’s ass&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And one that made me smile, too:&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://headrush.typepad.com/creating_passionate_users/2006/03/code_like_a_gir.html&quot; title=&quot;Creating Passionate Users: Code like a girl&quot;&gt;Creating Passionate Users: Code like a girl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ll be spelunking her archives for quite some time, I suspect.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Cleaning up old mail</title>
   <link href="http://blog.geekdaily.org/2006/06/cleaning_up_old.html"/>
   <updated>2006-06-23T14:11:29-07:00</updated>
   <id>http://blog.geekdaily.org/2006/06/cleaning_up_old</id>
   <content type="html">&lt;p&gt;Just a random thought as I start posting again: I want an easy way to clean up thousands of old emails quickly. Sure, I could leave them around, but frankly it just bugs me to know that I’m maintaining a heap of digital compost some of which I will never, not in a million years, find useful again.&lt;/p&gt;

&lt;p&gt;The surest way would be to quickly tag any email I read and choose not to delete with some indicators about why I didn’t just ditch it immediately. Evolution, the Linux Outlook-a-like, gives me a little of this via its Followup feature; Thunderbird didn’t have a plugin to help with this when last I looked.&lt;/p&gt;

&lt;p&gt;Still, there should be some helpful methods, such as a list of all the old mail’s senders along with a count of how many they sent and expandable to see the titles. Let me easily select all or some of any sender’s emails for deletion (for UI, think packages/subpackages in an installer). Others might be grading the importance of the old email according to length of thread, number of times I replied in the thread (indicating I found it important) and so forth.&lt;/p&gt;

&lt;p&gt;And yes, I’ve got a lot of these to go through. =\&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Bring Your Own Laptop To Work?</title>
   <link href="http://blog.geekdaily.org/2006/04/bring_your_own_.html"/>
   <updated>2006-04-26T08:53:20-07:00</updated>
   <id>http://blog.geekdaily.org/2006/04/bring_your_own_</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://zgp.org/~dmarti/blosxom/&quot;&gt;Don Marti&lt;/a&gt; &lt;a href=&quot;http://zgp.org/~dmarti/blosxom/business/byol.html&quot;&gt;blogged an idea&lt;/a&gt; that’s been floating around for a while: what if, instead of corporate IT supplying you a desktop which is largely underutilized, the company paid you a “laptop allowance” of some sort and you brought/brought your own? While it’s less feasible in the CG industry (those desktops are makin’ pixels, so we need ‘em around and all ;), it makes great sense in all sorts of other contexts – and was something I was begging for ca. 2000 when I was a “pre-sales technical consultant.”&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;There’s heated discussion in the comments of Don’s post which largely divides into “Right On!” and “IT’s Worst Nightmare.” Most of the latter seem to miss Don’s point: the user owns the laptop; IT supplies and supports only the services (network connection, DHCP for IP address and pointers to directory services such as DNS and LDAP, etc.) Users get some amount of free tech support per year (Don suggests “two major incidents” where I’d suggest one hour per week which accumulates with a 16 hour cap); after that, some sort of billing kicks in, either to the user or to their department.&lt;/p&gt;

&lt;p&gt;In the end you have positive motivation (“I get to choose!”) and negative motivation (“That’s gonna cost me …”). Sounds like a good closed system to me.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://zgp.org/~dmarti/blosxom/business/byol.html&quot; title=&quot;Don Marti business/byol.html&quot;&gt;Don Marti business/byol.html&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Slowly Crawling Towards Daylight</title>
   <link href="http://blog.geekdaily.org/2006/04/slowly_crawling.html"/>
   <updated>2006-04-25T11:50:53-07:00</updated>
   <id>http://blog.geekdaily.org/2006/04/slowly_crawling</id>
   <content type="html">&lt;p&gt;Expect a flurry of postings as I start to catch up post-baby (did I mention? We had our baby girl. She’s great. =) and rejoin the land of the living. I’m taking off work until early June, so lots of time to immerse myself in cool tech, maybe even to get some things done.&lt;/p&gt;

&lt;p&gt;Maybe. Baby. Maybe. =]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>SHDH9 This Weekend!</title>
   <link href="http://blog.geekdaily.org/2006/04/shdh9_this_week.html"/>
   <updated>2006-04-25T11:43:26-07:00</updated>
   <id>http://blog.geekdaily.org/2006/04/shdh9_this_week</id>
   <content type="html">&lt;p&gt;Woohoo! I hope I can go, but with a new baby, that’s a lot of hoping. =]&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://upcoming.org/event/70390/&quot; title=&quot;Upcoming.org: SuperHappyDevHouseNine at SuperHappyFunHouse (Saturday, April 29, 2006)&quot;&gt;Upcoming.org: SuperHappyDevHouseNine at SuperHappyFunHouse (Saturday, April 29, 2006)&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Panasonic&#39;s Vision of the Future: All Pixels, All The Time</title>
   <link href="http://blog.geekdaily.org/2006/03/akihabara_news.html"/>
   <updated>2006-03-29T12:43:20-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/akihabara_news</id>
   <content type="html">&lt;p&gt;From &lt;a href=&quot;http://www.akihabaranews.com/review-63-Panasonic%27s interactive TV wall%2C the demo.html&quot; title=&quot;Akihabara News&quot;&gt;Akihabara News&lt;/a&gt;, deck the walls with screens of interaction. Two side-by-side 110” touch screens with user-manipulable windows of video and audio from any/many sources. This makes me shudder. I can’t believe it’d ever be interesting to monopolize so much space to artificially deal with the world – much less to facilitate the &lt;a href=&quot;http://query.nytimes.com/gst/fullpage.html?sec=health&amp;amp;res=9F07E5D71630F931A3575AC0A961958260&quot;&gt;emerging&lt;/a&gt; &lt;a href=&quot;http://abcnews.healthology.com/focus_index.asp?b=abcnews&amp;amp;f=adhd_comprehend&quot;&gt;ADD&lt;/a&gt; &lt;a href=&quot;http://borntoexplore.org/journal.htm&quot;&gt;trend&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But then, I prefer my 1024x768 12” PowerBook to a WXVGA monster display.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Ajaxy Homepages</title>
   <link href="http://blog.geekdaily.org/2006/03/ajaxy_homepages.html"/>
   <updated>2006-03-27T22:25:23-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/ajaxy_homepages</id>
   <content type="html">&lt;p&gt;A nifty find via &lt;a href=&quot;http://http://www.techcrunch.com/2006/03/22/netvibes-to-announce-seed-financing-today/&quot;&gt;TechCrunch&lt;/a&gt;: &lt;a href=&quot;http://www.netvibes.com&quot;&gt;NetVibes&lt;/a&gt; and &lt;a href=&quot;http://www.protopage.com/&quot;&gt;ProtoPage,&lt;/a&gt; your personalizable ajaxy homepage. Toss in nearly any kind of content and neatly arrange or slop it around (respectively). Look for this on &lt;a href=&quot;http://www.google.com/ig&quot;&gt;Google’s personalized pages&lt;/a&gt; sometime later this evening or early tomorrow. ;]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Meshing an Airport Extreme and a Linksys WRT54G</title>
   <link href="http://blog.geekdaily.org/2006/03/meshing_an_airp.html"/>
   <updated>2006-03-25T23:19:45-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/meshing_an_airp</id>
   <content type="html">&lt;p&gt;I’ve spent the day working on home tech projects; we’re paring down, getting rid of excess tech accumulation. Part of that is to eliminate one Airport Extreme by meshing the other one with a new Linksys WRT54G we’d bought a few weeks ago. According to &lt;a href=&quot;http://rgbdream.com/?p=44&quot;&gt;this post at rgbdream.com&lt;/a&gt;, we should be able to just mesh them, no muss, no fuss. No dice, either. I spent hours sniffing networks and trying to understand why, but it just didn’t work out.&lt;/p&gt;

&lt;p&gt;Then I found out about &lt;a href=&quot;http://dd-wrt.org/&quot;&gt;dd-wrt.org&lt;/a&gt; and their firmware for the WRT54G; they’re based on &lt;a href=&quot;http://openwrt.org/&quot;&gt;openwrt.org&lt;/a&gt;’s work and are &lt;a href=&quot;http://www.google.com/search?q=%2Bwrt54g+%2Bfirmware&amp;amp;start=0&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla:en-US:official&quot;&gt;one of many implementations&lt;/a&gt;. (I chose to avoid sveasoft’s implementation as there seem to be &lt;a href=&quot;http://openwrt.org/?p=27&quot;&gt;questions about their adherence to the GPL&lt;/a&gt;. Icky.) Bummer, though – the new WRT54G is v5, which is no longer an embedded Linux device. This makes it an inhospitable environment for the various open source firmware projects.&lt;/p&gt;

&lt;p&gt;The old WRT54G is v1 — yay! — and is now reflashed according to &lt;a href=&quot;http://www.testmy.net/forum/t-12222&quot;&gt;the advice of Swimmer on testmy.net&lt;/a&gt; and, with very little problem, there’s now just one wireless net in the house (yes, there were two before – WRT and the Extremes ;p). It’s amazing what the dd-wrt firmware enables. I can ssh into the router now. I can set up a hotspot, complete with http redirect to a login page (and easy ChillSpot setup, whatever that is). I can set up fixed MAC address to IP associations for DHCP, which means that I can actually have decent internal DNS without needing a separate DHCP and DNS server. Most of all, it’s nice streaming &lt;a href=&quot;http://www.wiseup.org/twang/&quot;&gt;Twang-Twang-Shock-A-Boom&lt;/a&gt; through iTunes to the stereo knowing there’s far less hardware in the mix.&lt;/p&gt;

&lt;p&gt;Anyone need an extra Airport Extreme? I’ll trade for a pre-v5 WRT54G …&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>LinkStations: NAS for the Hacking</title>
   <link href="http://blog.geekdaily.org/2006/03/linkstationwiki.html"/>
   <updated>2006-03-22T15:29:57-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/linkstationwiki</id>
   <content type="html">&lt;p&gt;Think network-attached storage (NAS) that talks to whatever flavor bx you’ve got. Windows? No problem. Mac? Sure thing. Linux? Happy to. Pull it out of the box and in a few minutes you’ve got hot-and-cold running fileservice.&lt;/p&gt;

&lt;p&gt;Then I found out there’s a community of folks hacking them. Putting Debian on ‘em. Augmenting them with all sorts of goodies.&lt;/p&gt;

&lt;p&gt;These little hummers are too much fun.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Link: [LinkStationWiki&lt;/td&gt;
      &lt;td&gt;Main / Home Page](http://www.linkstationwiki.org/ “LinkStationWiki&lt;/td&gt;
      &lt;td&gt;Main / Home Page”).&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>LiteBrite on your Fridge</title>
   <link href="http://blog.geekdaily.org/2006/03/litebrite_on_yo.html"/>
   <updated>2006-03-22T14:36:39-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/litebrite_on_yo</id>
   <content type="html">&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.makezine.com/blog/94ee7a81448c63d0b8fb9ab7.large.jpg&quot; alt=&quot;PacMagnetic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By way of &lt;a href=&quot;http://www.makezine.com/blog/archive/2006/03/how_to_make_magnetic_refrigera.html?CMP=OTC-0D6B48984890&quot;&gt;MakeBlog&lt;/a&gt; comes these &lt;a href=&quot;http://www.instructables.com/ex/i/E63A7FFC0A611029BC4A001143E7E506/?ALLSTEPS&quot; title=&quot;Magnetic Refrigerator Lights&quot;&gt;Magnetic Refrigerator Lights&lt;/a&gt; … they’re phenomenal! Mother of All That’s Decent and Good, I must have this.&lt;/p&gt;

&lt;p&gt;p.s. the site this is hosted on, &lt;a href=&quot;http://www.instructables.com/&quot;&gt;Instructables&lt;/a&gt;, looks fun, too. Gotta find time to browse that.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Biodegradable Food Containers</title>
   <link href="http://blog.geekdaily.org/2006/03/biodegradable_d.html"/>
   <updated>2006-03-20T17:38:33-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/biodegradable_d</id>
   <content type="html">&lt;p&gt;Most excellent: disposable “plastic” food containers made from corn resin. They biodegrade in ~45-60 days in your compost bin. You can buy them at &lt;a href=&quot;http://www.ecoproducts.com/Business/food_services/food_containers/fs_containers_corn_food_pack.htm&quot;&gt;Ecoproducts.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link: &lt;a href=&quot;http://www.popgadget.net/2006/03/biodegradable_f.php&quot; title=&quot;Popgadget: Personal Tech for Women&quot;&gt;Popgadget: Personal Tech for Women&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Tiny MP3 Streaming Server</title>
   <link href="http://blog.geekdaily.org/2006/03/tiny_mp3_stream.html"/>
   <updated>2006-03-18T20:41:02-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/tiny_mp3_stream</id>
   <content type="html">&lt;p&gt;From hack a day: a &lt;a href=&quot;http://mp3elf.net/&quot;&gt;DIY MP3 streaming server&lt;/a&gt; … BSD licensed so you can download the plans and source for it or buy the kit, assembled or not. Maybe when I’ve got a couple hundred to spare …&lt;/p&gt;

&lt;p&gt;Link: &lt;u&gt;&lt;a title=&quot;Network attached MP3 streamer - hack a day - www.hackaday.com _&quot; href=&quot;http://www.hackaday.com/entry/1234000300073591/&quot;&gt;Network attached MP3 streamer - hack a day - www.hackaday.com&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Leaftag: Tag files and stuff in Linux</title>
   <link href="http://blog.geekdaily.org/2006/03/leaftag_tag_fil.html"/>
   <updated>2006-03-17T09:20:20-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/leaftag_tag_fil</id>
   <content type="html">&lt;p&gt;Drew turned me on to &lt;a href=&quot;http://www.chipx86.com/wiki/Leaftag&quot; title=&quot;Leaftag - ChippyWiki&quot;&gt;Leaftag&lt;/a&gt; this morning. Looks wicked awesome for doing TagEverything (I need a a better name for that).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Tagging for the Linux desktop&lt;/p&gt;

  &lt;p&gt;Leaftag is a library and set of utilities for tagging files on the Linux desktop. It’s a convenient way of organizing files in a non-hierarchical manner. Local files, websites, or anything with a URI can be tagged with one or more names and easily referenced by anything that supports Leaftag.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Okay, Okay!</title>
   <link href="http://blog.geekdaily.org/2006/03/okay_okay.html"/>
   <updated>2006-03-14T23:24:59-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/okay_okay</id>
   <content type="html">&lt;p&gt;Yes, &lt;a href=&quot;http://drewp.quickwitretort.com/2006/03/12/0&quot;&gt;Drew&lt;/a&gt;, I’ll extend &lt;a href=&quot;http://semfile.bigasterisk.com/&quot;&gt;semfile&lt;/a&gt; to for my Tag Everything project!&lt;/p&gt;

&lt;p&gt;There, I’ve said it in public. Or as public as the internet is.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Libraries as Playlists</title>
   <link href="http://blog.geekdaily.org/2006/03/libraries_as_pl.html"/>
   <updated>2006-03-14T10:42:11-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/libraries_as_pl</id>
   <content type="html">&lt;p&gt;I love reading &lt;a href=&quot;http://www.hyperorg.com/blogger/&quot;&gt;Dave Weinberger’s blog&lt;/a&gt;; his excitement at the ways technology can augment the world mirrors my own. I love &lt;a href=&quot;http://www.hyperorg.com/blogger/mtarchive/reading_and_libraries_two_note.html&quot;&gt;this post&lt;/a&gt; for the reduction of where Web 2.0 and ubiquitous metadata are heading us: “When all our works are digitized, a local library will be nothing but a playlist.”&lt;/p&gt;

&lt;p&gt;Think about that … mash up &lt;a href=&quot;http://books.google.com&quot;&gt;Google Books&lt;/a&gt; with a &lt;a href=&quot;http://www.apple.com/ipod/ipod.html&quot;&gt;video iPod&lt;/a&gt; and &lt;strong&gt;BAM&lt;/strong&gt; – it’s a library in your pocket. Toss in &lt;a href=&quot;http://www.audible.com/&quot;&gt;Audible.com&lt;/a&gt; and it’s even better.&lt;/p&gt;

&lt;p&gt;I’m with Dave … I can’t &lt;em&gt;wait!&lt;/em&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>How To Tie Your Shoes</title>
   <link href="http://blog.geekdaily.org/2006/03/how_to_tie_your.html"/>
   <updated>2006-03-14T10:31:19-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/how_to_tie_your</id>
   <content type="html">&lt;p&gt;Found &lt;a href=&quot;http://www.fieggen.com/shoelace/knots.htm&quot;&gt;this&lt;/a&gt; on &lt;a href=&quot;http://www.hyperorg.com/blogger/mtarchive/how_to_tie_your_shoelaces.html&quot;&gt;Dave Weinberger’s blog&lt;/a&gt;. I’ve been tying my shoes wrong for 40 (okay, 36; before that, Mom was doing it wrong) years. Who knew?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>OLPC: You Know, For Kids!</title>
   <link href="http://blog.geekdaily.org/2006/03/olpc_you_know_f.html"/>
   <updated>2006-03-09T17:58:23-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/olpc_you_know_f</id>
   <content type="html">&lt;p&gt;A quick link to &lt;a href=&quot;http://thinkdaily.org/jimmm/weblog/19.html&quot;&gt;my initial thoughts on the One Laptop Per Child project&lt;/a&gt; from &lt;a href=&quot;http://thinkdaily.org/jimmm/weblog/&quot;&gt;my other blog&lt;/a&gt; where I think more about social implications (and which doesn’t accept trackbacks. I’ll have to figure out how to fix that …) The geek in me wants desparately to play with one of these. But then I want to make &lt;a href=&quot;http://www.hackaday.com/entry/1234000990049411/&quot;&gt;solar mobile wifi hot spots&lt;/a&gt;, do cool things with &lt;a href=&quot;http://www.sparkfun.com/commerce/product_info.php?products_id=569#&quot;&gt;tiny lcd displays&lt;/a&gt;, and play with &lt;a href=&quot;http://www.hackaday.com/entry/1234000157040860/&quot;&gt;stomp boxes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I guess I want to go off the network without leaving the net behind.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Good Engineering!</title>
   <link href="http://blog.geekdaily.org/2006/03/good_engineerin.html"/>
   <updated>2006-03-09T16:38:29-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/good_engineerin</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/purp/108240176/&quot; title=&quot;photo sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/52/108240176_5df5d17be4_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
   &lt;a href=&quot;http://www.flickr.com/photos/purp/108240176/&quot;&gt;Good Engineering!&lt;/a&gt;  &lt;br /&gt;
  Originally uploaded by &lt;a href=&quot;http://www.flickr.com/people/purp/&quot;&gt;jimmm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Someone was thinking when they made this fridge; instead of making some odd-shaped plastic water holding tank that would be a pain to install and replace, they just coiled up a bunch of the standard water supply tubing they were already using to route water through the fridge to the icemaker and door.&lt;/p&gt;

&lt;p&gt;The coil is roughly 12 inches in diameter and 3 inches thick; the tubing is 0.33 inch outer diameter and 0.25 inch inner diameter. This means there’s ~60 feet of tubing holding ~2.5 quarts of water.&lt;/p&gt;

&lt;p&gt;Sweet!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>TypePad == Geek Haven</title>
   <link href="http://blog.geekdaily.org/2006/03/typepad_geek_ha.html"/>
   <updated>2006-03-08T12:11:40-08:00</updated>
   <id>http://blog.geekdaily.org/2006/03/typepad_geek_ha</id>
   <content type="html">&lt;p&gt;I love that I can post to my blog from my mobile. Thanks, TypePad!&lt;/p&gt;

&lt;p&gt;Okay, I could have just said, “First Post!” and had done with it, but this &lt;br /&gt;
was much more fun. =]&lt;/p&gt;

</content>
 </entry>
 
 
</feed>
