<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[christianchristensen.github.com]]></title>
  <link href="https://imetchrischris.com/atom.xml" rel="self"/>
  <link href="https://imetchrischris.com/"/>
  <updated>2021-11-29T05:06:40+00:00</updated>
  <id>https://imetchrischris.com/</id>
  <author>
    <name><![CDATA[]]></name>
    
  </author>
  <generator uri="http://imetchrischris.com">i met chris chris</generator>

  
  <entry>
    <title type="html"><![CDATA[GFLT100 fiber jack investigation]]></title>
    <link href="https://imetchrischris.com/GFLT100.html"/>
    <updated>2014-12-29T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/GFLT100</id>
    <content type="html"><![CDATA[<p>As a fairly recent <a href="https://fiber.google.com">Google fiber</a> subscriber I’ve been very pleased with the service. I wanted to learn a little more how it worked and what kind-of stats might be available from the in-home equipment.</p>

<p><a href="https://plus.google.com/106480585690020700271/posts/ArwPM9Abary"><img src="/images/2014-12-29-GFLT100/IMG_1654.JPG" alt="Exterior install" /></a></p>

<p><a href="https://plus.google.com/106480585690020700271/posts/VgLuEetgvWr"><img src="/images/2014-12-29-GFLT100/37478380.png" alt="Streaming, connectivity, and general *fast* internet" /></a></p>

<p>The physical setup is much like as you might expect if you’ve ever setup a DSL modem or cable modem + a residential router. Gigaom has a nice rundown @ <a href="https://gigaom.com/2012/08/01/google-fiber-check-out-the-in-home-set-up-and-equipment/">Google Fiber: Check out the in-home set up and equipment</a>. Namely I wanted to focus on any stats available from where the physical fiber turned into an Ethernet port. This is known as the <a href="https://support.google.com/fiber/answer/2732230?hl=en">Fiber Jack</a>, I have the model <a href="https://support.google.com/fiber/answer/2667494">GFLT100</a> which is also known as an <a href="http://en.wikipedia.org/wiki/Network_interface_device">Optical Network Terminal or ONT</a>.</p>

<p>A little searching reveals that it’s likely Google is <a href="https://web.archive.org/web/20131018093721/http://matthewstone.net/2013/01/how-i-know-google-fiber-uses-gpon/">using</a> <a href="http://networkmatter.com/2014/02/27/google-fibers-brewing-little-secret-exposed-its-gpon/">Gigabit-capable Passive Optical Networks</a> (<a href="http://en.wikipedia.org/wiki/Passive_optical_network">GPON</a>). There’s a particularly interesting paper: <a href="http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/36936.pdf">FTTH Look Ahead - Technologies &amp; Architectures</a>.</p>

<p>Off the GFLT100 information page there’s a link to the <a href="https://code.google.com/p/gfiber/">Google Fiber Open Source Components</a>, specifically the <a href="https://code.google.com/p/gfiber-gflt100/">Open source code for the Google Fiber GFLT100</a> (which is what Matthew Stone notes in his article points to all the GPON source additions).</p>

<p>My goal is to collect some statistics from the device itself (and to understand what it’s running). The next natural thing to do is <a href="https://plus.google.com/106480585690020700271/posts/TZdzbFZbprM">start investigating the device itself</a>:</p>

<p><img src="/images/2014-12-29-GFLT100/IMG_2886.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2890.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2891.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2892.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2893.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2894.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2896.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2904.JPG" alt="teardown snapshot" />
<img src="/images/2014-12-29-GFLT100/IMG_2906.JPG" alt="teardown snapshot" /></p>

<p>Unfortunately the chips themselves are covered (rather cleverly) by heat-sinks, so looking up the internals of this little device require a little more investigation…</p>

<p>(Thanks to Google for a pretty amazing service.)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Midwest.io 2014]]></title>
    <link href="https://imetchrischris.com/Midwest_io.html"/>
    <updated>2014-07-16T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/Midwest_io</id>
    <content type="html"><![CDATA[<p>Here’s a recap of my experience at <a href="http://www.midwest.io">Midwest.io</a>: an eclectic collection of talks covering the latest trends, best practices, and research in the field of computing.</p>

<ul>
  <li><a href="https://www.youtube.com/user/midwestio">Videos</a></li>
  <li>Conversation archive / slide refs: <a href="https://twitter.com/search?f=realtime&amp;q=midwestio">Twitter feed</a></li>
</ul>

<p>There were many great talks, I highly recommend catching some (or all) of the videos!</p>

<h4 id="mission-critical-innovation">Mission Critical Innovation</h4>

<p>Dr. Jeff Norris Gave a visually compelling story of innovation and what it means to him. This talk was more a TED style, but worth seeing particularly because of his visual story telling. It’s a bit difficult to explain, but very-much worth seeing as the augmented reality presentation style alone is technically compelling.</p>

<p><img src="/images/2014-07-16-Midwest_io/BsgwD_JCMAAt-jA.jpg" alt="488693406190026752" /></p>

<p>“Reflect with me: We launched the tallest building in Florida into space!”</p>

<h4 id="adding-static-type-checking-to-a-dynamic-language-julia">Adding Static Type Checking to a Dynamic Language (Julia)</h4>

<p>Leah Hanson gave a really interesting explanation of time and space complexity on a simple type inference in a loop as well as nice debugging tools available in the Julia language. This was a particularly enlightening take on dynamic language performance pitfalls that aren’t necessarily readily obvious in usage.</p>

<ul>
  <li>http://julialang.org</li>
  <li>Notable deep-dive https://github.com/JuliaLang/julia/issues/5927</li>
</ul>

<h4 id="simplifying-big-data-with-apache-crunch">Simplifying Big Data with Apache Crunch</h4>

<p>Micah Whitacre shared how using Apache Crunch can help with better defining MapReduce pipelines; with the goal to make them easier to write, more testable, and efficient. It’s worth taking a glance at his breakdown of an example workflow and mapping the components with Crunch.</p>

<h4 id="keeping-your-edge-by-deploying-faster">Keeping Your Edge by Deploying Faster</h4>

<p>Hudl shared their deployment changes that have resulted in faster deploys and greater application stability. A couple of great takeaways were: start doing some research when you’re feeling lost; this ultimately resulted in their use of many Netflix components (using them as a guide). Importance of key performance indicators (KPIs) to benchmark themselves with the changes they implemented (the largest of which was the number of deploys per day and the number of hot-fixes). Also the structure of teams that map to service oriented components, which allowed them to lean on using components both technically and culturally.</p>

<ul>
  <li><a href="https://github.com/Netflix/Hystrix">Netflix/Hystrix</a> - Control of failure and latency in distributed environments
    <ul>
      <li><a href="https://github.com/hudl/Mjolnir">hudl/Mjolnir</a></li>
    </ul>
  </li>
  <li>Routing: Eureka metadata routes (spark plug, nginx; not public - yet)</li>
</ul>

<h4 id="erlang-or-how-i-learned-to-stop-worrying-and-let-things-fail">Erlang, or How I Learned to Stop Worrying and Let Things Fail</h4>

<p>Basho / Riak’s John Daily: “We talk about reusable code, but we almost never talk about rebootable code. … Failure management shouldn’t be an add-on.” Erlang is designed for failure, speed, and has very small processes. “Network transparency: the machine boundary is an ugly place… Async”</p>

<p>Erlang resources: https://gist.github.com/macintux/6349828</p>

<h4 id="mythbashers-adventures-in-overlooked-technologies">MythBashers: Adventures in Overlooked Technologies</h4>

<p>Avdi Grimm, of Ruby Rogues and Ruby Tapas, gave an overview of diving into a Mythbusters style attack on the hypothesis: “is <code class="language-plaintext highlighter-rouge">bash</code> web scale?”. Obviously quite a bit of humor and somewhat of a wild-goose-chase in technology; but, the takeaway: “Outlier knowledge - comes from asking outlier questions”. Also the discovery of some new commands, for example: <code class="language-plaintext highlighter-rouge">coproc</code>, <code class="language-plaintext highlighter-rouge">stdbuf</code>, <code class="language-plaintext highlighter-rouge">mitmproxy</code>.</p>

<p><img src="/images/2014-07-16-Midwest_io/BsiPrLpIMAAXJ7a.jpg" alt="488798532481343488" /></p>

<h4 id="robots-javascript-and-drones-welcome-to-the-hardware-revolution">Robots, JavaScript, and Drones: Welcome to the Hardware Revolution</h4>

<p>Julia Grace from Tindie gave a nice overview and opinions of the state of hobbyist hardware. Particularly noting: “2014 is the 50th anniversary of BASIC… There’s an analog to hardware <em>right now</em>”, i.e. hardware is accessible, usable, and manipulatable by the layman.</p>

<p><img src="/images/2014-07-16-Midwest_io/Bsl3xEIIcAAdgkK.jpg" alt="489053720286863360" /></p>

<h4 id="rules-as-a-control-structure">Rules as a Control Structure</h4>

<p>Ryan Brush gave a great architecture vs. engineering analogy of blueprint:floor-plan::code:(projection) flow-chart. Noting that we can provide more “live” documentation that assists stakeholders without having to be experts in the underlying components.</p>

<h4 id="data-science--building-a-production-machine-learning-infrastructure">Data science / Building a Production Machine Learning Infrastructure</h4>

<p>Josh Wills shared some experiences of working with machine learning at Google and his opinions of what it takes to have an operationally useful environment. Good guiding principle: “any same thing, but faster is always good”.</p>

<p>Prerequisite for industrial machine learning:</p>

<ul>
  <li>Logging</li>
  <li>Monitoring (to see the change in KPIs)</li>
  <li>Feature flags (to tune to control KPIs)</li>
</ul>

<p>Industry examples:</p>

<ul>
  <li><a href="http://nerds.airbnb.com/architecting-machine-learning-system-risk">Airbnb</a></li>
  <li><a href="http://codeascraft.com/2014/06/18/conjecture-scalable-machine-learning-in-hadoop-with-scalding">Conjecture at Etsy</a></li>
</ul>

<p>Themes:</p>

<ul>
  <li>Simple key value pairs</li>
  <li>Operational lang vs analytical lang (e.g. SciPy vs. Java)</li>
</ul>

<p><img src="/images/2014-07-16-Midwest_io/BsmT0QvCcAMemUX.jpg" alt="489084562543476736" /></p>

<h4 id="time-series-data-with-apache-cassandra">Time-series data with Apache Cassandra</h4>

<p>Patrick McFadin gave an entertaining and technical overview of storing time-series data in Cassandra. <a href="http://www.xaprb.com/blog/2014/06/08/time-series-database-requirements">Time series database requirements</a> - Baron Schwartz (of High Perf. MySQL) - good basis for needs. Interesting tidbit: Cassandras use of TimeUUID (UUID sortable by time) - v1 UUID.</p>

<h4 id="chef--packing-it-in-images-containers-and-config-management">Chef / Packing It In: Images, Containers, and Config Management</h4>

<p>Michael Goetz overviewed a workflow building VMs from scratch and using containers (with Docker) to speed up deployment and get a handle on deployed/configured environments. Obviously using Chef as the configuration management tool, but also noting the physical/time constants like always building from scratch can be very time consuming. This also introduces the concept of convergence (coming into alignment) vs congruence (rebuilding from scratch).</p>

<p>Hallway-track takeaways:</p>

<ul>
  <li>Chef-zero should replace chef-solo (local mode server)</li>
  <li>Chef-metal will eventually have PXE boot</li>
</ul>

<h4 id="mobile-ad-hoc-networks-manet-are-coming-but-we-arent-ready">Mobile Ad Hoc Networks (MANET) Are Coming, But We Aren’t Ready</h4>

<p>Justin Collins shared his views and opinions in the exploration of MANETs and what technologies we’d need to support the next “killer-app” in this space. This was an interesting introduction into technologies that are emerging and necessary, particular in mobile, computing; also notable: peer-to-peer and Delay-tolerant networking (DTN).</p>

<ul>
  <li>https://github.com/presidentbeef/melon</li>
  <li>http://tools.ietf.org/html/rfc2501</li>
  <li>Color audience commentary: FireChat</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SouthEast LinuxFest 2014]]></title>
    <link href="https://imetchrischris.com/SELF2014.html"/>
    <updated>2014-06-22T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/SELF2014</id>
    <content type="html"><![CDATA[<p><a href="http://www.southeastlinuxfest.org">SouthEast LinuxFest 2014</a>, Videos: https://www.youtube.com/user/southeastlinuxfest
Nice recap by Jupiter Broadcasting (~@42 min): http://www.jupiterbroadcasting.com/60412/southeast-linuxfest-highlights-las-318</p>

<h3 id="sqlite-as-an-application-file-format---richard-hipp">SQLite as an Application File Format - Richard Hipp</h3>

<ul>
  <li>“Representation Is the Essence of Programming” -Frederick Brooks (Mythical Man Month)</li>
  <li><a href="http://www.sqlite.org/whentouse.html">“SQLite is not designed to replace Oracle. It is designed to replace fopen().”</a></li>
  <li><a href="http://media-cache-ec0.pinimg.com/originals/c9/6e/db/c96edb1f57ceff741f1d5501717e39bc.jpg">“Data lasts longer than code.”</a></li>
</ul>

<p>Side notes:</p>

<ul>
  <li><a href="http://sqlite.org/sqlar/doc/trunk/README.md">SQLite Archiver</a></li>
  <li><a href="http://www.fossil-scm.org">Fossil SCM</a> - very similar to Git in concept (distributed VCS), but keeps everything in one SQLite file. Also, only a single binary that supports built-in wiki, issue tracking, and basic GUI functions. Ultimately it allows for some some nice semantics like: <code class="language-plaintext highlighter-rouge">SELECT DISTINCT name FROM users;</code> (rather than shell ginsu).</li>
</ul>

<h3 id="slackware-ragchew---david-cantrell">Slackware ragchew - David Cantrell</h3>

<p>(http://www.slackware.com, http://www.burdell.org)</p>

<ul>
  <li>Still alive and an impressive South-East Linux sub-culture.</li>
  <li>Fascinating history and interaction during the Linux “boom” (many trade shows!) with Sun, FreeBSD, and ultimately <a href="http://en.wikipedia.org/wiki/Walnut_Creek_CDROM">Walnut Creek CDROM</a> (later BDSi, then Wind River Systems, then iXsystems)</li>
  <li>Slackware was the first “live boot” (see also zipslack)</li>
  <li>Version control regrets – would have been great to see the evolution, but it’s lost.</li>
  <li>Suse - dev’s mail spool file made it onto a distro release (wild west of builds and Linux)</li>
  <li>As a community we could do better… packaging is a great example (every distro has their own)</li>
  <li>Hallway track: awesome history of <a href="http://en.wikipedia.org/wiki/Tz_database">tz database</a> (note: this was needed for his own distro as glibc? stopped pulling in the latest for static builds, which required distros to manage the dependency) - “Time (and timezones) are both technical and political.”</li>
</ul>

<h3 id="pbi-v10-application-management-made-easy---ken-moore">PBI v10: Application Management Made Easy - Ken Moore</h3>

<p>AppCafe</p>

<ul>
  <li>Wiki as data-source for rating system</li>
  <li>runs pkgng through a series of shell scripts and parses the output for the GUI utilities (Qt)</li>
</ul>

<p><a href="http://www.pcbsd.org/en/utilities">PCBSD</a></p>

<ul>
  <li>Modified GRUB to support full disk encryption with ZFS</li>
  <li><a href="http://wiki.pcbsd.org/index.php/Life_Preserver/10.0">Life Preserver</a> takes a snapshot prior to upgrade so that in the instance of a reboot and fail you can rollback.</li>
  <li>Errata: Ken Moore is Kris Moore’s brother, <a href="http://www.bsdnow.tv">BSDNow.tv</a></li>
</ul>

<h3 id="zfs-101---dru-lavigne">ZFS 101 - Dru Lavigne</h3>

<ul>
  <li><a href="https://blogs.oracle.com/video/entry/becoming_a_zfs_ninja">Becoming a ZFS Ninja</a></li>
  <li><a href="http://open-zfs.org/wiki/Events">Open ZFS office hours</a></li>
  <li>Encryption: <a href="http://www.freebsd.org/doc/en/books/handbook/disks-encrypting.html">GELI</a>, <a href="http://www.bsdnow.tv/tutorials/pefs">PEFS</a></li>
  <li>Other
    <ul>
      <li><a href="http://www.slideshare.net/dpavlin/cuc2013-zfs">ZFS (on Linux) - use your disks in best possible ways</a></li>
    </ul>
  </li>
</ul>

<h3 id="other">Other</h3>

<ul>
  <li><a href="https://sparkslinux.wordpress.com/2014/06/16/pgp-keysigning-event-and-cacert-assertion-at-self2014">GPG/CACert KeySigning</a></li>
  <li>Ham radio meetup
    <ul>
      <li><a href="http://freedv.org/tiki-index.php">Freedv</a></li>
      <li><a href="http://www.w1hkj.com/Fldigi.html">Fldigi</a>
        <ul>
          <li><a href="http://www.w1hkj.com/FldigiHelp-3.21/Modes">Digital modes - sights &amp; sounds</a></li>
        </ul>
      </li>
      <li><a href="https://twitter.com/nivex">N8VNR</a></li>
    </ul>
  </li>
  <li>http://agrimmsreality.blogspot.com</li>
  <li>Other talks
    <ul>
      <li>Making Pointers Point - Andrew Psaltis (Basic introduction to pointers in C and memory allocation)</li>
      <li>Trolls arent the only threat under the bridge</li>
      <li>DNSSEC</li>
      <li>Hands on ARMs - Jason Plum
        <ul>
          <li>Open Blocks (4GB ethernet device)</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OAuth: the spec, the dance, and Drupal]]></title>
    <link href="https://imetchrischris.com/DrupalDallas2012_OAuth.html"/>
    <updated>2012-09-10T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/DrupalDallas2012_OAuth</id>
    <content type="html"><![CDATA[<h2 id="presentation-from-the-2012-dallas-drupal-days"><a href="http://www.youtube.com/watch?v=RUylSUkz8o4&amp;feature=player_embedded">Presentation</a> from the <a href="http://dallasdrupal.org/sessions/oauth-spec-dance-and-drupal">2012 Dallas Drupal Days</a></h2>

<iframe width="618" height="463" src="http://www.youtube.com/embed/RUylSUkz8o4" frameborder="0" allowfullscreen=""></iframe>

<h2 id="slides"><a href="http://imetchrischris.com/dallasdrupal2012/">Slides</a></h2>

<script async="" class="speakerdeck-embed" data-id="504fc37c256d9200020295fb" data-ratio="1.6" src="//speakerdeck.com/assets/embed.js"></script>

<p>(Note: the post as follows is identical to the slides)</p>

<hr />

<h2 id="the-web-http10">The Web: HTTP/1.0</h2>

<ul>
  <li>Client &lt;– –&gt; Server</li>
  <li>GET, PUT, POST, DELETE, HEAD, …</li>
  <li>Headers</li>
</ul>

<hr />

<h2 id="auth-experience">Auth experience</h2>

<ul>
  <li><a href="http://en.wikipedia.org/wiki/Basic_access_authentication">HTTP Basic Auth</a> - <a href="http://tools.ietf.org/html/rfc1945#section-10.16">IETF RFC 1945</a>
    <ul>
      <li>Simple!</li>
      <li>Plaintext (SSL can “help”)</li>
      <li>Relys on client/browser authentication popup</li>
    </ul>
  </li>
</ul>

<p>Example with Basic Auth:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -u "username:password" https://www.example.com/special
</code></pre></div></div>

<hr />

<h2 id="auth-experience-1">Auth experience</h2>

<ul>
  <li>Session Auth (cookies) <a href="http://tools.ietf.org/html/rfc6265">IETF RFC 6265</a>
    <ul>
      <li>“free” with most web frameworks</li>
      <li>A session is usually tied to one user account and is normally authorized fully or not.</li>
    </ul>
  </li>
</ul>

<p>Example with cookies holding state through a session:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -c cookiejar.txt https://www.example.com/login
curl -b cookiejar.txt https://www.example.com/special
</code></pre></div></div>

<hr />

<h2 id="auth-experience-2">Auth experience</h2>

<ul>
  <li>OAuth <a href="http://tools.ietf.org/html/rfc5849">IETF RFC 5849</a>
    <ul>
      <li>“Valet key for the web” (limited access OAuth Token)</li>
      <li>Scope access to resources</li>
    </ul>
  </li>
</ul>

<p>Example of a signed OAuth request:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;special signing sauce&gt;
curl -v -H 'Authorization: OAuth
 oauth_consumer_key="zsQpwbL3AGRNV4272Xc8Msi3hxhQWGrS",
 oauth_signature_method="HMAC-SHA1",
 oauth_timestamp="1346887460",
 oauth_nonce="1548267549",
 oauth_version="1.0",
 oauth_token="wvokahqtGMLS5o4AvVvokGZaA9pZjBcW",
 oauth_signature="tvHRw2fLNxYE2FR62EfH6tAfBW4%3D"'
https://www.example.com/special
</code></pre></div></div>

<hr />

<h2 id="so-whats-so-special-about-oauth">So what’s so special about OAuth?</h2>

<p><img src="http://hueniverse.com/wp-content/uploads/2007/12/My-Endpoints.png" alt="Authorization has meaning" /></p>

<hr />

<h2 id="so-whats-so-special-about-oauth-1">So what’s so special about OAuth?</h2>

<ul>
  <li>Each <strong>client</strong> is assigned <strong>credentials</strong> granted by a <strong>resource owner</strong> to access a <strong>protected resource</strong> on a <strong>server</strong>
    <ul>
      <li>Note: Client &lt;– (stuff) –&gt; Server</li>
      <li>Therefore the credentials granted to a <em>specific client</em> can be <em>managed/revoked</em> by the resource owner.</li>
    </ul>
  </li>
  <li>An endpoint(s)/HTTP resource(s) can be <strong>scoped</strong> (to limit its functionality)
    <ul>
      <li>“I give you (Ms. client) access to my API, but read only.”</li>
      <li>“Access all of my public data (Mr. client)”</li>
      <li>“(Mrs. Client) Is requesting access you your bank account, allow?”</li>
    </ul>
  </li>
</ul>

<hr />

<h1 id="halt">Halt!</h1>

<p>What about that guy on the internet (<a href="http://hueniverse.com/oauth/">Eran Hammer</a>) that was like “OAuth 2.0 sucks” <strong>!!rage quit!!</strong> ?!!</p>

<p>Agree or disgree … most importantly: he’s an expert and is prosthelytizing great information - <strong>Listen to him!</strong> (and read carefully)</p>

<p><strong>The takeaway:</strong> dont throw the baby out with the bathwater and his commentary is directed at the 2.0 <em>draft</em></p>

<hr />

<h1 id="lets-dance">Let’s Dance</h1>

<p><img src="http://f.cl.ly/items/2f1T0o283F2T1B1a3V0Y/footlose1_i270x270.jpg" alt="Footloose dance" /></p>

<hr />

<h2 id="what-oauth-looks-like">What OAuth looks like</h2>

<p><img src="http://f.cl.ly/items/1d2i1g2R3S2L3b2b2X3O/20120906001549.png" alt="Facebook" />
<img src="http://f.cl.ly/items/031j2u1K1b2P1i1e3u1G/20120906001612.png" alt="Twitter" />
<img src="http://f.cl.ly/items/2A2F3P2I1D3p0T2E390d/20120906001808.png" alt="AllPlayers" /></p>

<hr />

<h2 id="what-oauth-looks-like-protocol-workflow">What OAuth looks like: <a href="http://hueniverse.com/oauth/guide/workflow/">Protocol workflow</a></h2>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen1.png" alt="faji: photo gallery site" /></p>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen2.png" alt="beppa: photo printing site" /></p>

<hr />

<h2 id="what-oauth-looks-like-protocol-workflow-1">What OAuth looks like: <a href="http://hueniverse.com/oauth/guide/workflow/">Protocol workflow</a></h2>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/12/flow2grfc.png" alt="Access faji from beppa's site" /></p>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen3.png" alt="Redirection to get access on faji" /></p>

<hr />

<h2 id="what-oauth-looks-like-protocol-workflow-2">What OAuth looks like: <a href="http://hueniverse.com/oauth/guide/workflow/">Protocol workflow</a></h2>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen4.png" alt="Approve/Authorize faji to give tokens to beppa to access as you" /></p>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen5.png" alt="Redirect to Beppa" /></p>

<hr />

<h2 id="what-oauth-looks-like-protocol-workflow-3">What OAuth looks like: <a href="http://hueniverse.com/oauth/guide/workflow/">Protocol workflow</a></h2>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/12/flow3grfc.png" alt="Ask again using temp tokens and get real live access tokens" /></p>

<p><img src="http://hueniverse.com/wp-content/uploads/2009/09/screen6.png" alt="Request from the API with real live access tokens" /></p>

<hr />

<h2 id="technical-pieces">Technical pieces</h2>

<h3 id="terminology"><a href="http://tools.ietf.org/html/rfc5849#section-1.1">Terminology</a></h3>

<ul>
  <li>Consumer:  client</li>
  <li>Service Provider:  server</li>
  <li>User:  resource owner</li>
  <li>Consumer Key and Secret:  client credentials</li>
  <li>Request Token and Secret:  temporary credentials</li>
  <li>Access Token and Secret:  token credentials</li>
</ul>

<h3 id="url-patterns">URL pattern(s)</h3>

<p>(Related to protocol workflow)</p>

<ul>
  <li>https://provider.example.net/{initiate,request_token} (Temporary Credential Request)</li>
  <li>https://provider.example.net/authorize (Resource Owner Authorization URI)</li>
  <li>https://provider.example.net/{token,access_token} (Token Request UR)</li>
  <li>http://consumer.example.com/{oauth_redirect,ready,…}</li>
</ul>

<p>(Ref: URL patterns for <a href="https://dev.twitter.com/">Twitter</a>, <a href="http://develop.allplayers.com/oauth.html">AllPlayers.com</a>)</p>

<hr />

<h2 id="refs">Refs</h2>

<ul>
  <li>http://tools.ietf.org/html/rfc1945#section-10.16 / http://en.wikipedia.org/wiki/Basic_access_authentication</li>
  <li>http://tools.ietf.org/html/rfc6265 / http://en.wikipedia.org/wiki/HTTP_cookie</li>
  <li>http://tools.ietf.org/html/rfc5849 / http://en.wikipedia.org/wiki/OAuth</li>
  <li><a href="http://oauthchecklist.org/">OAuth Checklist</a></li>
  <li><a href="https://gist.github.com/1595718">Build out and scratch pad notes</a></li>
  <li><a href="http://www.youtube.com/watch?v=3QnD2c4Xovk&amp;feature=related">Public Key Cryptography: Diffie-Hellman Key Exchange</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rollin like a pro]]></title>
    <link href="https://imetchrischris.com/puppet_cloudinit_puppi.html"/>
    <updated>2012-09-03T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/puppet_cloudinit_puppi</id>
    <content type="html"><![CDATA[<p>I have recently been on a bit of a devops journey in an attempt to optimize for happiness (and some substantial learning). At <a href="https://allplayers.com">my work</a> we’ve committed to Puppet for a variety of configuration management tasks; ranging from in office infrastructure, to developer sandboxes, to our production application. Given the recent opportunity to work on a project a bit out of band from our main application(s) I was in a mode to seek out configuration management and deployment on par with process like {heroku, appfog, phpfog, etc…}. It turns out this magic is only a few scripts and some discipline away!</p>

<h2 id="enter-cloudinit--puppet-git-receiver--puppi">Enter CloudInit + Puppet Git Receiver + Puppi</h2>

<h3 id="puppet-git-receiver"><a href="http://brightbox.com/blog/2012/08/29/puppet-git-receiver/">Puppet Git Receiver</a></h3>

<p>I believe the most “magical” aspect of any of the PaaS offerings is the ability to push code+infrastructure changes (IMO the best being with git) to a remote server. The Puppet git reciever has to be one of the cleanest and well thought out implementations of what is essentially a fancy post-recieve git hook.</p>

<p>What makes this so great, besides the really clean and well thought out code to deploy reasonably complex servers with Puppet, is the simple deb package install that basically configures a git repo, with hook scripts, and configured users.</p>

<h3 id="cloudinit"><a href="https://help.ubuntu.com/community/CloudInit">CloudInit</a></h3>

<p>CloudInit is a nice tool that makes this whole process quite seamless. Basically CloudInit allows you to specify a set of scripts (and Ubuntu specific commands) to run at the VM creation; effectively letting you bootstrap a machine <em>exactly</em> the way you want it. (This is a little additional help that traditionally lives as process step to login to a new machine and “get it going”)</p>

<p>At this point with CloudInit + Puppet git reciever - you can now have a “blank” server ready to recieve whatever infrastructure defined by Puppet. This leaves your application code, which is addressed by … (read on)</p>

<h3 id="puppi"><a href="https://github.com/example42/puppi">Puppi</a></h3>

<p>I’m curious if this Puppet module should actually be called Puppet-Deploy, because <a href="http://www.example42.com/?q=Puppi_A_Puppet_module_for_Deployment_Automation">that’s what it does</a>! (along with some additional sysadmin helper tools too) By <a href="https://github.com/example42/puppi/blob/master/README.deploy">specifying a few simple instructions</a> this module configures and stages everything for your app to run on our accompanying infrastructure.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class myapp {
  puppi::project::git { "myapp":
    source      =&gt; "https://github.com/../myapp.git",
    deploy_root =&gt; "/srv/myapp",
  }
}
</code></pre></div></div>

<p>Simply run: <code class="language-plaintext highlighter-rouge">puppi deploy myapp</code> on the target server (noteworthy: this can be scripted a variety of ways: with Puppet, via SSH, etc…).</p>

<p><img src="/images/Seinfeld-ToeDance.gif" alt="Happy Dance" /></p>

<h2 id="but-wait-theres-more">But wait! There’s more!</h2>

<p>Given that we’re already building out a server and deploying our app with super-simple-commands, why not make it easier? Yeah lets do that! Check out <a href="https://github.com/rodjek/librarian-puppet">librarian-puppet</a> a tool to manage Puppet module dependencies similar to how Bundler, Composer, and the like. This let’s us specify a <code class="language-plaintext highlighter-rouge">Puppetfile</code> in our infrastructure repo that defines all the “common” modules we will be using - making a <strong>very</strong> clear the line between libraries and the “working set” (and avoiding those pesky submodules). Bonus points to letting the <a href="https://github.com/brightbox/puppet-git-receiver/pull/11">post recieve hooks</a> auto build the Puppetfile! This can lead to some pretty simple <a href="https://github.com/christianchristensen/puppet-php-quick-start">infrastructure+app definitions</a>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>├── Puppetfile
├── README.md
├── manifests
│   └── site.yml
└── modules
    ├── imapnote
    │   └── manifests
    │       └── init.pp
    └── mysites
        └── manifests
            └── init.pp
</code></pre></div></div>

<p>(Brought to you by: Labor Day Weekend Research Group™)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drush tips and tricks + make, dl, .info inject]]></title>
    <link href="https://imetchrischris.com/drush-notes.html"/>
    <updated>2012-03-01T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/drush-notes</id>
    <content type="html"><![CDATA[<article class="markdown-body"><p>Did some testing with drush tonight and have some tips:</p>

<p><a href="http://drupal.org/project/drush">http://drupal.org/project/drush</a> project has nice pear install info:
(note: may need to sudo)</p>

<pre><code>pear channel-discover pear.drush.org
pear install drush/drush-5.0.0 # note: there may be some instability, but seems ok
</code></pre>

<p>(note: drush-5.0.0 has the --gitinfofile which injects version into .info)</p>
<!-- more -->

<p><a href="http://drupalcode.org/project/drush.git/blob/refs/heads/master:/README.txt#l79">Drush bash completion</a> is probably a handy tool for sbox CLI: <a href="http://drupalcode.org/project/drush.git/blob/refs/heads/master:/drush.complete.sh">http://drupalcode.org/project/drush.git/blob/refs/heads/master:/drush.complete.sh</a>
namely: sourcing the bash completion script e.g.: <code>. /usr/share/php/drush/drush.complete.sh</code>
(this provides tab completion for drush commands)</p>

<p>Drush5 provides an injection to the .info file; an example use of this would be:
<code>drush dl --package-handler=git_drupalorg --gitinfofile uuid</code>
(note: the --gitinfofile parameter)</p>

<p>(running <strong>.info inject</strong> by default)
Using the drushrc.php (a file to specify specific specific drush options in a config file...) we can ensure that <code>gitinfofile</code> is enabled by default:
<code>$command_specific['pm-download'] = array('gitinfofile' =&gt; TRUE);</code>
(note: unfortunately drush_make doesn't respect the <code>drush dl</code> paradigm ... drush 5 this will be the preferred method)
(note: to get drush to continue reading my rc file I had to do: <code>drush -c ~/.drush/drushrc.php make example.make www</code>)
(tip: to see what is happening with the actual drush commands use debug/verbose: <code>drush --debug --verbose -c ~/.drush/drushrc.php make example.make www</code>)</p>

<p>We can also have specific <strong>drushrc.php</strong> settings <em>per repo</em> to be fancy:
<a href="http://drupalcode.org/project/drush.git/blob/refs/heads/master:/examples/example.drushrc.php#l8">http://drupalcode.org/project/drush.git/blob/refs/heads/master:/examples/example.drushrc.php#l8</a>
and/or
<a href="http://drupalcode.org/project/drush.git/blob/refs/heads/master:/examples/example.drushrc.php#l332">http://drupalcode.org/project/drush.git/blob/refs/heads/master:/examples/example.drushrc.php#l332</a>
(note: I believe this to be a nice way - and the drush recommended way - to organize our alias' and other drush specific settings.)
(note: to accomplish this I believe minimal setup through Puppet could get things in place - this would be for deployed env. - everything else would have a Readme)</p>

<p>&lt;(soon) deprecated&gt;</p>

<p>For <strong>drush_make .info inject</strong>... (or running drush 4.5)</p>

<pre><code>cd ~/.drush/drush_make/
# http://drupal.org/node/1302820
wget http://drupal.org/files/drush_make_inject_info.patch
patch -p1 &lt; drush_make_inject_info.patch
</code></pre>

<p>&lt;/deprecated&gt;</p></article>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal Camp Austin]]></title>
    <link href="https://imetchrischris.com/drupalcampaustin.html"/>
    <updated>2011-11-20T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/drupalcampaustin</id>
    <content type="html"><![CDATA[<p><a href="https://gist.github.com/1392744">Drupal Camp Austin 2011 (gist)</a></p>

<!-- more -->
<hr />

<div class="wikistyle"><h2>
<a href="http://2011.drupalcampaustin.org/">Drupal Camp Austin 2011</a> - 11/19/2011</h2>

<h2>Responsive design</h2>

<ul>
<li>mediaqueri.es</li>
<li>Progressive CSS</li>
<li>Feature detection (JS - modernize)</li>
<li>front-end reverse proxy ignorance</li>
<li>polyfill... JS shim that makes ie work</li>
<li>mediaquery polyfills

<ul>
<li>respond.JS</li>
<li>adaptjs</li>
</ul>
</li>
<li>Responsive modules

<ul>
<li>respondjs</li>
<li>responsive_images</li>
<li>responder</li>
</ul>
</li>
<li>script loaders

<ul>
<li>modernizer</li>
<li>yepnope</li>
<li>labjs</li>
</ul>
</li>
<li>themes

<ul>
<li>adaptivetheme</li>
<li>omega</li>
</ul>
</li>
<li>responsive video: fitvidjs</li>
<li>front end performance

<ul>
<li>~97% perceived response time is front</li>
</ul>
</li>
<li>Responsive images, datauri, ...</li>
<li>jdrop.org</li>
<li>Stevesounders.com/mobileperf</li>
<li>Blaze.io/mobile</li>
</ul><h2>Practical Performance Tuning</h2>

<ul>
<li><a href="http://www.opensourcetesting.org/performance.php">http://www.opensourcetesting.org/performance.php</a></li>
<li>Siege <a href="http://www.joedog.org/index/siege-home">http://www.joedog.org/index/siege-home</a> to intentionally crash servers with multiple concurrent requests to server.</li>
<li>XHProf</li>
<li>Disable varnish, memcached, any cache to clearly distinguish performance issues.</li>
</ul><h2>miscellaneous</h2>

<ul>
<li>psr0 module (may not be autoload compatible)</li>
<li>Composer (package management)</li>
<li>drush make version package injection and drupal modules</li>
<li>worker queue - drupal queue with drush in long running mode to pick up jobs (worker pool) - use reddis for queue (in place of beanstalkd for reporting and queryability) </li>
</ul><h2>Pantheon (David Strauss)</h2>

<ul>
<li>Moved to Chef Solo, no more Bcfg2</li>
<li>Nginx + PHP-FPM</li>
<li>Cassandra? based file system for public/private files (distributed + redundant)

<ul>
<li>Valhalla?</li>
<li>Probably going to move to S3 or Rackspace analog for cheaper rates (redundancy on instance storage is very expensive $1/GB x 3)</li>
</ul>
</li>
<li>SASL API communication</li>
<li>Hidden Jenkins job runner</li>
<li>Running Fedora, primarily for system.d.</li>
</ul><h2>Examiner</h2>

<ul>
<li>use mongodb for storage (no MySQL - motivated by trying to avoid cacheing) </li>
<li>mongodb writes are a bear... they have run out of indexes and are in constant tuning mode for performance</li>
<li>interesting scale problem with 1000x usage spikes - autoscale is difficult</li>
<li>use hadoop for (batched) "live jobs" that need to compute complex royalty rules</li>
</ul><h2>Code Smell (Larry Garfield)</h2>

<ul>
<li>and (ie object_validate_and_save)
*

<ul>
<li>drupal_get_form (retrieve, populate a form0</li>
<li>Solr::addDocuments wraps _documentToXML private method, so you can’t see the object XML without adding to the index.</li>
<li>God objects - classes that do too much</li>
</ul>
</li>
<li> parameters or returns of multiple types

<ul>
<li>throw exceptions</li>
<li>return object or FALSE</li>
<li>_registry_check_code() -&gt; constants, strings, variable types

<ul>
<li>Volunteer to cleanup this function</li>
</ul>
</li>
</ul>
</li>
<li>Overly complex code leads to overly complex bugs.

<ul>
<li>comment_node_view !!!</li>
</ul>
</li>
<li>Run-time type identification

<ul>
<li>Changing keys by object type = bad</li>
<li>Polymorphism (procedural)

<ul>
<li>callback</li>
<li>messy</li>
</ul>
</li>
<li>Polymorphism (OO)

<ul>
<li>method, clear</li>
</ul>
</li>
</ul>
</li>
<li>4 Unit Testing (263)

<ul>
<li>SimpleTest in core are not unit tests unless 1 Drupal = unit

<ul>
<li>This is system testing and is valuable, but not unit testing.</li>
</ul>
</li>
<li>DrupalUnitTestCase (~25)

<ul>
<li>We should be doing more of this, but...</li>
<li>Globals, hooks, etc don’t handle it well</li>
<li>If you can’t unit test your code, your code is wrong.</li>
</ul>
</li>
<li>Avoid globals, avoid statics</li>
<li>Dependency injection, construct objects with what they need, don’t call other API midstream.</li>
<li>Minimize singletons, another form a global.  Hard function calls are a form of singleton.</li>
</ul>
</li>
<li>5 Documentation

<ul>
<li>If you can’t document, you don’t know what you are doing.</li>
<li>If you don’t document, another wont know what you are doing.</li>
<li>Bad documentation:

<ul>
<li>string $jail -&gt; what is jail, what is valid, must define</li>
<li>array $settings -&gt; what goes in settings?</li>
</ul>
</li>
<li>Why things aren’t documented</li>
<li>Lazy -&gt; bad</li>
<li>Indifference -&gt; bad</li>
<li>Lack of comprehension

<ul>
<li>That’s OK, document that! (Here be dragons)</li>
</ul>
</li>
<li>Embarrassment

<ul>
<li>That’s OK, document it!  Very useful.</li>
</ul>
</li>
<li>What to document

<ul>
<li>Every function</li>
<li>Every method</li>
<li>Every class</li>
<li>Every object property</li>
<li>Every constant</li>
<li>Every parameter</li>
</ul>
</li>
<li>drupal.org/node/1354</li>
</ul>
</li>
<li>
<p>6 Inappropriate intamacy</p>

<ul>
<li>coupling

<ul>
<li>content coupling</li>
<li>Common</li>
<li>External</li>
<li>Control</li>
<li>Data-structured</li>
<li>?</li>
<li>?</li>
</ul>
</li>
<li>Otherwise difficult to refactor</li>
<li>Solutions

<ul>
<li>Well documented interfaces</li>
</ul>
</li>
<li>7 Purity</li>
<li>Pure functions always returns the same value given the same input.</li>
<li>Side effects

<ul>
<li>Changes global state, cannot be repeated, etc.</li>
</ul>
</li>
<li>Sometimes side effects are the goal

<ul>
<li>ie save() -&gt; that’s fine, but isolate save()</li>
</ul>
</li>
<li>drupal_theme_initialize()

<ul>
<li>Lot’s of side effects</li>
<li>cleaner approach</li>
<li>class Theme -&gt; more testable</li>
</ul>
</li>
<li>8 Good smells</li>
<li>Single purpose</li>
<li>Self-contained</li>
<li>Predictable</li>
<li>Repeatable</li>
<li>Unit testable</li>
<li>Documented</li>
</ul>
</li>
<li><p>aphorisims-api-design</p></li>
<li><p>coding horror -&gt; code smells</p></li>
<li><p>java -&gt; SmellsToRefactoings</p></li>
<li><p>joel spoelsky -&gt; Wrong.html</p></li>
<li><p>signs you should not be coding</p></li>
<li>
<p>TheDailyWTF.com</p>

<ul>
<li>Good code</li>
<li>Queue</li>
<li>DBTNG (biased)</li>
<li>File transfer for module update</li>
<li>PHP Object patterns and practice, it’s a bit old</li>
<li>Sitepoint book coming soon.</li>
<li>Avoid older PHP tutorials</li>
</ul>
</li>
</ul><h2>Project mgmt (from the Examiner)</h2>

<ul>
<li>PERT - from military - provides more insight than gantry</li>
<li>Focus on stakeholder needs rather than wants</li>
<li>last 3 mo. Finally unhacked core</li>
<li>a bad decision is <em>better</em> than indecision on a deadline</li>
<li>a bad client is better than no client at all</li>
<li>process and schedules: client should be just as accountable</li>
<li>communication, mediate and translate, unblock -- calm from chaos</li>
<li>minimize little shiny distractions -- context switching kills!</li>
<li>manhole cover round and heavy - keep it from falling in and stop from easily walking away - for saftey</li>
</ul><h2>Drupal Commerce</h2>

<ul>
<li>ecommerce framework - flexibility about what you can build with it</li>
<li>eurocentres</li>
<li>opendealsapp.com</li>
<li>inline product form... in rsyzmar sandbox</li>
<li>Ajax framework in d7 is really impressive with commerce</li>
<li>zondervan??</li>
<li>realmilkcheese.com</li>
</ul><h2>Profiling with Xhprof</h2>

<ul>
<li><a href="http://msonnabaum.github.com/xhprof-presentation/#1">http://msonnabaum.github.com/xhprof-presentation/#1</a></li>
<li> brianmercer ppa</li>
<li>Module implements should go into pressflow - David Strauss... follow up.</li>
<li>XHProf should run in production on a few requests... </li>
<li>Helps to have non-file backend on multi-node setup.</li>
<li>msonnabaum/XHProfLib</li>
<li>Strongarm patch to fix variable cache performance issue</li>
</ul><h2>Devops bof</h2>

<ul>
<li>git flow</li>
<li>gitalyte?</li>
<li>git tags? Are they locked and never supposed to change?</li>
<li>drush make idea: [patch][104065] = ...</li>
<li>Jenkins: DB backup, Dev to stage to prod jobs</li>
<li>etc keeper - package commit hooks - </li>
<li>backups and restore scripts -- testable in Jenkins</li>
<li>update hook - reads from text file</li>
<li>devel generate - integrations</li>
<li>default content module - phase2.... will be.dropped</li>
<li>queued Node access rebuild</li>
<li>updatedb - revert features in hook_update</li>
<li>drush deploy (like cap deploy) - video in London</li>
<li>git reference cache</li>
<li>camptocamp -- puppet conf -- apache2</li>
<li>Vewee_fun - stevenmerill</li>
<li>fastly</li>
<li>tungsten?? MySQL</li>
</ul></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby Midwest]]></title>
    <link href="https://imetchrischris.com/ruby-midwest.html"/>
    <updated>2011-11-07T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/ruby-midwest</id>
    <content type="html"><![CDATA[<p><a href="https://gist.github.com/1343431">Ruby Midwest 2011</a></p>

<!-- more -->
<hr />
<div class="wikistyle"><h2>
<a href="http://www.rubymidwest.com">Ruby Midwest 2011</a> - 11/4/11</h2>

<h3>Misc</h3>

<ul>
<li> <a href="http://olabini.com/">http://olabini.com/</a>

<ul>
<li> <a href="http://olabini.com/presentations/RubySafari-RubyMidwest2011.pdf">http://olabini.com/presentations/RubySafari-RubyMidwest2011.pdf</a>
</li>
</ul>
</li>
<li> <a href="http://j.mp/rate-rubymidwest">http://j.mp/rate-rubymidwest</a>
</li>
<li> <a href="http://blog.therubymug.com/blog/2011/07/26/the-install-osx-lion.html">http://blog.therubymug.com/blog/2011/07/26/the-install-osx-lion.html</a>
</li>
<li> <a href="https://github.com/vlandham/ruby_midwest_2010_notes">https://github.com/vlandham/ruby_midwest_2010_notes</a>
</li>
<li> <a href="https://github.com/search?authenticity_token=45bdd08f181e986ff3d0ea4b4abe480be350e0b8&amp;q=rubymidwest&amp;type=Everything&amp;repo=&amp;langOverride=&amp;start_value=1">https://github.com/search?authenticity_token=45bdd08f181e986ff3d0ea4b4abe480be350e0b8&amp;q=rubymidwest&amp;type=Everything&amp;repo=&amp;langOverride=&amp;start_value=1</a>
</li>
<li> samuelmullen.com</li>
<li> myceps.com</li>
<li> <a href="https://docs.google.com/document/d/18KLBp9JwZ7XXKz1D7-gqvmLQZlGUocarNk9XKDWPYOc/edit?pli=1">https://docs.google.com/document/d/18KLBp9JwZ7XXKz1D7-gqvmLQZlGUocarNk9XKDWPYOc/edit?pli=1</a>
</li>
<li> <a href="http://j.mp/survey-rubymidwest">http://j.mp/survey-rubymidwest</a>
</li>
<li> <a href="http://www.flickr.com/photos/lodestone/">http://www.flickr.com/photos/lodestone/</a>
</li>
<li> <a href="http://www.flickr.com/photos/lodestone/6315485750/sizes/l/in/photostream/">http://www.flickr.com/photos/lodestone/6315485750/sizes/l/in/photostream/</a>
</li>
</ul><h3>Rails is the new Rails</h3>

<ul>
<li> <a href="http://mbleigh.com/rails-is-the-new-rails">http://mbleigh.com/rails-is-the-new-rails</a>
</li>
<li> Personal asset gem -- a nice bundle of repeatedly used stuff</li>
</ul><h3>Active Record Anti-patterns for fun and profit</h3>

<ul>
<li> <a href="http://ethangunderson.com/">http://ethangunderson.com/</a>
</li>
<li> Groupon: Average size to ginormous</li>
<li> <a href="https://github.com/dsboulder/query_reviewer">https://github.com/dsboulder/query_reviewer</a>
</li>
<li> <a href="https://github.com/trptcolin/consistency_fail">https://github.com/trptcolin/consistency_fail</a>
</li>
<li> vertica for large reporting on mysql</li>
</ul><h3>Podcast...Ruby Rogues Live Recording</h3>

<ul>
<li> roboto - ruby mobile dev</li>
<li> <a href="http://rubyrogues.com/">http://rubyrogues.com/</a>
</li>
</ul><h3>github for building your app</h3>

<ul>
<li> github uses their main repo with branches for pull requests (particularly simplifies perms)</li>
<li> github uses oauth for access to <em>things</em>
</li>
</ul><h3>Testing legacy applications</h3>

<ul>
<li> ex. cucumber will get you highlevel view of tests</li>
</ul><div class="highlight">
<pre><span class="k">def</span> <span class="nf">crazy_insane_method</span>
  <span class="k">return</span> <span class="n">clean_tested_method</span> <span class="k">if</span> <span class="n">condition</span>
  <span class="c1">#crazy shit here</span>
<span class="k">end</span>
</pre>
</div>


<ul>
<li> <a href="http://bit.ly/nrmwtest">http://bit.ly/nrmwtest</a>
</li>
<li> @noelrap</li>
<li> <a href="http://speakerdeck.com/u/noelrap/p/test-your-legacy-code">http://speakerdeck.com/u/noelrap/p/test-your-legacy-code</a>
</li>
</ul><h3>Break it Down - Service Oriented safari</h3>

<ul>
<li> @bscofield</li>
<li> ISOLATE apps!!!</li>
<li> running the full stack ends in many services

<ul>
<li> foreman (seems to run on one machine)</li>
<li> specialization -- should only run on their own..</li>
</ul>
</li>
<li> redundancy

<ul>
<li> moar extraction</li>
</ul>
</li>
<li> sharing datamodel between apps</li>
</ul><h3>Does pair programming have to suck?</h3>

<ul>
<li> leandog - company on a boat</li>
<li> bus number = number of people to get hit by a bus before you are screwed...

<ul>
<li> pair programming - helps share info</li>
</ul>
</li>
<li> why dont we pair?

<ul>
<li> ...</li>
</ul>
</li>
<li> follow GeePawHill ?</li>
<li> @AngelaHarms</li>
<li> <a href="http://myAgileEducation.com">http://myAgileEducation.com</a>
</li>
<li> Dec. 3 - code retreat</li>
</ul><h3>Ruby Community: Awesome; Could Be Awesomer</h3>

<ul>
<li> run events, grow user groups...</li>
<li> Intentional communities!</li>
<li> minaswan = Motts (sp?) is nice and so we are nice

<ul>
<li> Community template: warm fuzzy...</li>
</ul>
</li>
<li> <a href="http://bit.ly/event-organizing-101">http://bit.ly/event-organizing-101</a>
</li>
<li> <a href="http://headrush.typepad.com">http://headrush.typepad.com</a>
</li>
<li> @mghaught</li>
<li> <a href="http://bit.ly/rate-rmw-community">http://bit.ly/rate-rmw-community</a>
</li>
<li> coding coffee (centered around "same place, same time")</li>
<li> <a href="http://martyhaught.com/articles/2011/11/02/event-organizing-101/">http://martyhaught.com/articles/2011/11/02/event-organizing-101/</a>
</li>
</ul><h3>Uncle Bob Martin</h3>

<ul>
<li> Architecture "The Lost Years"</li>
<li> High level architecture should scream its intent (e.g. look at blueprints for different building types)</li>
<li> Ivar Jakobson

<ul>
<li> User &lt;-&gt; Delivery Mechanism -&gt; Boundaries (Interfaces) -&gt; Interactor &lt;- Entities</li>
</ul>
</li>
<li> For testing: Delivery mechanism can be replaced...</li>
<li> Trigsby Ringscaller (sp??) - Creator of MVC

<ul>
<li> Controller -&gt; Model &lt;= (Observer relationship) View</li>
</ul>
</li>
<li> Fitnesse ?</li>
<li> Wikis - invented by Ward Cunningham</li>
<li> "A good architecture allows major decisions to be deferred!"</li>
<li> "An architecture diagram is where you can draw lines where all crossing dependencies go in the same direction"</li>
<li> TDD: Tests are there to help refactor, <em>they should be fast!</em>
</li>
<li> 8thlight.com</li>
</ul><h3>"The Cloud"</h3>

<ul>
<li> <a href="http://matt-oncloud.rhcloud.com">http://matt-oncloud.rhcloud.com</a>
</li>
<li> Cloud foundry: similar to: heroku, orchestrate, phpfog, ...</li>
<li> <a href="https://github.com/openshift">https://github.com/openshift</a>
</li>
<li> Headless selenium webdriver

<ul>
<li> <a href="http://bit.ly/pUuaMy">http://bit.ly/pUuaMy</a>
</li>
</ul>
</li>
</ul><h3>Make awesome command line apps (with ruby)</h3>

<ul>
<li> @davetron5000</li>
<li> optionparser and gli (<a href="https://github.com/davetron5000">https://github.com/davetron5000</a>)</li>
<li> ronn == manpages in markdown</li>
<li> <a href="http://bit.ly/gli-gh">http://bit.ly/gli-gh</a>
</li>
<li> <a href="http://bit.ly/cli-slides">http://bit.ly/cli-slides</a>
</li>
<li> <a href="http://naildrivin5.com/blog">http://naildrivin5.com/blog</a>
</li>
<li> <a href="http://awesome-cli-ruby.heroku.com/">http://awesome-cli-ruby.heroku.com/</a>
</li>
</ul><h3>Confident Code</h3>

<ul>
<li> Avdi Grimm @avdi avdi.org</li>
<li> <a href="https://github.com/avdi/cowsay">https://github.com/avdi/cowsay</a>
</li>
</ul><h3>Modern Databases</h3>

<ul>
<li> Eric Redmond @coderoshi crudcomic.com</li>
<li> <a href="http://twitter.com/#!/coderoshi">http://twitter.com/#!/coderoshi</a>
</li>
<li> <a href="http://mongohq-blog.heroku.com/blog/2011/11/03/ruby-midwest-conference-and-mongohq/">http://mongohq-blog.heroku.com/blog/2011/11/03/ruby-midwest-conference-and-mongohq/</a>
</li>
</ul><h3>Recommendation Engines (Support Vector Machines)</h3>

<ul>
<li> natural language mapping to sentiement... library?</li>
<li> libsvm -- svm lib written in C</li>
<li> source on github: <a href="https://github.com/hexgnu/rmw-svm">https://github.com/hexgnu/rmw-svm</a>
</li>
<li> <a href="http://matthewkirk.com">http://matthewkirk.com</a>
</li>
<li> Array object in ruby, to java (symbol int (or type you want))...</li>
<li> http://matthewkirk.com/presentations/Support-Vector-Machines-with-Jruby.pdf</li>
</ul><h3>People Patterns</h3>

<ul>
<li> tell bad news quickly (e.g. dont keep it held in...)</li>
<li> dont sugar coat anything</li>
</ul><h3>Life on the Edge</h3>

<ul>
<li> hunt out edge cases first... the rest of the work should be easier</li>
<li> <a href="https://github.com/JEG2">https://github.com/JEG2</a>
</li>
<li> faraday + typhoeus (have to wrap the whole thing <code>in_parallel</code>)</li>
<li> VCR ? turning off dependencies on the net</li>
<li> <a href="http://speakerdeck.com/u/jeg2/p/life-on-the-edge">http://speakerdeck.com/u/jeg2/p/life-on-the-edge</a>
</li>
</ul><h3>High Performance Ruby</h3>

<ul>
<li> @drnic</li>
<li> engineyard todo.rb --&gt; trinidad</li>
<li> <a href="http://speakerdeck.com/u/drnic/p/high-performance-ruby-threading-versus-evented-ruby-midwest-edition">http://speakerdeck.com/u/drnic/p/high-performance-ruby-threading-versus-evented-ruby-midwest-edition</a>
</li>
</ul><h3>Final Boss: RoR in video game industry</h3>

<ul>
<li> David Czanecki @czarneckid</li>
<li> @agoragames</li>
<li> @mlg =&gt; MLB, NBA, etc. of e-sports</li>
<li> Ola Bini: "Just add scaling"</li>
<li> Early: Deploy early in the day, early in the week</li>
<li> Documentation: make steps to follow! e.g. "Creating a new guitar hero title.txt"</li>
<li> "Overhead" (e.g. managers) - valuable for <em>managing the client</em>
</li>
<li> Data: (e.g. Game integration): Queues!!! (guitar hero uses sparrow) (and workers?)

<ul>
<li> Rescue - (killer app: rescue web - monitor and understand what is going on)</li>
</ul>
</li>
<li> Optimize for ... (e.g. games: school, vacations/holidays, ...)</li>
<li> Not all queues are equal - understanding the heavy use can let you prepare for heavy usage</li>
<li> <a href="https://github.com/agoragames/leaderboard">https://github.com/agoragames/leaderboard</a>
</li>
<li> External services: <em>integration!!</em>

<ul>
<li> impose limits!! (they can be artificial, but they serve a point!)

<ul>
<li> rate limits</li>
<li> timeouts (60s is too much, 10s and ramp back!)</li>
</ul>
</li>
</ul>
</li>
<li> Monitoring and infrastucture

<ul>
<li> monit -&gt; runit</li>
<li> Munin</li>
<li> Infrastructure validation

<ul>
<li> using cucumber: e.g. mysql running, slave running (how far behind?)</li>
</ul>
</li>
<li> Named services! (dont use the machine name directly - use DNS to retarget machines)</li>
<li> Redundancy - e.g. backup infrastructure</li>
<li> </li>
</ul>
</li>
<li> Stack smashing - rackspace VMs --&gt; down to 2 (24 core) physical boxes</li>
<li> <a href="http://speakerdeck.com/u/czarneckid/p/rails-in-the-video-game-industry">http://speakerdeck.com/u/czarneckid/p/rails-in-the-video-game-industry</a>
</li>
</ul>
<h3>Andy Hunt</h3>

<ul>
<li> Pragmattic Programmer</li>
<li> Agile Alliance</li>
<li> Agility Undefined</li>
<li> Context Matters

<ul>
<li> the way the world works: its messy (many interconnected systems)</li>
</ul>
</li>
<li> Practices werent discussed... what did they mean by agile:

<ul>
<li> ever shifting, changing, responding</li>
</ul>
</li>
<li> Emergence: complex behavior from simple interactions</li>
<li> Kaizen: Continuous changes based on continuous feedback</li>
<li> Risk mitigation: (risk from programming comes from writing code)</li>
<li> Cognative biases: what as humans drive us away from something like logical agile practices

<ul>
<li> Driving need for closure: (e.g. when will this project be done? we dont know... just tell me.)</li>
</ul>
</li>
<li> Postpone major decisions as long as you can (know the least at the beginning, most at the end, when do you want to make decisions?)</li>
<li> Funcamental attribution error: context (e.g. why are they being a real creep as a client...)</li>
<li> Planning Fallacy / Optimism Bias: Underestimate tasks all the time...</li>
<li> Hawthorne Effect: when someone is watching we change our actions</li>
<li> Dunning-Kruger Effect: "2nd order incompetence" - you dont know what you dont know -- argument to formulate a test</li>
<li> Un-Agile warning signs:

<ul>
<li> sloganization</li>
<li> follow rules vs. exercize judgement (if you dont let experts exercize judgement on team you are not getting value for the expert)</li>
<li> confusing the model with reality</li>
<li> demanding conformity</li>
<li> spelling out too much detail</li>
<li> oversimplification of complex solutions</li>
</ul>
</li>
<li> Agile development uses feedback to make constant asjustments in a highly collaborative environment

<ul>
<li> must have:

<ul>
<li> continuous <em>meaningful</em> feedback and be able to evaluate</li>
<li> ability to <em>change</em> the code, process, team, etc...</li>
</ul>
</li>
</ul>
</li>
<li> try. fail. learn. repeat.</li>
</ul></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[BADCamp notes]]></title>
    <link href="https://imetchrischris.com/conference-notes.html"/>
    <updated>2011-11-06T20:00:00+00:00</updated>
    <id>https://imetchrischris.com/conference-notes</id>
    <content type="html"><![CDATA[<p><a href="https://gist.github.com/1344231">BADCamp (Bay Area Drupal Camp) 2011</a></p>

<!-- more -->
<hr />
<div class="wikistyle"><h2>
<a href="http://2011.badcamp.net">BADCamp</a> (Bay Area Drupal Camp) 2011</h2>

<h3>Core Discussions:</h3>

<ul>
<li> Dave Reid - Media

<ul>
<li> groups.drupal.org/media</li>
<li> #drupal-media</li>
</ul>
</li>
<li> WSCCI - Larry Garfield

<ul>
<li> <a href="http://groups.drupal.org/wscci">http://groups.drupal.org/wscci</a>
</li>
<li> <a href="http://groups.drupal.org/node/167299">http://groups.drupal.org/node/167299</a> ==&gt; Symfony</li>
</ul>
</li>
<li> Documentation - 

<ul>
<li> <a href="http://drupal.org/documentation">http://drupal.org/documentation</a>
</li>
<li> 1278256</li>
<li> drupal.org/project/issue/api</li>
<li> <a href="http://drupal.org/node/1354">http://drupal.org/node/1354</a>
</li>
<li> g.d.o/documentation-team</li>
</ul>
</li>
<li> Greg Dunlap - Configuration Management Initiative

<ul>
<li> Battle Plan: g.d.o/node/149796</li>
<li> g.d.o/node/1555</li>
<li> XML is file format</li>
<li> CRUD API 1018602</li>
<li> g.d.o./node/171554</li>
<li> g.d.o/node/145614</li>
<li> 1300972</li>
</ul>
</li>
</ul><h3>Interesting Convo</h3>

<ul>
<li> <a href="http://dl.dropbox.com/u/9138/nginx-and-drupal.pdf">http://dl.dropbox.com/u/9138/nginx-and-drupal.pdf</a>
</li>
<li> <a href="http://www.trellon.com/services/crm_solutions">http://www.trellon.com/services/crm_solutions</a>

<ul>
<li> <a href="http://drupal.org/sandbox/citizenkane/1260982">http://drupal.org/sandbox/citizenkane/1260982</a> ??</li>
</ul>
</li>
<li> <a href="http://treehouseagency.com/blog/roger-lopez/2011/10/22/badcamp-energygov-case-study">http://treehouseagency.com/blog/roger-lopez/2011/10/22/badcamp-energygov-case-study</a>
</li>
<li> <a href="http://www.slideshare.net/fourkitchens/dont-design-websites-design-web-systems-badcamp-2011">http://www.slideshare.net/fourkitchens/dont-design-websites-design-web-systems-badcamp-2011</a>
</li>
<li> <a href="http://2011.badcamp.net/program/sessions/integrating-facebook-what-it-means-and-how-do-it">http://2011.badcamp.net/program/sessions/integrating-facebook-what-it-means-and-how-do-it</a>
</li>
<li> <a href="http://drupal.org/project/npr">http://drupal.org/project/npr</a>
</li>
<li> <a href="http://2011.badcamp.net/program/sessions/web-face-radio-npr-builds-platform-drupal-7">http://2011.badcamp.net/program/sessions/web-face-radio-npr-builds-platform-drupal-7</a>
</li>
<li> <a href="http://adellefrank.com/blog/review-debugging-techniques-drupal-lamp">http://adellefrank.com/blog/review-debugging-techniques-drupal-lamp</a>
</li>
<li> <a href="http://treehouseagency.com/blog/tim-cosgrove/2011/10/22/modern-theming-beyond-postprocessing-and-tpls-tim-cosgrove">http://treehouseagency.com/blog/tim-cosgrove/2011/10/22/modern-theming-beyond-postprocessing-and-tpls-tim-cosgrove</a>
</li>
<li> <a href="http://drupal.org/project/og_tasks">http://drupal.org/project/og_tasks</a>
</li>
<li> <a href="http://treehouseagency.com/blog/neil-hastings/2011/09/21/building-custom-block-entities-beans">http://treehouseagency.com/blog/neil-hastings/2011/09/21/building-custom-block-entities-beans</a>

<ul>
<li> <a href="http://drupal.org/project/bean">http://drupal.org/project/bean</a>
</li>
</ul>
</li>
<li> <a href="http://www.slideshare.net/rupl/responsive-drupal-beyond-the-media-query">http://www.slideshare.net/rupl/responsive-drupal-beyond-the-media-query</a>
</li>
<li> <a href="http://drupal.org/node/1300972">http://drupal.org/node/1300972</a> // PM Work on d.o. (actually some pretty good mockups...)</li>
<li><p><a href="http://groups.drupal.org/node/184984">http://groups.drupal.org/node/184984</a> //websocket doc by bcmiller</p></li>
<li>
<p>WSCCI</p>

<ul>
<li> Info:

<ul>
<li> <a href="http://groups.drupal.org/wscci">http://groups.drupal.org/wscci</a>
</li>
<li> <a href="http://www.garfieldtech.com/blog/web-services-initiative">http://www.garfieldtech.com/blog/web-services-initiative</a>
</li>
<li> <a href="http://groups.drupal.org/wscci/definitions">http://groups.drupal.org/wscci/definitions</a>
</li>
</ul>
</li>
<li> Symfony to Core: <a href="http://drupal.org/node/1178246">http://drupal.org/node/1178246</a>
</li>
<li> Context API: <a href="http://drupal.org/node/1292720">http://drupal.org/node/1292720</a>
</li>
</ul>
</li>
<li>
<p>(Drupal) Config Mgmt Initiative (CMI)</p>

<ul>
<li> <a href="http://drupal.org/sandbox/heyrocker/1145636">http://drupal.org/sandbox/heyrocker/1145636</a>
</li>
</ul>
</li>
<li><p>Docs: <a href="http://drupal.org/node/1354">http://drupal.org/node/1354</a></p></li>
<li>
<p>Performance</p>

<ul>
<li> Peter Drake (craziness!!)

<ul>
<li> <a href="http://drupal.org/node/394840">http://drupal.org/node/394840</a> //authcache</li>
<li> <a href="http://drupal.org/project/expire">http://drupal.org/project/expire</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Media:</p>

<ul>
<li> Use drupal player (very generic) as standalone?</li>
<li> Existing (standalones)

<ul>
<li> <a href="http://mediaelementjs.com/">http://mediaelementjs.com/</a>
</li>
<li> <a href="https://github.com/happyworm/jplayer/">https://github.com/happyworm/jplayer/</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>PCI (compliance)</p>

<ul>
<li> <a href="http://2011.drupalcampcolorado.org/sites/default/files/slides/PCI.pdf">talk from Drupal Camp Colorado → BOF</a>
</li>
<li> SAQ A - outsource card data / SAQ C - card data is stored</li>
<li> Separation of Duties … (only allow access to resources by perm.)</li>
<li> ASV - Approved Scanning Vendor</li>
<li> High-level: PCI DAA Quick Reference Guide</li>
<li> You can prioritize your approach to pursue PCI DSS (items that you must do first...)</li>
<li> The message: <strong>EVERYTHING MUST BE DOCUMENTED</strong>*</li>
<li> Stripe payment gateway (module called Stripe)</li>
<li> certified PCI compliance people: e.g.: Colefire, Trustfire</li>
</ul>
</li>
</ul></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal's RESTful future]]></title>
    <link href="https://imetchrischris.com/drupal-restful-future.html"/>
    <updated>2011-10-30T20:41:00+00:00</updated>
    <id>https://imetchrischris.com/drupal-restful-future</id>
    <content type="html"><![CDATA[<p>TL;DR: <a href="http://drupal.org/project/services">services</a> and <a href="http://drupal.org/project/feeds">feeds</a> rock! We need to change the way we look at the server - web-servers are really build-servers.</p>

<hr />

<h4 id="intro">Intro</h4>

<p>Lately at <a href="http://www.allplayers.com">AllPlayers.com</a> I have been spending a lot of time working on API’s for our site and spending some time making Drupal talk <em>web</em>. Luckily, this is something that is being thought about a lot in the community (see: <a href="http://groups.drupal.org/wscci">WSCCI</a>, <a href="http://drupal.org/project/services">services.module</a>); but, there are some interesting growing pains:
 <!-- more --></p>

<p>The <em>connection</em> to Drupal: There are a variety of ways to <a href="http://drupal.org/project/modules?filters=tid%3A52">connect to external sites</a> and obviously “the way the web should work”, but I get the explicit feeling that many of types of connections are “toys”. As a site administrator we built out a DLAMP (Drupal, Linux, Apache, MySQL, PHP) install because we are <em>serious</em> about building a web-app! In our engineering efforts, we are probably only slightly interested in handing over our data to 3rd party services, so likely our next interest is in taking on the data for ourselves (which is no small matter).</p>

<h4 id="get-the-data">Get the data</h4>

<p>So, we’ve committed ourselves to “<a href="http://en.wikipedia.org/wiki/Big_data">big data</a>”; great - how do we do it?! Honestly - look towards to the industry leaders; short of a major engineering effort (which perhaps you should be looking at hadoop, hbase, and map-reduce), we are here for Drupal - and that’s gonna make this fast and powerful: <a href="http://drupal.org/project/feeds">feeds</a>! Target an endpoint, upload a file, or configure the plugin an do what you want, then parse that data with a processor (e.g. XPath, QueryPath, CSV mapping, or build your own). It’s a little like magic! (if you don’t believe me, maybe a <a href="http://developmentseed.org/blog/2009/dec/15/importing-and-aggregating-stuff-feeds">demo</a> could convince you. Now let’s get a little more technical…)</p>

<h5 id="oh-the-pain">Oh the pain…</h5>

<p>You’ve got the data but, was that all there was to it? Mostly… but, because we are good researchers we note something about feeds requests: <a href="http://drupalcode.org/project/feeds.git/blob/refs/heads/master:/libraries/http_request.inc#l86">they’re pretty good</a>, but there turns out to be a variety of different ways to do essentially the same thing:</p>

<ul>
  <li><a href="http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_http_request/7"><code class="language-plaintext highlighter-rouge">drupal_http_request</code></a></li>
  <li><a href="http://drupalcode.org/project/wbapi.git/blob/refs/heads/master:/wbapi.request.inc#l164">World Bank API</a> (depends on <code class="language-plaintext highlighter-rouge">drupal_http_request</code>)</li>
  <li><a href="http://drupalcode.org/project/acquia_connector.git/blob/refs/heads/7.x-1.x:/acquia_agent/acquia_agent.module#l553">Acquia Connector</a> which uses <a href="http://api.drupal.org/api/drupal/includes--common.inc/function/xmlrpc/7">XML-RPC</a> (depends on <code class="language-plaintext highlighter-rouge">drupal_http_request</code>)</li>
  <li><a href="https://github.com/pantheon-systems/pantheon7/blob/master/modules/pantheon/pantheon_api/pantheon_api.inc#L113-168">Pantheon System API</a></li>
</ul>

<p>Some observations: <em>the Drupal way</em> seems to be <code class="language-plaintext highlighter-rouge">drupal_http_request</code> but, there is also a distinct lack of PEAR dependencies like <a href="http://pear.php.net/package/HTTP_Request2">HTTP_Request</a>; a nice place to ruminate.</p>

<h4 id="expose-your-data">Expose your data</h4>

<p>Data acquired! But we want to share (easy): <a href="http://drupal.org/documentation/modules/field-ui">fields</a> and <a href="http://drupal.org/project/views">views</a>. However, as a respecting netizen you want to share semantically! Drupal already comes <a href="http://www.lullabot.com/articles/how-does-rdf-work-drupal-7">feature packed for the web</a>, but we also want to share through API’s. Luckily contrib space has this “solved” with <a href="http://drupal.org/project/services">services</a>, where we can expose our data through a variety of <a href="http://drupalcode.org/project/services.git/tree/refs/heads/7.x-3.x:/servers">servers</a> and varieties of <a href="http://drupalcode.org/project/services.git/blob/refs/heads/7.x-3.x:/servers/rest_server/includes/rest_server.views.inc#l25">formats</a>.</p>

<p>Thus we can do something like <a href="https://gist.github.com/affc9864487bb1b9c918">this</a>: <code class="language-plaintext highlighter-rouge">GET</code> http://drupal6-services/services/plist/node/1.json and expect</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
  "changed": "1286592762",
  "language": "",
  "uid": "0",
  "type": "story",
  "status": "0",
  "nid": "1",
  "created": "1286592762"
  ...
}
</code></pre></div></div>

<p>amazingly powerful! (it is also worth noting that the services endpoint can pull from views as well!)</p>

<h5 id="oh-the-pain-1">Oh the pain…</h5>

<p>The story so far has gotten us everything we need <em>very quickly</em>, but as consumers of <a href="https://dev.twitter.com/docs/api">many</a> <a href="http://developers.facebook.com/docs/reference/rest">public</a> <a href="http://www.twilio.com/docs/api/rest/">APIs</a> we quickly note that what we are leaking is Drupal through exposing endpoints. This is actually fairly useful to developers of Drupal, but is probably pretty useless to someone consuming your <em>product</em>, therefore we need to take <a href="http://drupalcode.org/project/services.git/blob/refs/heads/7.x-3.x:/services.services.api.php">configure (or theme)</a> the exposed services.</p>

<p>Additionally, given a glimpse of <a href="http://www.garfieldtech.com/blog/web-services-initiative">web services future of Drupal</a> this seems particularly pertinent! <a href="http://groups.drupal.org/wscci">WSCCI</a> (Web Services Context Core Initiative) is the holding place for the <em>high performance REST server</em>.</p>

<h4 id="data-and-the-front-end-interaction">Data and the front-end interaction</h4>

<p>I probably don’t share very much, but I have a <a href="http://twitter.com/#!/imetchrischris/status/116723898380328960">love affair</a> with javascript; and given the amazing <a href="http://slides.html5rocks.com">HTML5 features</a> and great <a href="http://microjs.com">javascript libraries</a> (<a href="http://jquery.com/">jQuery</a> is just the tip of the iceberg - or the first taste depending on how you look at it) - there is a bright future in the browser! So bright in fact: I am of the opinion that “web-pages” should be delivered as apps! There are a lot of great tools to facilitate the concept of a client side app, often examples of this are seen in the <a href="https://chrome.google.com/webstore">Chrome web store</a> (some neat technologies include the <a href="http://www.w3.org/TR/html5/offline.html">cache-manifest</a>).</p>

<p>This leaves me wondering: where exactly does the theme layer live? Particularly, as in a traditional sense, the theme layer seems to live “in the browser”, which means that any processing done server side to render CSS, JS, and/or HTML would be in the <em>delivery of an application</em> - the version of which the client is requesting to be delivered by the server.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal Camp Austin Re-cap]]></title>
    <link href="https://imetchrischris.com/drupal-camp-austin-re-cap.html"/>
    <updated>2010-11-26T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/drupal-camp-austin-re-cap</id>
    <content type="html"><![CDATA[<div><a href="http://2010.drupalcampaustin.org/">Drupal Camp Austin</a> (DCA) was excellent - there was a great showing of drupalist and no shortage of excitement and learning. There were several great presentations ranging from security (<a href="http://2010.drupalcampaustin.org/sessions/security-risks-and-smart-configuration-securing-your-drupal-site">config</a>, <a href="http://2010.drupalcampaustin.org/sessions/drupal-security-coders">code</a>), <a href="http://2010.drupalcampaustin.org/sessions/building-strong-profitable-drupal-business">business value</a>, <a href="http://2010.drupalcampaustin.org/sessions/whole-lotta-drupal">community reflection</a>, <a href="http://2010.drupalcampaustin.org/sessions/ctool-plugins-and-exportables">advanced dev</a>, and even an <a href="http://2010.drupalcampaustin.org/sessions/reuse-drupal-features">intro to features</a> by me! Overall - the things that were talked about in the birds of a feather (BoF), in the halls, and when socializing can't be traded for anything!</div>
<p />
<div>Here are some quick-hit notes:</div>
<div>
<ul>
<li>David Strauss
<ul>
<li><a href="http://incubator.apache.org/libcloud/">libcloud</a></li>
<li><a href="https://code.launchpad.net/~fourkitchens/pressflow/6-evented">Pressflow with events</a> -- think: node.js in drupal</li>
</ul>
</li>
<li>Ben Finklea
<ul>
<li>Books
<ul>
<li>No Mans Land</li>
<li>E-myth</li>
<li>Who</li>
</ul>
</li>
<li>Note: Kpi = key performance indicator (process)</li>
</ul>
</li>
<li>Greg Knaddison, Ben Jeavons
<ul>
<li>add coder and security_review to Hudson tasks</li>
<li><a href="https://github.com/miccolis/vuln/">vuln</a></li>
</ul>
</li>
</ul>
</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Web services - love em' and what a cluster!]]></title>
    <link href="https://imetchrischris.com/web-services-love-em-and-what-a-cluster.html"/>
    <updated>2010-07-12T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/web-services-love-em-and-what-a-cluster</id>
    <content type="html"><![CDATA[So, a little late night googling and it turns out that there is somewhat of a schism in the web services world. Now, without too much <a href="http://chrischris.posterous.com/what-apps-really-are-services">history</a> I am <a href="http://chrischris.posterous.com/past-225">kindof</a> a services <a href="http://chrischris.posterous.com/omg-ecmascript-is-js-and-a-ws-e4x-woohoo">nut</a>! However, I do not know how I missed <a href="http://alexbarnett.net/blog/archive/2007/03/13/Does-REST-need-a-WSDL_3F00_.aspx">this fight</a> on the <a href="http://www.w3.org/TR/wsdl">WSDL</a>, <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a>, <a href="http://en.wikipedia.org/wiki/Web_Application_Description_Language">WADL</a> acronym soup debate. As it turns out often enterprise-y tools do an amazing job at creating compatible (and even usable) web services endpoints, often in the form of SOAP with WSDL&#39;s describing the endpoint. A little investigation here reveals though just how hard it is to integrate a REST-ful endpoint to these service (often the value add of the extensible schema and type definitions quickly negates the simplicity of the REST). IMO this really leaves people in two camps - those with the automated *tools* to read the service endpoints (and quickly gain traction on interacting with the objects) and the simplicity of the REST interfaces that have very little overhead since they exploit the existing underlying architecture. I am not going to go into a tizzy here on why this seems really stupid (note to self - I should really write up some thoughts on this...)... because through this research I have stumbled onto a nifty google project: <a href="http://code.google.com/p/rest-api-code-gen/">REST API code-gen</a> (in all its computer science-y acronym laden goodness) - this is really cool (short description <a href="http://blog.tomayac.de/index.php?date=2007-03-12&amp;time=17:11:27&amp;perma=Automatic+Multi+Lang.html">here</a>)!! <p /><div>Bam - Magic!</div><div><img src="http://blog.tomayac.de/images/Google_REST_Compile.png" alt="REST Compile" /></div><div><a href="http://blog.tomayac.de/index.php?date=2007-03-12&amp;time=17:11:27&amp;perma=Automatic+Multi+Lang.html">ref</a></div> <p /><div>Woohoo - bringing robots to simple web services interfaces - I feel the future coming (unless its already dead)!</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I walked into the office the other day to this]]></title>
    <link href="https://imetchrischris.com/i-walked-into-the-office-the-other-day-to-thi.html"/>
    <updated>2010-05-21T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/i-walked-into-the-office-the-other-day-to-thi</id>
    <content type="html"><![CDATA[<p><img src="/images/IMG00165-20100521-0849.jpg" alt="I walked into the office the other day to this" /></p>
<p>sent via mobile</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[So much mandated technology]]></title>
    <link href="https://imetchrischris.com/so-much-mandated-technology.html"/>
    <updated>2010-05-16T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/so-much-mandated-technology</id>
    <content type="html"><![CDATA[&quot;So much mandated technology...they [generally large companies] just take the [provider] with the most steaks and the most strippers; typically from companies who have expense accounts and sales people who can sell them very expensive application servers over six months.&quot; <a href="http://twit.tv/floss79">http://twit.tv/floss79</a>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Penguin Game J2ME edition]]></title>
    <link href="https://imetchrischris.com/penguin-game-j2me-edition.html"/>
    <updated>2010-04-10T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/penguin-game-j2me-edition</id>
    <content type="html"><![CDATA[A while back (2006ish) I wrote a small game for a class (Java mobile) and was curious if it would run on my phone today - what do you know?! Woohoo - it works!<div>Source: <a href="http://github.com/christianchristensen/PenguinGame">http://github.com/christianchristensen/PenguinGame</a></div> <p><img src="/images/game.png" alt="Penguin Game J2ME edition" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What apps really are - services]]></title>
    <link href="https://imetchrischris.com/what-apps-really-are-services.html"/>
    <updated>2010-04-04T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/what-apps-really-are---services</id>
    <content type="html"><![CDATA[<div>This weekend I was hypothesizing how three apps I think are very cool operate, specifically: <a href="http://www.google.com/mobile/google-mobile-app/">Google Voice search</a>, <a href="http://www.shazam.com/">Shazam</a>, <a href="https://squareup.com/">Square</a>. What shocked me about all of them was how available they were across platforms - particularly mobile. Then I came to quickly realize the only investment in development for each platform was front-end work; the piece they all had in common was the backend. Now, some might be familiar with some patterns that make this possible like <a href="http://en.wikipedia.org/wiki/Model–view–controller">MVC</a>; but what really surprises me is how unbelievably seamless these apps work in the face of having to support different platforms. This leads me to a more philosophical question about touting an &quot;app for that...&quot; - really what we are seeing is that behind many of the good apps there is a terrific service that is capable of being abstracted from that devices interface.</div> <p /><div style="text-align: center;"><img src="/images/graphic.png" alt="What apps really are - services" /></div><p />Caveat Emptor: Its probably very short sighted to assume that this is a one sided conclusion, but I think there are some great reasons to follow this pattern; there are many great reasons to have a fantastic UI, but when thinking about reaching the maximum audience it is comforting to know that following this pattern can help development remain agile in the face of new device releases (see: iPad).
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What we have to look forward to 64-bits and beyond]]></title>
    <link href="https://imetchrischris.com/what-we-have-to-look-forward-to-64-bits-and-b.html"/>
    <updated>2009-02-08T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/what-we-have-to-look-forward-to-64-bits-and-b</id>
    <content type="html"><![CDATA[<blockquote><span style="border-collapse: collapse; font-family: arial; font-size: 13px;">The emergence of the 64-bit architecture effectively increases the memory ceiling to 264 addresses, equivalent to approximately 17.2 billion gigabytes, 16.8 million terabytes, or 16 exabytes of RAM. To put this in perspective, in the days when 4 MB of main memory was commonplace, the maximum memory ceiling of 232 addresses was about 1,000 times larger than typical memory configurations. Today, when over 2 GB of main memory is common, the ceiling of 264 addresses is about ten trillion times larger, i.e., ten billion times more headroom than the 232 case. </span>
<p />
</blockquote>
<div><span style="border-collapse: collapse; font-family: arial; font-size: 13px;"><a href="http://en.wikipedia.org/wiki/64-bit">http://en.wikipedia.org/wiki/64-bit</a><br /></span></div>
<p />
<div><span style="border-collapse: collapse; font-family: arial; font-size: 13px;">I can't wait to see what the future holds!</span></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Small Story - about science and observation]]></title>
    <link href="https://imetchrischris.com/a-small-story-about-science-and-observation.html"/>
    <updated>2008-12-12T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/a-small-story-about-science-and-observation</id>
    <content type="html"><![CDATA[<p><span style="font-family: Verdana; font-size: 13px;">In 7th grade science class with a teacher known as Mr. Martin &ndash; we had a room full of all kinds of creatures, from tropical lizards, iguanas, tree frogs, to large constrictor Boas. Now although I might liken this to an immersion experience in the middle of the jungle I think one of the more meaningful lessons was described on the first day of class. He asked all the students to go around the room and find the most deadly creature out of all. After we all walk around, Mr. Martin performed a quick poll of what people thought. (<span style="font-style: italic;">update: Someone mentioned that maybe the most obvious and deadliest creature would be ourselves - humans</span>)&nbsp;Several students guessed the large constrictor Boa as it would be able to squeeze you to death, several other students postulated that maybe it was a lizard that could squirt poison into your eyes. The moral of the story, however, had nothing to do with knowledge on the subject matter of animals; it was a test of observation skills. The 'most deadly' animal in the room was easily identified by the cage it was in, as it was the only cage with padlocks holding all of the doors tightly shut (keeping the animal in and student fingers out).</span></p>
<p />
<div><span style="font-family: Verdana; font-size: 13px;">The scientific method, hypothesis, conclusions, observations, and the thought experiment.</span></div>
<div><span style="font-family: Verdana; font-size: 13px;">(futher fun: <a href="http://www.youtube.com/results?search_query=bill+nye+the+science+guy&amp;search_type=">YouTube: Bill Nye</a>)</span></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Albert Einstein]]></title>
    <link href="https://imetchrischris.com/albert-einstein.html"/>
    <updated>2008-10-21T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/albert-einstein</id>
    <content type="html"><![CDATA[<span style="font-family: Times New Roman;"><dt><span style="color: rgb(191, 144, 0);"><span style="font-family: Trebuchet MS;"><b>"Gravitation cannot be held responsible for people falling in love."</b></span></span></dt><dt style="font-size: 108%;"><br /></dt><dt style="font-size: 108%;">How on earth can you explain in terms of chemistry and physics so important a biological phenomenon as first love? Put your hand on a stove for a minute and it seems like an hour. Sit with that special girl for an hour and it seems like a minute. That's relativity.</dt><dd class="author" style="font-size: 94%; margin-right: 10px; margin-bottom: 10px; margin-top: 8px; margin-left: 4em;"><b><a href="http://www.quotationspage.com/quotes/Albert_Einstein/" style="color: navy;">Albert Einstein</a></b><br /><i>US (German-born) physicist (1879 - 1955)</i></dd></span>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Automated Robot Truck]]></title>
    <link href="https://imetchrischris.com/automated-robot-truck.html"/>
    <updated>2008-05-03T00:00:00+00:00</updated>
    <id>https://imetchrischris.com/automated-robot-truck</id>
    <content type="html"><![CDATA[<object height="355" width="425"><param name="movie" value="http://www.youtube.com/v/bl44tWygkLo&amp;hl=en" /><param name="wmode" value="transparent" /><embed src="http://www.youtube.com/v/bl44tWygkLo&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"></embed></object><p />Test run...<br /><iframe src="http://www.youtube.com/embed/bl44tWygkLo" allowfullscreen frameborder="0" height="417" width="500"></iframe>
]]></content>
  </entry>
  
</feed>
