<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>geek!daily</title>
    <link rel="alternate" type="text/html" href="http://blog.geekdaily.org/" />
    <link rel="service.post" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602" title="geek!daily" />
    <id>tag:typepad.com,2003:weblog-318602</id>
    <updated>2009-10-15T20:27:25Z</updated>
    <subtitle>... it is by will alone i set my mind in motion ...</subtitle>

    <generator uri="http://www.typepad.com/">TypePad</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/geekdailyblog" /><feedburner:info uri="geekdailyblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><geo:lat>37.769528</geo:lat><geo:long>-122.259378</geo:long><entry>
        <title>Live Blog: Comet &amp; Other Browser Stuff</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/PhsLbIvqUOE/live-blog-comet-other-browser-stuff.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e20120a5e9f536970b" title="Live Blog: Comet &amp; Other Browser Stuff" />
        <id>tag:typepad.com,2003:post-6a00d83452448969e20120a5e9f536970b</id>
        <published>2009-10-15T13:27:25-07:00</published>
        <updated>2009-10-15T20:27:25Z</updated>
        <summary type="html">It's a big component of what we call "real-time" This is the kind of stuff that puts up a banner on a Twitter search ("# New Tweets Found") and makes things feel real time. List of what's being done to...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>
        <category term="Metadata" />
        <category term="Social Networks" />
        <category term="UI" />
        <category term="Web 2.0" />

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">It's a big component of what we call "real-time"&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;&lt;br&gt;What formats are people using to send data:&lt;br&gt;* JSON&lt;br&gt;* XMPP&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Have to hold open request/response pairs. Connection setup and teardown is expensive&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Go to jschat.com to see a bad resize.&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Would be nice if you could select things to pull out of the stream and hold onto.&lt;br&gt;&lt;br&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;br&gt;&lt;br&gt;Infinite scroll vs. "More" button&lt;br&gt;&lt;br&gt;Titlebar flash (Gmail and GTalk)&lt;br&gt;&lt;br&gt;Some sites make a tiny flash widget to play a sound&lt;br&gt;&lt;br&gt;Haptic: twitter dmesg to cellphone buzz&lt;br&gt;&lt;br&gt;Notifications can become another form of info overload/noise&lt;br&gt;&lt;br&gt;(We flailed at making a 1D/2D chart to represent frequency and value ... FAIL)&lt;br&gt;&lt;br&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;br&gt;&lt;br&gt;Apple's surprise: phonetop apps took off. (?) vs. John Gruber: "The most used app on my iPhone is Safari."&lt;br&gt;&lt;p&gt;You can find the whiteboard pics in &lt;a href="http://flickr.com/photos/purp"&gt;my Flickr stream&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=PhsLbIvqUOE:g-kKjktS3Hc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=PhsLbIvqUOE:g-kKjktS3Hc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=PhsLbIvqUOE:g-kKjktS3Hc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=PhsLbIvqUOE:g-kKjktS3Hc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/PhsLbIvqUOE" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/10/live-blog-comet-other-browser-stuff.html</feedburner:origLink></entry>
    <entry>
        <title>Live Blog: Web Aggregation, What Works and What Doesn't</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/68BHwCcK_Gk/live-blog-web-aggregation-what-works-and-what-doesnt.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e20120a6406ae1970c" title="Live Blog: Web Aggregation, What Works and What Doesn't" />
        <id>tag:typepad.com,2003:post-6a00d83452448969e20120a6406ae1970c</id>
        <published>2009-10-15T12:17:59-07:00</published>
        <updated>2009-10-19T21:06:53Z</updated>
        <summary type="html">[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.] Scraping isn't a scalable model.There...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>
        <category term="Data Portability" />
        <category term="Identity" />
        <category term="Social Networks" />
        <category term="Web 2.0" />

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&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;There are biz issues around aggregating data: many businesses don't want you to get their data, though many are becoming more open.&lt;br&gt;&lt;br&gt;Doing aggregation right:&lt;br&gt;* minimize latency&lt;br&gt;* maximize engagement&lt;br&gt;&lt;br&gt;When latency is high, it causes confusion and takes you out of real-time&lt;br&gt;&lt;br&gt;Doing conditional gets can be somewhat useful.&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Smarr: "Brad Fitzpatrick said, 'Make polling a special case of push.'" &lt;span style="text-decoration: line-through;"&gt;He attributed this to someone but I missed the attribution.&lt;/span&gt; &lt;br&gt;&lt;br&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;br&gt;&lt;br&gt;Plaxo uses TripIt's RSS feed as alerting, grabs item ID, then uses their APIs to fetch rich data.&lt;br&gt;&lt;br&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;br&gt;&lt;br&gt;Activity streams seek to provide more rich data in a somewhat normalized, extensible format.&lt;br&gt;&lt;br&gt;Many/most sites aren't yet perfectly architected for real-time's push, ping, etc.&lt;br&gt;&lt;br&gt;PubSubHubBub and Activity Streams are externally represented data shards&lt;br&gt;&lt;br&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;br&gt;&lt;br&gt;None of the NoSQL alternatives are quite ready for prime-time. Smarr: "It should be something that's just a primitive."&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Ideal scalability/performance would be an index per user. This would be grossly inefficient due to the number of duplicate entries.&lt;br&gt;&lt;br&gt;No one has nailed reader-controlled aggregation (Show me Joe's tweets and blogs but not his photos) quite yet.&lt;br&gt;&lt;br&gt;Smarr: "If we're all kinda [sharing], we're all making each other smarter"&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&gt;Folks like Twitter are so overloaded with info that they might not recognize non-immediate contexts that are interesting to me.&lt;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;br&gt;&lt;br&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;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=68BHwCcK_Gk:7YzEexYWe_s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=68BHwCcK_Gk:7YzEexYWe_s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=68BHwCcK_Gk:7YzEexYWe_s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=68BHwCcK_Gk:7YzEexYWe_s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/68BHwCcK_Gk" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/10/live-blog-web-aggregation-what-works-and-what-doesnt.html</feedburner:origLink></entry>
    <entry>
        <title>Stepping Into BDD with Cucumber and WebRAT: Structuring the Work</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/nP8qPO2DCqI/stepping-into-bdd-with-cucumber-and-webrat-structuring-the-work.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e20120a5c108cb970c" title="Stepping Into BDD with Cucumber and WebRAT: Structuring the Work" />
        <id>tag:typepad.com,2003:post-6a00d83452448969e20120a5c108cb970c</id>
        <published>2009-09-13T14:45:32-07:00</published>
        <updated>2009-09-14T06:59:48Z</updated>
        <summary type="html">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. I'm working on a tiny project for the dads club at my...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&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;&#xD;
&#xD;
&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;&#xD;
&#xD;
&lt;p&gt;My usual working methodology is:&lt;/p&gt;&#xD;
&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;Write a quick set of use cases&lt;/li&gt;&#xD;
&lt;li&gt;Infer features from the use cases&lt;/li&gt;&#xD;
&lt;li&gt;Divide the features into logical delivery phases&lt;/li&gt;&#xD;
&lt;li&gt;Start spec'ing the implementation&lt;/li&gt;&#xD;
&lt;li&gt;Code to the specs&lt;/li&gt;&#xD;
&lt;li&gt;Profit!&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&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;&#xD;
&#xD;
&lt;p&gt;The use cases for this project are pretty easy:&lt;/p&gt;&#xD;
&#xD;
&lt;pre class="brush: plain; light: true;"&gt;&#xD;
Use Cases:&#xD;
&#xD;
NON-MEMBERS:&#xD;
* Join&#xD;
&#xD;
MEMBERS:&#xD;
* See news postings&#xD;
* See calendar events&#xD;
* Subscribe to a calendar feed&#xD;
* Read and send email to the group&#xD;
* Maintain a member profile (email, phone, location, kid info, etc.)&#xD;
* Browse and search a member directory (by grade, class, proximity/map, etc.)&#xD;
&#xD;
PREZ FOR LIFE:&#xD;
* Write news postings&#xD;
* Post new events&#xD;
* Send news/reminders to various publishers (group mailing list, school newsletter editor, etc.)&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;(Yeah, we have a President For Life. He's awesome.)&lt;/p&gt;&#xD;
&#xD;
&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;&#xD;
&#xD;
&lt;p&gt;Here's the feature rough divided into phases:&lt;/p&gt;&#xD;
&#xD;
&lt;pre class="brush: plain; light: true;"&gt;&#xD;
Phase 0: Site&#xD;
Non-Members can see front page&#xD;
&#xD;
Phase 1: Members&#xD;
Non-Members can join&#xD;
Members can sign in with email and password or OpenID&#xD;
PFL can manage news items&#xD;
PFL can manage events&#xD;
PFL can manage pages&#xD;
PFL can suspend accounts of non-PFLs&#xD;
Members can view news and events&#xD;
News snippets and event titles show on top page&#xD;
&#xD;
Phase 2: Admins&#xD;
Members can be made admin by PFL&#xD;
Admins can manage news items&#xD;
Admins can manage events&#xD;
Admins can manage pages&#xD;
&#xD;
Phase 3: Feeds and Mailings&#xD;
Members can subscribe to news and events feeds&#xD;
PFL can set reminders to be sent by email&#xD;
Members can recover passwords by email&#xD;
&#xD;
Phase 4: Profiles&#xD;
Members can add email, phone, address, availability, notes, profile pic&#xD;
Members can add kids: name, age, picture, teacher&#xD;
Members can mark info private, admin-only, or open&#xD;
&#xD;
Phase 5: Directory&#xD;
Members can browse directory info&#xD;
&#xD;
Phase 6: Maps&#xD;
Members can see people, events on map&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&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;&#xD;
&#xD;
&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;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=nP8qPO2DCqI:1aGLt6vXTr0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=nP8qPO2DCqI:1aGLt6vXTr0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=nP8qPO2DCqI:1aGLt6vXTr0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=nP8qPO2DCqI:1aGLt6vXTr0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/nP8qPO2DCqI" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/09/stepping-into-bdd-with-cucumber-and-webrat-structuring-the-work.html</feedburner:origLink></entry>
    <entry>
        <title>Generate the regex for a TLD hostname from Perl</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/mPeL-ZDLi50/generate-the-regex-for-a-tld-hostname-from-perl.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e20120a5030397970b" title="Generate the regex for a TLD hostname from Perl" />
        <id>tag:typepad.com,2003:post-6a00d83452448969e20120a5030397970b</id>
        <published>2009-08-18T19:05:19-07:00</published>
        <updated>2009-09-14T05:56:45Z</updated>
        <summary type="html">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: #!/usr/bin/env...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>
        <category term="Hacking" />

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&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;&#xD;
&#xD;
&lt;pre class="brush: perl"&gt;&#xD;
#!/usr/bin/env perl&#xD;
use strict;&#xD;
use warnings;&#xD;
&#xD;
use LWP::Simple;&#xD;
&#xD;
my $fqdn_regex;&#xD;
&#xD;
if (my $content = get('http://data.iana.org/TLD/tlds-alpha-by-domain.txt')) {&#xD;
  $fqdn_regex = '(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:';&#xD;
  $fqdn_regex .= join('|', grep (!/^(#|xn)/i, (split /\n/, lc($content))));&#xD;
  $fqdn_regex .= ')';&#xD;
}&#xD;
&#xD;
my $regex = $fqdn_regex . '(?:\s|\/|$)';&#xD;
print "$regex\n";&#xD;
&lt;/pre&gt;&lt;p&gt;&#xD;
&#xD;
Several caveats:&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;It doesn't match IPv4 dotted quad nor IPv6 ::-notation&lt;/li&gt;&#xD;
&lt;li&gt;It intentionally ignores Internationalized Domain Name in Applications (IDNA) domains&lt;/li&gt;&#xD;
&lt;li&gt;It borrows from my favorite reference for this, &lt;a href="http://www.regular-expressions.info/email.html"&gt;regular-expressions.info's page on email address regexes&lt;/a&gt;.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
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;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=mPeL-ZDLi50:p7PPzYBIWJM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=mPeL-ZDLi50:p7PPzYBIWJM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=mPeL-ZDLi50:p7PPzYBIWJM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=mPeL-ZDLi50:p7PPzYBIWJM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/mPeL-ZDLi50" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/08/generate-the-regex-for-a-tld-hostname-from-perl.html</feedburner:origLink></entry>
    <entry>
        <title>Gmail no longer beta? True dat.</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/oc5izlVVxcY/gmail-no-longer-beta-true-dat.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e2011570df1509970c" title="Gmail no longer beta? True dat." />
        <id>tag:typepad.com,2003:post-6a00d83452448969e2011570df1509970c</id>
        <published>2009-07-07T10:12:31-07:00</published>
        <updated>2009-07-07T17:59:13Z</updated>
        <summary type="html">I guess it's no longer under construction, or so sayeth the GMail blog which also shows those who can't live without that ubiquitous beta tag how to bring back their old friend:</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;p&gt;I guess it's no longer &lt;a href="http://blog.geekdaily.org/2007/07/beta-is-the-web.html"&gt;under construction&lt;/a&gt;, or so sayeth &lt;a href="http://gmailblog.blogspot.com/2009/07/gmail-leaves-beta-launches-back-to-beta.html"&gt;the GMail blog&lt;/a&gt; which also shows those who can't live without that ubiquitous beta tag &lt;a href="http://mail.google.com/mail/?shva=1#settings/labs"&gt;how to bring back their old friend&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;a href="http://mail.google.com/mail/?shva=1#settings/labs" onclick="window.open(this.href,'_blank','scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false" style="display: inline;"&gt;&lt;img alt="Back2beta" border="0" class="at-xid-6a00d83452448969e2011570df13e4970c " src="http://purp.typepad.com/.a/6a00d83452448969e2011570df13e4970c-pi" style="width: 600px;" title="Back2beta"&gt;&lt;/img&gt;&lt;/a&gt; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=oc5izlVVxcY:QIGRwu_gMDI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=oc5izlVVxcY:QIGRwu_gMDI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=oc5izlVVxcY:QIGRwu_gMDI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=oc5izlVVxcY:QIGRwu_gMDI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/oc5izlVVxcY" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/07/gmail-no-longer-beta-true-dat.html</feedburner:origLink></entry>
    <entry>
        <title>Michael Jackson's Obit via Wordle</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/uxbxJV2GOI4/michael-jacksons-obit-via-wordle.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=6a00d83452448969e20115715bf46d970b" title="Michael Jackson's Obit via Wordle" />
        <id>tag:typepad.com,2003:post-6a00d83452448969e20115715bf46d970b</id>
        <published>2009-06-25T18:40:55-07:00</published>
        <updated>2009-06-26T01:42:22Z</updated>
        <summary type="html">Story by Yahoo!, picture by Wordle.net:</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Story by &lt;a href="http://news.yahoo.com/s/ap/us_obit_michael_jackson"&gt;Yahoo!&lt;/a&gt;, picture by &lt;a href="http://www.wordle.net/gallery/wrdl/970425/Michael_Jackson_Died"&gt;Wordle.net&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.wordle.net/gallery/wrdl/970425/Michael_Jackson_Died" title="Wordle: Michael Jackson Died"&gt;&lt;img  alt="MJ Obit Wordle" class="at-xid-6a00d83452448969e20115715bf294970b image-full " src="http://purp.typepad.com/.a/6a00d83452448969e20115715bf294970b-800wi" title="MJ Obit Wordle" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=uxbxJV2GOI4:3_Any_yHwks:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=uxbxJV2GOI4:3_Any_yHwks:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=uxbxJV2GOI4:3_Any_yHwks:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=uxbxJV2GOI4:3_Any_yHwks:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/uxbxJV2GOI4" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/06/michael-jacksons-obit-via-wordle.html</feedburner:origLink></entry>
    <entry>
        <title>LiveBlog: 10+ Deploys A Day: Dev and Ops at Flickr</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/FwBB8lNJSMU/liveblog-10-deploys-a-day-dev-and-ops-at-flickr.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=68418755" title="LiveBlog: 10+ Deploys A Day: Dev and Ops at Flickr" />
        <id>tag:typepad.com,2003:post-68418755</id>
        <published>2009-06-23T13:47:46-07:00</published>
        <updated>2009-06-26T00:06:49Z</updated>
        <summary type="html">Update 1: Slides are now on SlideShare. Update 2: Video now available on blip.tv John Allspaw (Ops) &amp; Paul Hammond (Eng), Twitter “Actually work together and aren’t huge assholes to each other.” (omitted: photo stats … that’s a lot of...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;br&gt;Update 1: &lt;a href="http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr"&gt;Slides are now on SlideShare.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Update 2: &lt;a href="http://velocityconference.blip.tv/file/2284377"&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;“Actually work together and aren’t huge assholes to each other.”&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;(omitted: photo stats … that’s a lot of kittens)&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
&#xD;
Dev vs. Ops&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;It’s not my {machines,code} it’s your {code,machines}&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Spock v. Scottie analogy&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;CW: dev job to add features, ops job to keep site stable and fast&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Flickr: Ops job is to enable the business (Dev’s, too)&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
Lowering the risk of change via tools and culture.&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Increase confidence in change goodness&lt;/li&gt;&#xD;
		&lt;li&gt;Increase ability to react to those changes&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;You need {ops,devs} who think like {dev,ops}&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;1. Role and Config Mgmt&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
&#xD;
2. Shared Version Control: everyone looks in the same place for everything&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Code and config in same place&lt;/li&gt;&#xD;
		&lt;li&gt;Everyone has access—transparency&lt;/li&gt;&#xD;
		&lt;li&gt;Everyone knows how to use it&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
3a. One-step build&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&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;&#xD;
		&lt;li&gt;They have “Perform Staging” button at bottom of a page with stats on latest commit&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
3b. One-step deploy&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Top of page is deploy log with notes: who, when, what (link to changes)&lt;/li&gt;&#xD;
		&lt;li&gt;Bottom has “I’m feeling lucky!” button to deploy&lt;/li&gt;&#xD;
		&lt;li&gt;Continuous deployment&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;They use Hudson to generate packages which can be deployed by ops&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Small frequent changes make it easier to see what went wrong and recover when needed&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
&#xD;
4. [missed that tag]&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Branching is all about managing bugfixes&lt;/li&gt;&#xD;
		&lt;li&gt;Always ship trunk&lt;/li&gt;&#xD;
		&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;&#xD;
		&lt;li&gt;Makes these open for private beta in production on production hdwe, etc.&lt;/li&gt;&#xD;
		&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;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Tend to fail forward using these and fix the problem.&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
&#xD;
5. Shared metrics&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;You can see mine, I can see yours&lt;/li&gt;&#xD;
		&lt;li&gt;Use ganglia as console&lt;/li&gt;&#xD;
		&lt;li&gt;Devs know where dashboard is, and watch as obsessively as ops&lt;/li&gt;&#xD;
		&lt;li&gt;Includes app-level metrics (which exposes them to Ops)&lt;/li&gt;&#xD;
		&lt;li&gt;(helps drive accountability in both directions in the org—both can see and feel ownership)&lt;/li&gt;&#xD;
		&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;&#xD;
		&lt;li&gt;Show last site deploy info on every page/graph; you can corellate a change in the graph&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
6. &lt;span class="caps"&gt;IRC&lt;/span&gt; and IM bots&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Heavy &lt;span class="caps"&gt;IRC&lt;/span&gt; users for ongoing dialog between dev/ops, remote/local&lt;/li&gt;&#xD;
		&lt;li&gt;Last.fm wrote a tool to inject events into &lt;span class="caps"&gt;IRC&lt;/span&gt; (monitoring, events, deployments, builds)&lt;/li&gt;&#xD;
		&lt;li&gt;Log it all and put it in a search engine&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Culture&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;All the tools in the world won’t help if you have a contentious culture&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
&#xD;
1. Respect&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;No stereotypes: not all devs are lazy/cowboys, not all ops are obstructive&lt;/li&gt;&#xD;
		&lt;li&gt;respect their expertise and opinions &lt;strong&gt;and&lt;/strong&gt; responsibilities (they influence priorities)&lt;/li&gt;&#xD;
		&lt;li&gt;Don’t just say “no”—it’s like saying “I don’t care about your problem/perspective” &lt;/li&gt;&#xD;
		&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;&#xD;
		&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;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
Talk about the impact of your code push&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;What metrics change&lt;/li&gt;&#xD;
		&lt;li&gt;what are the risks&lt;/li&gt;&#xD;
		&lt;li&gt;what are the symptoms of somethign going wrong&lt;/li&gt;&#xD;
		&lt;li&gt;what are the contingencies (rollback)&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
2. Trust&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&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;&#xD;
		&lt;li&gt;“I don’t want to tell X …” == you’re a cowboy, and “cowboys are losers” &lt;/li&gt;&#xD;
		&lt;li&gt;Have shared playbooks and contingency plans so all understand.&lt;/li&gt;&#xD;
		&lt;li&gt;Provide as many knobs and levers as you can so Ops can tweak to match the env&lt;/li&gt;&#xD;
		&lt;li&gt;Ops: be transparent, give devs insight and access to the systems. Playing telephone around shell commands is dumb.&lt;/li&gt;&#xD;
		&lt;li&gt;It’s hard to help if you can’t directly see&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
3. Have a healthy attitude around failure—it’s going to happen.&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;Think about how you’ll respond more than you think about how you’ll prevent it&lt;/li&gt;&#xD;
		&lt;li&gt;Would you rather be treated by a GP who deals with heart attacks infrequently or an &lt;span class="caps"&gt;EMT&lt;/span&gt; who handles them weekly?&lt;/li&gt;&#xD;
		&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;&#xD;
	&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
&#xD;
&#xD;
4. Avoiding blame&#xD;
	&lt;/p&gt;&lt;ul&gt;&#xD;
	&lt;li&gt;they have a rule of no-finger-pointing; it doesn’t need enforcement, folks step up&lt;/li&gt;&#xD;
		&lt;li&gt;fixing blame wastes a ton of time, why not skip it? Feel guilty afterwards if you must.&lt;/li&gt;&#xD;
		&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;&#xD;
		&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;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&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;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=FwBB8lNJSMU:zGxPIjYxa9w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=FwBB8lNJSMU:zGxPIjYxa9w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=FwBB8lNJSMU:zGxPIjYxa9w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=FwBB8lNJSMU:zGxPIjYxa9w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/FwBB8lNJSMU" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/06/liveblog-10-deploys-a-day-dev-and-ops-at-flickr.html</feedburner:origLink></entry>
    <entry>
        <title>LiveBlog: Q&amp;A with Twitter's John Adams</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/LewU_kEtVF4/liveblog-qa-with-twitters-john-adams.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=68418111" title="LiveBlog: Q&amp;A with Twitter's John Adams" />
        <id>tag:typepad.com,2003:post-68418111</id>
        <published>2009-06-23T13:28:57-07:00</published>
        <updated>2009-06-23T20:28:57Z</updated>
        <summary type="html">A short pre-lunch session to absorb a few moment: John Adams (Twitter) Q&amp;A Q: How do you log all the info from your APIs? A: syslog, looking at scribe, generally summarize and toss Q: How do you control abusive clients?...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;A short pre-lunch session to absorb a few moment:&#xD;
&#xD;
&lt;/p&gt;&lt;p&gt;John Adams (Twitter) Q&amp;amp;A&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Q: How does your on-call team work?&#xD;
&lt;br&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Q: Carry a real pager? &lt;/p&gt;&lt;p&gt;A: Some, mostly &lt;span class="caps"&gt;SMS&lt;/span&gt;. There are escalations if you don’t answer. Always someone from Ops and Eng on the pager chain.&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=LewU_kEtVF4:p1oTNRsz5uc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=LewU_kEtVF4:p1oTNRsz5uc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=LewU_kEtVF4:p1oTNRsz5uc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=LewU_kEtVF4:p1oTNRsz5uc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/LewU_kEtVF4" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/06/liveblog-qa-with-twitters-john-adams.html</feedburner:origLink></entry>
    <entry>
        <title>LiveBlog: PageSpeed</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/kcPYvUfym1g/liveblog-pagespeed.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=68417771" title="LiveBlog: PageSpeed" />
        <id>tag:typepad.com,2003:post-68417771</id>
        <published>2009-06-23T13:19:27-07:00</published>
        <updated>2009-06-23T20:19:27Z</updated>
        <summary type="html">Bryan McQuade (Google), Richard Rabbat (Google, Inc.) What’s Page Speed FF/Firebug addon http://code.google.com/p/page-speed Optimizes images, minifies JS, tells you what you should defer 100K downloads in 10 days, 1000s of tweets, 100s of blog postings How’d it start wanted to...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Bryan McQuade (Google), Richard Rabbat (Google, Inc.)&lt;/p&gt;&#xD;
&#xD;
&#xD;
What’s Page Speed&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;FF/Firebug addon&lt;/li&gt;&#xD;
		&lt;li&gt;http://code.google.com/p/page-speed&lt;/li&gt;&#xD;
		&lt;li&gt;Optimizes images, minifies JS, tells you what you should defer&lt;/li&gt;&#xD;
		&lt;li&gt;100K downloads in 10 days, 1000s of tweets, 100s of blog postings&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
How’d it start&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;wanted to help stop relearning lessons in new apps&lt;/li&gt;&#xD;
		&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 &lt;span class="caps"&gt;URL&lt;/span&gt;; removing it gave huge boost in perf, huge reduction in requests&lt;/li&gt;&#xD;
		&lt;li&gt;Sourced from many smart people on the web&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
Defer loading JS as much as possible&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;Rule looks to see what’s not been invoked before OnLoad completes&lt;/li&gt;&#xD;
		&lt;li&gt;Not enabled by default, has perf hit&lt;/li&gt;&#xD;
		&lt;li&gt;Load multiple times in multiple scenarios; some JS is triggered in different&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Inefficient &lt;span class="caps"&gt;CSS&lt;/span&gt; Selectors: based on David Hyatt’s post on inefficient selectors&lt;/p&gt;&#xD;
&#xD;
&#xD;
Activity Panel&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;Show where most time is spent, where you should focus optimization&lt;/li&gt;&#xD;
		&lt;li&gt;Shows &lt;span class="caps"&gt;DNS&lt;/span&gt;, network, connection, latency, data available for use, JS parse/exec, cache hits&lt;/li&gt;&#xD;
		&lt;li&gt;Coming: paint events, screen snapshotting&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;&lt;span class="caps"&gt;BBC&lt;/span&gt; “has lots of room for optimization” &#xD;
gmail waterfall is hugely vertical!&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Just released &lt;span class="caps"&gt;FF3&lt;/span&gt;.5 compatible version&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=kcPYvUfym1g:Wo2_Rz46_Cw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=kcPYvUfym1g:Wo2_Rz46_Cw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=kcPYvUfym1g:Wo2_Rz46_Cw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=kcPYvUfym1g:Wo2_Rz46_Cw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/kcPYvUfym1g" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/06/liveblog-pagespeed.html</feedburner:origLink></entry>
    <entry>
        <title>LiveBlog: 2 Years Later, Loving and Hating the Cloud</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/geekdailyblog/~3/Cm9DRX3Nj0g/liveblog-2-years-later-loving-and-hating-the-cloud.html" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=318602/entry_id=68417663" title="LiveBlog: 2 Years Later, Loving and Hating the Cloud" />
        <id>tag:typepad.com,2003:post-68417663</id>
        <published>2009-06-23T13:16:21-07:00</published>
        <updated>2009-06-23T20:16:21Z</updated>
        <summary type="html">More from Velocity 2009 Justin Huff, Picknik (online photo editor) Used AWS for 2 years, 1.5 in production Hybrid app: small cage in Seattle + EC2/S3 for some parts of infra Gives flexibility Picnik has a spiky profile based on...</summary>
        <author>
            <name>Jim Meyer</name>
        </author>

    <content type="html" xml:lang="en-US" xml:base="http://blog.geekdaily.org/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;More from Velocity 2009&#xD;
&#xD;
&lt;p&gt;Justin Huff, Picknik (online photo editor)&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Used &lt;span class="caps"&gt;AWS&lt;/span&gt; for 2 years, 1.5 in production&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Hybrid app: small cage in Seattle + &lt;span class="caps"&gt;EC2&lt;/span&gt;/S3 for some parts of infra&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Gives flexibility&lt;/p&gt;&#xD;
&#xD;
&#xD;
Picnik has a spiky profile based on usage; &lt;span class="caps"&gt;EC2&lt;/span&gt; allows to cover that&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;They use a lot of&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
Capacity management (not planning)&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;easily repurpose between webserver and asynch jobs&lt;/li&gt;&#xD;
		&lt;li&gt;Can buy hardware in batches, grow logically, get better deals&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;At one point had nearly 1B objects in S3&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;1. Move old files to S3&#xD;
2. Put some new files to S3&#xD;
3. Put a lot more out there  (had a knob to adjust, eventually reached S3)&#xD;
4. Profit? Not so much ..&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Most S3 objs short lived, needed fast deletion, and mostly didn’t have it&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&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;&#xD;
&#xD;
&#xD;
	&lt;p&gt;They have 1.5 ops people.&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;“At some point we started getting free airline tickets from FF mileage on &lt;span class="caps"&gt;AWS CC&lt;/span&gt;”&lt;/p&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Non-cloud apps have predictable, controllable latency, etc. Not so much in the cloud.&lt;/p&gt;&#xD;
&#xD;
&#xD;
Be ready for fail&#xD;
	&lt;ul&gt;&#xD;
	&lt;li&gt;What if &lt;span class="caps"&gt;EC2&lt;/span&gt; goes down? Have a knob for how much to go offline/reduce services&lt;/li&gt;&#xD;
		&lt;li&gt;Be ready for hard debugging: lots of visibility/instrumentation&lt;/li&gt;&#xD;
	&lt;/ul&gt;&#xD;
&#xD;
&#xD;
	&lt;p&gt;Mostly, though, clouds help you ignore problems … until you can’t.&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=Cm9DRX3Nj0g:w5oNHHF-fJw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=Cm9DRX3Nj0g:w5oNHHF-fJw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/geekdailyblog?a=Cm9DRX3Nj0g:w5oNHHF-fJw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/geekdailyblog?i=Cm9DRX3Nj0g:w5oNHHF-fJw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekdailyblog/~4/Cm9DRX3Nj0g" height="1" width="1"/&gt;</content>



    <feedburner:origLink>http://blog.geekdaily.org/2009/06/liveblog-2-years-later-loving-and-hating-the-cloud.html</feedburner:origLink></entry>

</feed><!-- ph=1 --><!-- nhm:from_kauri -->
