diff --git a/.gitignore b/.gitignore index e62c27f..4a72f9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ *.sw* _site/ +.sass-cache/ +.DS_Store +.jekyll-metadata +.bundle/ +vendor/ diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..276cbf9 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.3.0 diff --git a/404.md b/404.md new file mode 100644 index 0000000..c95d445 --- /dev/null +++ b/404.md @@ -0,0 +1,10 @@ +--- +permalink: /404.html +title: "Whelp - Page Not Found!" +layout: post +skip_footer: true +subtitle: "HTTP 404" +--- + +![Air Bud]({{site.url}}/static/404-airbud.jpg) + diff --git a/CNAME b/CNAME index 48757c6..1d755a1 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -mdswanson.com \ No newline at end of file +mdswanson.com diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..13ea19c --- /dev/null +++ b/Gemfile @@ -0,0 +1,8 @@ +source "https://rubygems.org" + +gem "github-pages" +gem "rake" + +gem "bourbon" +gem "neat" +gem "bitters" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..39438f9 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,261 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.11.1) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + bitters (2.0.2) + thor (~> 0.19) + bourbon (6.0.0) + thor (~> 0.19) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.1.5) + dnsruby (1.61.3) + addressable (~> 2.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + ethon (0.12.0) + ffi (>= 1.3.0) + eventmachine (1.2.7) + execjs (2.7.0) + faraday (0.17.0) + multipart-post (>= 1.2, < 3) + ffi (1.11.1) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (201) + activesupport (= 4.2.11.1) + github-pages-health-check (= 1.16.1) + jekyll (= 3.8.5) + jekyll-avatar (= 0.6.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.6) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.11.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.12.1) + jekyll-mentions (= 1.4.1) + jekyll-optional-front-matter (= 0.3.0) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.2.0) + jekyll-redirect-from (= 0.14.0) + jekyll-relative-links (= 0.6.0) + jekyll-remote-theme (= 0.4.0) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.5.0) + jekyll-sitemap (= 1.2.0) + jekyll-swiss (= 0.4.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.1) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.3) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.1) + jemoji (= 0.10.2) + kramdown (= 1.17.0) + liquid (= 4.0.0) + listen (= 3.1.5) + mercenary (~> 0.3) + minima (= 2.5.0) + nokogiri (>= 1.10.4, < 2.0) + rouge (= 3.11.0) + terminal-table (~> 1.4) + github-pages-health-check (1.16.1) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (~> 3.0) + typhoeus (~> 1.3) + html-pipeline (2.12.0) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.8.5) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.6.0) + jekyll (~> 3.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.11.0) + jekyll (~> 3.3) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.12.1) + jekyll (~> 3.4) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.4.1) + html-pipeline (~> 2.3) + jekyll (~> 3.0) + jekyll-optional-front-matter (0.3.0) + jekyll (~> 3.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.2.0) + jekyll (~> 3.0) + jekyll-redirect-from (0.14.0) + jekyll (~> 3.3) + jekyll-relative-links (0.6.0) + jekyll (~> 3.3) + jekyll-remote-theme (0.4.0) + addressable (~> 2.0) + jekyll (~> 3.5) + rubyzip (>= 1.2.1, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.5.0) + jekyll (~> 3.3) + jekyll-sitemap (1.2.0) + jekyll (~> 3.3) + jekyll-swiss (0.4.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.3) + jekyll (~> 3.5) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.1) + jekyll (~> 3.3) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.10.2) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (~> 3.0) + kramdown (1.17.0) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + mini_portile2 (2.4.0) + minima (2.5.0) + jekyll (~> 3.5) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.12.2) + multipart-post (2.1.1) + neat (4.0.0) + thor (~> 0.19) + nokogiri (1.10.4) + mini_portile2 (~> 2.4.0) + octokit (4.14.0) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (3.1.1) + rake (13.0.0) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + rouge (3.11.0) + ruby-enum (0.7.2) + i18n + ruby_dep (1.5.0) + rubyzip (2.0.0) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thor (0.20.3) + thread_safe (0.3.6) + typhoeus (1.3.1) + ethon (>= 0.9.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + unicode-display_width (1.6.0) + +PLATFORMS + ruby + +DEPENDENCIES + bitters + bourbon + github-pages + neat + rake + +BUNDLED WITH + 1.17.2 diff --git a/README b/README deleted file mode 100644 index f97791b..0000000 --- a/README +++ /dev/null @@ -1 +0,0 @@ -blogs, talks, book writeups diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe5476f --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +### [My Blog](http://mdswanson.com) + +The [Jekyll](http://jekyllrb.com/) source for [http://mdswanson.com](http://mdswanson.com), which contains my blog, projects, and book writeups. + +Spelling/grammar corrections are always welcome (and much appreciated :heart:) via Pull Requests. + +--- +### Theme +Älg (unreleased for now). + +![](https://raw.github.com/swanson/swanson.github.com/master/screenshots/home.png) +![](https://raw.github.com/swanson/swanson.github.com/master/screenshots/blog.png) + +--- + +### License +The following directories and their contents are Copyright Matt Swanson. You may not reuse anything therein without my permission: + +* _posts/ +* talks/ +* static/ + +All other directories and files are MIT Licensed. \ No newline at end of file diff --git a/Rakefile b/Rakefile index 89c49f4..93fc09c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,4 +1,8 @@ -desc 'Run the jekyll dev server' +task :default => [:server] + +desc 'Build the Jekyll site for local previewing' task :server do - system "jekyll --server --auto --url=''" + system "jekyll serve --watch" end + +task :serve => :server diff --git a/_config.yml b/_config.yml index 10ac0d6..206a308 100644 --- a/_config.yml +++ b/_config.yml @@ -1,3 +1,21 @@ -pygments: true -auto: true -url: http://mdswanson.com \ No newline at end of file +url: https://mdswanson.com +lsi: false +markdown: kramdown +kramdown: + input: GFM + hard_wrap: false +exclude: + ["CNAME", "README.md", "Rakefile", "generate.rb", "Gemfile", "Gemfile.lock"] +include: ["_pages"] +plugins: + - jekyll-sitemap + - jekyll-feed + - jekyll-seo-tag + - jemoji +author: + name: Matt Swanson + email: swan3788@gmail.com + url: https://mdswanson.com +title: Matt Swanson's Blog +feed: + path: atom.xml diff --git a/_data/projects.yml b/_data/projects.yml new file mode 100644 index 0000000..6a384b9 --- /dev/null +++ b/_data/projects.yml @@ -0,0 +1,140 @@ +- year: 2013 + projects: + - name: Stringer + url: https://github.com/swanson/stringer + blurb: > + A self-hosted, anti-social RSS reader + + - name: Hacks && Happenings + url: http://indyhackers.us6.list-manage.com/subscribe?u=244b5370d41b5cf4146ec517c&id=b51f983563 + blurb: > + Monthly email newsletter for Indianapolis-area developers + + - name: Triplico + url: https://github.com/swanson/triplico + blurb: > + Share YouTube videos among 3 people + + - name: Gem License Checker + url: http://gemlicensechecker.herokuapp.com + blurb: > + Given a Gemfile, determine the license for your dependencies + + - name: Let's Work Happier + url: http://www.letsworkhappier.com + blurb: > + Marketing microsite for MoraleApp, built in an afternoon with Jekyll + +- year: 2012 + projects: + - name: Morale + url: https://www.moraleapp.com + blurb: Daily team mood tracking via email + + - name: QueueRunner + url: https://github.com/swanson/queue-runner + blurb: Track your TV shows + + - name: ferrara + url: https://github.com/swanson/ferrara + blurb: > + Fetch streaming links (Netflix, Hulu, iTunes) for TV episodes + + - name: Planning Poker + url: https://github.com/sep/planning-poker-android + blurb: > + Android app for conducting agile Planning Poker exercises + + - name: Most Precise Weather + url: http://mostpreciseweather.com + blurb: > + The Most Precise Weather Forecast. Ever. (Accuracy not guarenteed) + + - name: IndyHackers API + url: http://indyhackersapi.herokuapp.com/events + blurb: > + JSON API for the IndyHackers event calendar + + - name: Indy Startup Lab + url: https://indystartuplab.github.io/ + blurb: > + Weekly meetup for hackers to work on anything that needs doing + +- year: 2011 + projects: + - name: abe + url: http://abe.herokuapp.com + blurb: > + Abraham Lincoln? Isn't he the President who... + + - name: Netflix It Now + url: https://github.com/swanson/netflix-it-now + blurb: > + Bookmarklet and small webapp to tell me when movies became streamable + + - name: dasher + url: http://sep.com + blurb: > + Company status dashboard, built with Node + + - name: lanyon + url: https://github.com/swanson/lanyon + blurb: > + WYSIWYG editor for Jekyll powered blogs, hooked directly into the Github API + + - name: CloutBout + url: https://github.com/swanson/cloutbout + blurb: > + Fantasy sports for Twitter, built in under 36 hours for SDC Chicago 2011 Hackathon + + - name: WhooWho! + url: http://www.sep.com/labs/event0711.html + blurb: > + Lean CRM with recommendations, built at SEP Startup Weekend Summer 2011 + + - name: bibliotechnical + url: https://github.com/swanson/bibliotechnical + blurb: > + Programming book recommendation site + + - name: LandingPad.rb + url: http://github.com/swanson/LandingPad.rb + blurb: > + Landing page app, deployed on Heroku using Sinatra + MongoDB + +- year: 2010 + projects: + - name: Glorified Screensaver + url: http://github.com/swanson/glorified-screensaver + blurb: > + Real-time announcement board built with Node.js, socket.io, and three.js + + - name: StackTracker + url: http://github.com/swanson/stacktracker + blurb: > + Cross-platform desktop notifier for the StackExchange API + + - name: Duel of Tweets + url: http://github.com/swanson/duel-of-tweets + blurb: > + Head-to-head polls conducted over Twitter, built in under 36 hours for SDC Chicago 2010 Hackathon + + - name: flask-embedly + url: http://github.com/swanson/flask-embedly + blurb: > + Flask extension that adds Embedly support to templating + + - name: autocastr + url: http://github.com/swanson/autocastr + blurb: > + Automatically download and partition podcasts into CD-R sized folders + + - name: Mongo Overflow + url: http://github.com/swanson/mongo-overflow + blurb: > + Small StackOverflow clone with a mongoDB backend + + - name: Bumps + url: http://github.com/swanson/bumps + blurb: > + OBD-II iPhone logging application and server, used for pothole detection research diff --git a/_data/series.yml b/_data/series.yml new file mode 100644 index 0000000..1dcece8 --- /dev/null +++ b/_data/series.yml @@ -0,0 +1,43 @@ +- name: Growth + desc: | + The journey towards senior engineer, with an emphasis on soft + skills & professional growth + tag_name: growth + +- name: Delightful Products + desc: | + Thoughts on building simple products that people love + tag_name: delightful_products + +- name: Product Development + desc: | + Lessons and experiences in validating, building, and supporting software products + tag_name: product_dev + +- name: Practices + desc: | + Real-world experiences with agile techniques & + challenging dogmatic practices + tag_name: practices + +- name: Reflections + desc: | + Looking back critically, in both personal & professional + contexts + tag_name: reflections + +- name: Data Science Lite + desc: | + Flailing around with data and trying to make sense of it all + tag_name: data_sci + +- name: Tangential + desc: | + The intersection of software and other crafts & + professions + tag_name: tangential + +- name: Engineering in Android + desc: | + Applying best-practices & techniques to Android development + tag_name: android \ No newline at end of file diff --git a/_data/theme.yml b/_data/theme.yml new file mode 100644 index 0000000..2c98a66 --- /dev/null +++ b/_data/theme.yml @@ -0,0 +1,2 @@ +colors: + highlight: '#0C84E8' diff --git a/_includes/css/base.css b/_includes/css/base.css deleted file mode 100644 index 925779a..0000000 --- a/_includes/css/base.css +++ /dev/null @@ -1,335 +0,0 @@ -/* -* Skeleton V1.1 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 8/17/2011 -*/ - - -/* Table of Content -================================================== - #Reset & Basics - #Basic Styles - #Site Styles - #Typography - #Links - #Lists - #Images - #Buttons - #Tabs - #Forms - #Misc */ - - -/* #Reset & Basics (Inspired by E. Meyers) -================================================== */ - html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; } - article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { - display: block; } - body { - line-height: 1; } - ol, ul { - list-style: none; } - blockquote, q { - quotes: none; } - blockquote:before, blockquote:after, - q:before, q:after { - content: ''; - content: none; } - table { - border-collapse: collapse; - border-spacing: 0; } - - -/* #Basic Styles -================================================== */ - body { - background: #fff; - font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #444; - -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ - -webkit-text-size-adjust: 100%; - } - - -/* #Typography -================================================== */ - h1, h2, h3, h4, h5, h6 { - color: #181818; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; - font-weight: normal; } - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } - h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;} - h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } - h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } - h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } - h5 { font-size: 17px; line-height: 24px; } - h6 { font-size: 14px; line-height: 21px; } - .subheader { color: #777; } - - p { margin: 0 0 20px 0; } - p img { margin: 0; } - p.lead { font-size: 21px; line-height: 27px; color: #777; } - - em { font-style: italic; } - strong { font-weight: bold; color: #333; } - small { font-size: 80%; } - -/* Blockquotes */ - blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } - blockquote { margin: 0px; padding: 0px 20px 0 15px; border-left: 2px solid #ddd; } - blockquote cite { display: block; font-size: 12px; color: #555; } - blockquote cite:before { content: "\2014 \0020"; } - blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #0C84E8; } - - hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } - - -/* #Links -================================================== */ - a, a:visited { color: #333; text-decoration: underline; outline: 0; } - a:hover, a:focus { color: #000; } - p a, p a:visited { line-height: inherit; } - - -/* #Lists -================================================== */ - ul, ol { margin-bottom: 20px; } - ul { list-style: none outside; } - ol { list-style: decimal; } - ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } - ul.square { list-style: square outside; } - ul.circle { list-style: circle outside; } - ul.disc { list-style: disc outside; } - ul ul, ul ol, - ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } - ul ul li, ul ol li, - ol ol li, ol ul li { margin-bottom: 6px; } - li { line-height: 18px; margin-bottom: 12px; } - ul.large li { line-height: 21px; } - li p { line-height: 21px; } - -/* #Images -================================================== */ - - img.scale-with-grid { - max-width: 100%; - height: auto; } - - -/* #Buttons -================================================== */ - - a.button, - button, - input[type="submit"], - input[type="reset"], - input[type="button"] { - background: #eee; /* Old browsers */ - background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ - background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ - background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ - background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ - background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ - background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ - border: 1px solid #aaa; - border-top: 1px solid #ccc; - border-left: 1px solid #ccc; - padding: 4px 12px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - color: #444; - display: inline-block; - font-size: 11px; - font-weight: bold; - text-decoration: none; - text-shadow: 0 1px rgba(255, 255, 255, .75); - cursor: pointer; - margin-bottom: 20px; - line-height: 21px; - font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } - - a.button:hover, - button:hover, - input[type="submit"]:hover, - input[type="reset"]:hover, - input[type="button"]:hover { - color: #222; - background: #ddd; /* Old browsers */ - background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ - background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ - background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ - background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ - background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ - background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ - border: 1px solid #888; - border-top: 1px solid #aaa; - border-left: 1px solid #aaa; } - - a.button:active, - button:active, - input[type="submit"]:active, - input[type="reset"]:active, - input[type="button"]:active { - border: 1px solid #666; - background: #ccc; /* Old browsers */ - background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ - background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ - background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ - background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ - background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ - background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } - - .button.full-width, - button.full-width, - input[type="submit"].full-width, - input[type="reset"].full-width, - input[type="button"].full-width { - width: 100%; - padding-left: 0 !important; - padding-right: 0 !important; - text-align: center; } - - -/* #Tabs (activate in tabs.js) -================================================== */ - ul.tabs { - display: block; - margin: 0 0 20px 0; - padding: 0; - border-bottom: solid 1px #ddd; } - ul.tabs li { - display: block; - width: auto; - height: 30px; - padding: 0; - float: left; - margin-bottom: 0; } - ul.tabs li a { - display: block; - text-decoration: none; - width: auto; - height: 29px; - padding: 0px 20px; - line-height: 30px; - border: solid 1px #ddd; - border-width: 1px 1px 0 0; - margin: 0; - background: #f5f5f5; - font-size: 13px; } - ul.tabs li a.active { - background: #fff; - height: 30px; - position: relative; - top: -4px; - padding-top: 4px; - border-left-width: 1px; - margin: 0 0 0 -1px; - color: #111; - -moz-border-radius-topleft: 2px; - -webkit-border-top-left-radius: 2px; - border-top-left-radius: 2px; - -moz-border-radius-topright: 2px; - -webkit-border-top-right-radius: 2px; - border-top-right-radius: 2px; } - ul.tabs li:first-child a.active { - margin-left: 0; } - ul.tabs li:first-child a { - border-width: 1px 1px 0 1px; - -moz-border-radius-topleft: 2px; - -webkit-border-top-left-radius: 2px; - border-top-left-radius: 2px; } - ul.tabs li:last-child a { - -moz-border-radius-topright: 2px; - -webkit-border-top-right-radius: 2px; - border-top-right-radius: 2px; } - - ul.tabs-content { margin: 0; display: block; } - ul.tabs-content > li { display:none; } - ul.tabs-content > li.active { display: block; } - - /* Clearfixing tabs for beautiful stacking */ - ul.tabs:before, - ul.tabs:after { - content: '\0020'; - display: block; - overflow: hidden; - visibility: hidden; - width: 0; - height: 0; } - ul.tabs:after { - clear: both; } - ul.tabs { - zoom: 1; } - - -/* #Forms -================================================== */ - - form { - margin-bottom: 20px; } - fieldset { - margin-bottom: 20px; } - input[type="text"], - input[type="password"], - input[type="email"], - textarea, - select { - border: 1px solid #ccc; - padding: 6px 4px; - outline: none; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #777; - margin: 0; - width: 210px; - max-width: 100%; - display: block; - margin-bottom: 20px; - background: #fff; } - select { - padding: 0; } - input[type="text"]:focus, - input[type="password"]:focus, - input[type="email"]:focus, - textarea:focus { - border: 1px solid #aaa; - color: #444; - -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); - -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); - box-shadow: 0 0 3px rgba(0,0,0,.2); } - textarea { - min-height: 60px; } - label, - legend { - display: block; - font-weight: bold; - font-size: 13px; } - select { - width: 220px; } - input[type="checkbox"] { - display: inline; } - label span, - legend span { - font-weight: normal; - font-size: 13px; - color: #444; } - -/* #Misc -================================================== */ - .remove-bottom { margin-bottom: 0 !important; } - .half-bottom { margin-bottom: 10px !important; } - .add-bottom { margin-bottom: 20px !important; } - - diff --git a/_includes/css/font-awesome.css b/_includes/css/font-awesome.css deleted file mode 100644 index 389f3b7..0000000 --- a/_includes/css/font-awesome.css +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * Font Awesome 3.1.0 - * the iconic font designed for Bootstrap - * ------------------------------------------------------- - * The full suite of pictographic icons, examples, and documentation - * can be found at: http://fontawesome.io - * - * License - * ------------------------------------------------------- - * - The Font Awesome font is licensed under the SIL Open Font License v1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 License - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - - * Contact - * ------------------------------------------------------- - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/fortaweso_me - * Work: Lead Product Designer @ http://kyruus.com - */@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.1.0');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.1.0') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em}[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em}a [class^="icon-"],a [class*=" icon-"],a [class^="icon-"]:before,a [class*=" icon-"]:before{display:inline}[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.2857142857142858em;text-align:center}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.5714285714285714em}ul.icons-ul{list-style-type:none;text-indent:-0.7142857142857143em;margin-left:2.142857142857143em}ul.icons-ul>li .icon-li{width:.7142857142857143em;display:inline-block;text-align:center}[class^="icon-"].hide,[class*=" icon-"].hide{display:none}.icon-muted{color:#eee}.icon-light{color:#fff}.icon-dark{color:#333}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.pull-right{float:right}.pull-left{float:left}[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0 0;background-repeat:repeat;margin-top:0}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none}.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em}.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block}.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em}.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em}.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em}.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em}.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em}.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em}.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em}.icon-stack .icon-stack-base{font-size:2em;*line-height:1em}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)}.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.icon-flip-horizontal:before{-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical:before{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-repeat:before,.icon-rotate-right:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-share-alt:before,.icon-mail-forward:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope-alt:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-undo:before,.icon-rotate-left:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-reply:before,.icon-mail-reply:before{content:"\f112"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"} \ No newline at end of file diff --git a/_includes/css/layout.css b/_includes/css/layout.css deleted file mode 100644 index 572c8f6..0000000 --- a/_includes/css/layout.css +++ /dev/null @@ -1,74 +0,0 @@ -/* -* Skeleton V1.1 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 8/17/2011 -*/ - -/* Smaller than standard 960 (devices and browsers) */ -@media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } -} - -/* Tablet Portrait size to standard 960 (devices and browsers) */ -@media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 160px; } - .sidebar h2 { - font-size: 18px; - } - - .sidebar ul { - font-size: 14px; - } -} - -/* All Mobile Sizes (devices and browser) */ -@media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - #logo { text-align: left; } - .sidebar { - display: none; - } - .content { - border: 0px; - padding-left: 0px; - } -} - -/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ -@media only screen and (min-width: 480px) and (max-width: 767px) { - .sidebar { - display: none; - } - - h1 { - font-size: 28px; - line-height: 36px; - } -} - -/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ -@media only screen and (max-width: 479px) { - .sidebar { - display: none; - } - - h1 { - font-size: 24px; - line-height: 32px; - } - - h2 { - font-size: 22px; - line-height: 24px; - } -} \ No newline at end of file diff --git a/_includes/css/screen.css b/_includes/css/screen.css deleted file mode 100644 index 611e6af..0000000 --- a/_includes/css/screen.css +++ /dev/null @@ -1,285 +0,0 @@ -* { - margin: 0; - padding: 0; -} - -html, body { - height: 100%; -} - -body { - font-size: 16px; - background-color: white; - color: #222222; - line-height: 24px; - margin: 0; - border-top: 7px solid #0C84E8; -} - -h1, h2, h3, h4, h5, h6 { - color: #181818; - font-family: "open sans", sans-serif; - font-weight: 600; -} - -h1.title { - font-weight: 800; -} - -h1 { - font-size: 32px; - line-height: 40px; -} - -h2 { - font-size: 24px; - line-height: 30px; -} - -h3 { - font-size: 21px; - line-height: 24px; - margin: 1em 0; -} - -ul { - margin: 1em 0; - list-style: disc; -} - -a { - color: #0C84E8; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -a:visited { - color: #0C84E8; -} - -table { - font-size: inherit; - font: 100%; -} - -img { - display: block; - margin-left: auto; - margin-right: auto; -} - -ul.posts { - margin-top: 0; - list-style-type: none; - margin-bottom: 10px; -} - -ul.posts li { - line-height: 22px; - font-size: 16px; - margin-bottom: 0px; -} - -ul.posts span { - font-family: 'Lucida Console', 'Andale Mono', monospace; - color: #aaa; - padding-right: 5px; - font-size:14px; -} - -.meta { - color: #aaa; - margin: 0 0 10px 0; -} - -.site .footer { - font-size: 80%; - color: #666; - border-top: 4px solid #eee; - overflow: hidden; -} - -nav h1, nav h2 { - text-align: center; -} - -nav hr { - margin-top: 10px; - margin-bottom: 15px; - border: dotted #ddd; - border-width: 1px 0 0; -} - -#social { - margin-bottom: 10px; - font-size: 13px; -} - -#post pre { - border: 1px solid #ddd; - background-color: #eef; - padding: 0 .4em; - margin-bottom: 20px !important; -} - -#post ul, -#post ol { - margin-left: 1.35em; -} - -#post code { - border: 1px solid #ddd; - background-color: #eef; - font-size: 85%; - padding: 0 .2em; -} - -#post pre code { - border: none; -} - -.book-writeup p img { - padding: 5px; - border: 1px solid #AAA; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); -} - -.pic img { - padding: 5px; - border: 1px solid #AAA; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - margin-bottom: 15px; -} - -.project-date { - color: #aaa !important; - font-family: Monaco, "Courier New", monospace; - font-size: 80%; - font-weight: normal; -} - -.sidebar { - padding-top: 25px; - font-family: "open sans", sans-serif; -} - -.sidebar p { - font-weight: 200; -} - -.sidebar a { - font-weight: 600; -} - -.content { - font: 400 16px/22px "open sans", sans-serif; - border-left: 1px solid #DDD; - padding-left: 40px; - padding-top: 25px; -} - -.footer { - width: 100%; -} - -.footer { - font-size: 80%; - color: #666; - border-top: 4px solid #EEE; - overflow: hidden; -} - -.gist { - font-size: 12px !important; -} - -sup { - vertical-align: super; - font-size: smaller; -} - -.aside { - font-size: 75%; - color: #666; -} - -#blog-posts a, #talk-posts a, #book-posts a { - color: #333; -} - -#blog-posts a:visited, #talk-posts a:visited, #book-posts a:visited { - color: #AAA; -} - -#home h2 { - color: #0C84E8; -} - -#logo { - margin-bottom: 25px; -} - -#stalker { - display: inline-block; - height: 18px; - margin-left: 5px; -} - -#stalker a { - width: 29px; - overflow: hidden; - float: left; -} - -#stalker i { - font-size: 28px; - margin-right: 5px; -} - -#stalker a:hover { - text-decoration: none; - color: #0C84E8; -} - -span.icon-hn { - font-family: "open sans", sans-serif; - line-height: 20px; - text-align: center; - font-weight: bold; - position: relative; - left: 7px; -} - -.home, #toggle-theme { - font-size: 24px; - float: right; - color: #AAA; -} - -.home:hover { - text-decoration: none; -} - -.disclaimer p { - margin-top: 5px; - font-size: 11px; - text-align: center; -} - -.footnotes { - font-size: 14px; - font-style: italic; -} - -.icon-overlay { - font-size: 16px !important; - position: relative; - bottom: 27px; - left: 5px; - color: white; -} diff --git a/_includes/css/skeleton.css b/_includes/css/skeleton.css deleted file mode 100644 index d0264a4..0000000 --- a/_includes/css/skeleton.css +++ /dev/null @@ -1,236 +0,0 @@ -/* -* Skeleton V1.1 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 8/17/2011 -*/ - - -/* Table of Contents -================================================== - #Base 960 Grid - #Tablet (Portrait) - #Mobile (Portrait) - #Mobile (Landscape) - #Clearing */ - - - -/* #Base 960 Grid -================================================== */ - - .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } - .column, .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } - .row { margin-bottom: 20px; } - - /* Nested Column Classes */ - .column.alpha, .columns.alpha { margin-left: 0; } - .column.omega, .columns.omega { margin-right: 0; } - - /* Base Grid */ - .container .one.column { width: 40px; } - .container .two.columns { width: 100px; } - .container .three.columns { width: 160px; } - .container .four.columns { width: 220px; } - .container .five.columns { width: 280px; } - .container .six.columns { width: 340px; } - .container .seven.columns { width: 400px; } - .container .eight.columns { width: 460px; } - .container .nine.columns { width: 520px; } - .container .ten.columns { width: 580px; } - .container .eleven.columns { width: 640px; } - .container .twelve.columns { width: 700px; } - .container .thirteen.columns { width: 760px; } - .container .fourteen.columns { width: 820px; } - .container .fifteen.columns { width: 880px; } - .container .sixteen.columns { width: 940px; } - - .container .one-third.column { width: 300px; } - .container .two-thirds.column { width: 620px; } - - /* Offsets */ - .container .offset-by-one { padding-left: 60px; } - .container .offset-by-two { padding-left: 120px; } - .container .offset-by-three { padding-left: 180px; } - .container .offset-by-four { padding-left: 240px; } - .container .offset-by-five { padding-left: 300px; } - .container .offset-by-six { padding-left: 360px; } - .container .offset-by-seven { padding-left: 420px; } - .container .offset-by-eight { padding-left: 480px; } - .container .offset-by-nine { padding-left: 540px; } - .container .offset-by-ten { padding-left: 600px; } - .container .offset-by-eleven { padding-left: 660px; } - .container .offset-by-twelve { padding-left: 720px; } - .container .offset-by-thirteen { padding-left: 780px; } - .container .offset-by-fourteen { padding-left: 840px; } - .container .offset-by-fifteen { padding-left: 900px; } - - - -/* #Tablet (Portrait) -================================================== */ - - /* Note: Design for a width of 768px */ - - @media only screen and (min-width: 768px) and (max-width: 959px) { - .container { width: 768px; } - .container .column, - .container .columns { margin-left: 10px; margin-right: 10px; } - .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } - .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } - - .container .one.column { width: 28px; } - .container .two.columns { width: 76px; } - .container .three.columns { width: 124px; } - .container .four.columns { width: 172px; } - .container .five.columns { width: 220px; } - .container .six.columns { width: 268px; } - .container .seven.columns { width: 316px; } - .container .eight.columns { width: 364px; } - .container .nine.columns { width: 412px; } - .container .ten.columns { width: 460px; } - .container .eleven.columns { width: 508px; } - .container .twelve.columns { width: 556px; } - .container .thirteen.columns { width: 604px; } - .container .fourteen.columns { width: 652px; } - .container .fifteen.columns { width: 700px; } - .container .sixteen.columns { width: 748px; } - - .container .one-third.column { width: 236px; } - .container .two-thirds.column { width: 492px; } - - /* Offsets */ - .container .offset-by-one { padding-left: 48px; } - .container .offset-by-two { padding-left: 96px; } - .container .offset-by-three { padding-left: 144px; } - .container .offset-by-four { padding-left: 192px; } - .container .offset-by-five { padding-left: 240px; } - .container .offset-by-six { padding-left: 288px; } - .container .offset-by-seven { padding-left: 336px; } - .container .offset-by-eight { padding-left: 348px; } - .container .offset-by-nine { padding-left: 432px; } - .container .offset-by-ten { padding-left: 480px; } - .container .offset-by-eleven { padding-left: 528px; } - .container .offset-by-twelve { padding-left: 576px; } - .container .offset-by-thirteen { padding-left: 624px; } - .container .offset-by-fourteen { padding-left: 672px; } - .container .offset-by-fifteen { padding-left: 720px; } - } - - -/* #Mobile (Portrait) -================================================== */ - - /* Note: Design for a width of 320px */ - - @media only screen and (max-width: 767px) { - .container { width: 300px; } - .columns, .column { margin: 0; } - - .container .one.column, - .container .two.columns, - .container .three.columns, - .container .four.columns, - .container .five.columns, - .container .six.columns, - .container .seven.columns, - .container .eight.columns, - .container .nine.columns, - .container .ten.columns, - .container .eleven.columns, - .container .twelve.columns, - .container .thirteen.columns, - .container .fourteen.columns, - .container .fifteen.columns, - .container .sixteen.columns, - .container .one-third.column, - .container .two-thirds.column { width: 300px; } - - /* Offsets */ - .container .offset-by-one, - .container .offset-by-two, - .container .offset-by-three, - .container .offset-by-four, - .container .offset-by-five, - .container .offset-by-six, - .container .offset-by-seven, - .container .offset-by-eight, - .container .offset-by-nine, - .container .offset-by-ten, - .container .offset-by-eleven, - .container .offset-by-twelve, - .container .offset-by-thirteen, - .container .offset-by-fourteen, - .container .offset-by-fifteen { padding-left: 0; } - - } - - -/* #Mobile (Landscape) -================================================== */ - - /* Note: Design for a width of 480px */ - - @media only screen and (min-width: 480px) and (max-width: 767px) { - .container { width: 420px; } - .columns, .column { margin: 0; } - - .container .one.column, - .container .two.columns, - .container .three.columns, - .container .four.columns, - .container .five.columns, - .container .six.columns, - .container .seven.columns, - .container .eight.columns, - .container .nine.columns, - .container .ten.columns, - .container .eleven.columns, - .container .twelve.columns, - .container .thirteen.columns, - .container .fourteen.columns, - .container .fifteen.columns, - .container .sixteen.columns, - .container .one-third.column, - .container .two-thirds.column { width: 420px; } - } - - -/* #Clearing -================================================== */ - - /* Self Clearing Goodness */ - .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } - - /* Use clearfix class on parent to clear nested columns, - or wrap each row of columns in a
*/ - .clearfix:before, - .clearfix:after, - .row:before, - .row:after { - content: '\0020'; - display: block; - overflow: hidden; - visibility: hidden; - width: 0; - height: 0; } - .row:after, - .clearfix:after { - clear: both; } - .row, - .clearfix { - zoom: 1; } - - /* You can also use a
to clear columns */ - .clear { - clear: both; - display: block; - overflow: hidden; - visibility: hidden; - width: 0; - height: 0; - } - - diff --git a/_includes/css/syntax.css b/_includes/css/syntax.css deleted file mode 100644 index ea306e7..0000000 --- a/_includes/css/syntax.css +++ /dev/null @@ -1,3 +0,0 @@ -.highlight{background-color:#073642;color:#93a1a1}.highlight .c{color:#586e75 !important;font-style:italic !important}.highlight .cm{color:#586e75 !important;font-style:italic !important}.highlight .cp{color:#586e75 !important;font-style:italic !important}.highlight .c1{color:#586e75 !important;font-style:italic !important}.highlight .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.highlight .err{color:#dc322f !important;background:none !important}.highlight .k{color:#cb4b16 !important}.highlight .o{color:#93a1a1 !important;font-weight:bold !important}.highlight .p{color:#93a1a1 !important}.highlight .ow{color:#2aa198 !important;font-weight:bold !important}.highlight .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.highlight .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.highlight .ge{color:#93a1a1 !important;font-style:italic !important}.highlight .gr{color:#aa0000}.highlight .gh{color:#586e75 !important}.highlight .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.highlight .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.highlight .go{color:#888888}.highlight .gp{color:#555555}.highlight .gs{color:#93a1a1 !important;font-weight:bold !important}.highlight .gu{color:#6c71c4 !important}.highlight .gt{color:#aa0000}.highlight .kc{color:#859900 !important;font-weight:bold !important}.highlight .kd{color:#268bd2 !important}.highlight .kp{color:#cb4b16 !important;font-weight:bold !important}.highlight .kr{color:#d33682 !important;font-weight:bold !important}.highlight .kt{color:#2aa198 !important}.highlight .n{color:#268bd2 !important}.highlight .na{color:#268bd2 !important}.highlight .nb{color:#859900 !important}.highlight .nc{color:#d33682 !important}.highlight .no{color:#b58900 !important}.highlight .ni{color:#800080}.highlight .nl{color:#859900 !important}.highlight .ne{color:#268bd2 !important;font-weight:bold !important}.highlight .nf{color:#268bd2 !important;font-weight:bold !important}.highlight .nn{color:#b58900 !important}.highlight .nt{color:#268bd2 !important;font-weight:bold !important}.highlight .nx{color:#b58900 !important}.highlight .bp{color:#999999}.highlight .vc{color:#008080}.highlight .vg{color:#268bd2 !important}.highlight .vi{color:#268bd2 !important}.highlight .nv{color:#268bd2 !important}.highlight .w{color:#bbbbbb}.highlight .mf{color:#2aa198 !important}.highlight .m{color:#2aa198 !important}.highlight .mh{color:#2aa198 !important}.highlight .mi{color:#2aa198 !important}.highlight .mo{color:#009999}.highlight .s{color:#2aa198 !important}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#2aa198 !important}.highlight .s2{color:#2aa198 !important}.highlight .se{color:#dc322f !important}.highlight .sh{color:#d14}.highlight .si{color:#268bd2 !important}.highlight .sx{color:#d14}.highlight .sr{color:#2aa198 !important}.highlight .s1{color:#2aa198 !important}.highlight .ss{color:#990073}.highlight .il{color:#009999}.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%} -pre { white-space: pre; overflow: auto; } -code, pre { font-family: Monaco,Menlo,Consolas,"Courier New",monospace; } \ No newline at end of file diff --git a/_includes/fine-print.html b/_includes/fine-print.html new file mode 100644 index 0000000..5cc0a27 --- /dev/null +++ b/_includes/fine-print.html @@ -0,0 +1,5 @@ +
+

+ built with , Jekyll, and GitHub Pages — read the fine print +

+
\ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html index 1fef35e..4acc26c 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,4 +1,40 @@ -
-

The postings on this site are my own and don't necessarily represent my - employer’s positions, strategies or opinions.

-
\ No newline at end of file + + +{% include fine-print.html %} diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..575b908 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/_includes/mailchimp.html b/_includes/mailchimp.html new file mode 100644 index 0000000..8b41f34 --- /dev/null +++ b/_includes/mailchimp.html @@ -0,0 +1,13 @@ + +
+
+ Hey there! I write a short, weekly-ish newsletter about + building awesome software and I'd love to have you as a reader. +
+
+ No spam, no selling your address. One click unsubscribe. +
+
+
+ + \ No newline at end of file diff --git a/_includes/sidebar.html b/_includes/sidebar.html deleted file mode 100644 index ebb3915..0000000 --- a/_includes/sidebar.html +++ /dev/null @@ -1,20 +0,0 @@ - \ No newline at end of file diff --git a/_includes/social.html b/_includes/social.html index 6554810..b931aee 100644 --- a/_includes/social.html +++ b/_includes/social.html @@ -1,10 +1,7 @@ Stalk Follow me: -
- - - - Y - - - + \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html index 9dba6a0..5205ec4 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -9,33 +9,29 @@ Matt Swanson - {{ page.title }} - + + - + + - + - - + {% if site.github %} + + {% else %} + + {% endif %} + {% seo %} -
- - -
- {{ content }} - - -
-
+
+ {{ content }} +
-{% include analytics.html %} + {% if site.github %} + {% include analytics.html %} + {% endif %} - \ No newline at end of file + diff --git a/_layouts/post.html b/_layouts/post.html index 59e4bfc..7c2cb24 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -2,28 +2,48 @@ layout: default --- -

{{ page.date | date: "%B %d, %Y" }} - -

-

{{ page.title }}

+{% include header.html %} +
+

+ {{ page.title }} +

-
-{{ content }} -
+ {% assign tag_count = page.tags | size %} +

+ {% if page.subtitle %} + {{ page.subtitle }} + {% elsif tag_count == 0 %} + {{ page.date | date: "%B %d, %Y" }} + {% else %} + + {% if tag_count > 0 %} + Series: + {% for sn in page.tags %} + {% if forloop.last %} + {{ sn | replace: "_", " " }} + {% else %} + {{ sn | replace: "_", " " }}, + {% endif %} + {% endfor %} + {% else %} +   + {% endif %} + -

+ + {{ page.date | date: "%B %d, %Y" }} + + {% endif %} +

-{% if page.disclaimer %} -
-

Disclaimer: Matt Swanson is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to amazon.com

-
-{% endif %} +
{{ content }}
+ {% unless page.skip_footer %} +
+ {% endunless %} +
+ +{% unless page.skip_footer %} + {% include footer.html %} +{% endunless %} \ No newline at end of file diff --git a/_layouts/writeup.html b/_layouts/writeup.html index 6ad09d4..3bee116 100644 --- a/_layouts/writeup.html +++ b/_layouts/writeup.html @@ -2,25 +2,49 @@ layout: default --- -

{{ page.date | date: "%B %d, %Y" }} - -

-

“{{ page.title }}” Book Writeup

+{% include header.html %} +
+

+ "{{ page.title }}" Book Writeup +

-
-{{ content }} -
+

+ {{ page.date | date: "%B %d, %Y" }} +

- +
+
+ {{page.title}} Book Cover -
-

Disclaimer: Matt Swanson is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to amazon.com

-
+ {% assign full_title = page.title %} + {% if page.full_title %} + {% assign full_title = page.full_title %} + {% endif %} + + {% if page.book_link %} + + {{ full_title }} + + {% else %} + + {{ full_title }} + + {% endif %} + + {{ page.author }} + + {% if page.isbn %} + ISBN: {{ page.isbn }} + {% endif %} +
+ +
+ + {{ content }} +
+ +
+
+ +{% include footer.html %} \ No newline at end of file diff --git a/_pages/morale.md b/_pages/morale.md new file mode 100644 index 0000000..7d9757b --- /dev/null +++ b/_pages/morale.md @@ -0,0 +1,28 @@ +--- +layout: post +title: "MoraleApp Retrospective" +permalink: "/morale/" +--- + +MoraleApp was a no-hassle team mood tracker designed to help agile teams monitor and detect morale issues. Every day, team members were polled about how they were feeling and pick either "good", "meh", or "bad". In addition to collecting mood data, MoraleApp found trends and patterns and provided tips on improving low morale. + +We started with a paper prototype posted on the wall near one team in our office. The idea spread to other teams within the company and I soon built software to automate and anonymize the daily survey. After seeing success internally, I opened up access to the public and launched the product as a free service. + +Over the next four years I added features and slowly grew the product in my spare time between projects. + +![]({{site.url}}/static/morale-team-view.png) + +![]({{site.url}}/static/morale-trend-graph.png) + +Product stats + +* Over 1600 companies signed up to use the service +* Those companies created 2300 teams +* Sent over 2.5 million daily email surveys and collected over 1 million mood responses +* At the peak, over 7000 daily participants logging their mood + +--- + +As part of a four-month rotation as a product manager, I worked on monetizing MoraleApp with the hope of it becoming self-sustaining. In the end, we did not see enough traction to continue investing time and money in the product at the end of the experiment. MoraleApp was shut down on Dec 31, 2016. + +MoraleApp was built with Ruby on Rails, Bootstrap, and Highcharts and deployed to Heroku. Email delivery was handled by Mandrill, payments handled by Stripe. \ No newline at end of file diff --git a/_posts/2010-10-24-weekly-noise.markdown b/_posts/2010-10-24-weekly-noise.markdown index ff7e3b7..8cbaed4 100644 --- a/_posts/2010-10-24-weekly-noise.markdown +++ b/_posts/2010-10-24-weekly-noise.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise - Week 1 categories: - blog +tags: +- worklog --- I was recently inspired by [this post](http://techblog.ironfroggy.com/2010/10/weekly-noise-quiet-before-storm.html), which lays out an interesting "discipline" for working on side-projects. The basic idea is to set aside time each weekend to plan out what project you are going to work on during the coming week. Then, after the diff --git a/_posts/2010-10-25-pragmatic-programmer.markdown b/_posts/2010-10-25-pragmatic-programmer.markdown index 978fb31..d081821 100644 --- a/_posts/2010-10-25-pragmatic-programmer.markdown +++ b/_posts/2010-10-25-pragmatic-programmer.markdown @@ -1,14 +1,12 @@ --- layout: writeup title: Pragmatic Programmer +full_title: "The Pragmatic Programmer: From Journeyman to Master" +author: Andrew Hunt and David Thomas +isbn: 020161622X +image: pragmatic-programmer.jpg categories: - writeup ---- -![](/static/pragmatic-programmer.jpg) -[The Pragmatic Programmer: From Journeyman to Master](http://www.amazon.com/exec/obidos/ASIN/020161622X/ref=nosim&tag=bookreview0a1-20) -Andrew Hunt and David Thomas -ISBN: 020161622X - --- **What's the point?** diff --git a/_posts/2010-10-26-apprenticeship-patterns.markdown b/_posts/2010-10-26-apprenticeship-patterns.markdown index eb9b022..15416b2 100644 --- a/_posts/2010-10-26-apprenticeship-patterns.markdown +++ b/_posts/2010-10-26-apprenticeship-patterns.markdown @@ -1,14 +1,13 @@ --- layout: writeup title: Apprenticeship Patterns +full_title: "Apprenticeship Patterns: Guidance for Aspiring Software Craftsman" +author: "Dave Hoover, Adewale Oshineye" +isbn: 0596518382 +image: apprenticeship-patterns.png categories: - writeup ---- -![](/static/apprenticeship-patterns.png) -[Apprenticeship Patterns: Guidance for Aspiring Software Craftsman](http://www.amazon.com/exec/obidos/ASIN/0596518382/ref=nosim&tag=bookreview0a1-20) -Dave Hoover, Adewale Oshineye -ISBN: 0596518382 - +favorite: true --- **What's the point?** @@ -32,5 +31,4 @@ stage in their career. The parts about making your own career roadmap are very (under 200 pages) so you could easily tackle it in a weekend. --- -Notes: I read this entirely on my Kindle and there were no issues. This book is also available online on the -[O'Reilley Open Feedback Publishing System](http://apprenticeship-patterns.labs.oreilly.com/). \ No newline at end of file +Notes: I read this entirely on my Kindle and there were no issues. This book is also available online on [O'Reilly Chimera Labs](http://chimera.labs.oreilly.com/books/1234000001813/index.html). diff --git a/_posts/2010-10-26-pro-git.markdown b/_posts/2010-10-26-pro-git.markdown index 2411a41..31c640e 100755 --- a/_posts/2010-10-26-pro-git.markdown +++ b/_posts/2010-10-26-pro-git.markdown @@ -1,14 +1,11 @@ --- layout: writeup title: Pro Git +image: pro-git.png +author: Scott Chacon +isbn: 1430218339 categories: - writeup ---- -![](/static/pro-git.png) -[Pro Git](http://www.amazon.com/exec/obidos/ASIN/1430218339/ref=nosim&tag=bookreview0a1-20) -Scott Chacon -ISBN: 1430218339 - --- **What's the point?** diff --git a/_posts/2010-10-27-hackers-and-painters.markdown b/_posts/2010-10-27-hackers-and-painters.markdown index 65e35b1..925d973 100644 --- a/_posts/2010-10-27-hackers-and-painters.markdown +++ b/_posts/2010-10-27-hackers-and-painters.markdown @@ -1,14 +1,11 @@ --- layout: writeup title: Hackers & Painters +full_title: "Hackers & Painters: Big Ideas from the Computer Age" +author: Paul Graham +isbn: 0596006624 categories: - writeup ---- -![](/static/hackers-and-painters.png) -[Hackers & Painters: Big Ideas from the Computer Age](http://www.amazon.com/exec/obidos/ASIN/1449389554/ref=nosim&tag=bookreview0a1-20) -Paul Graham -ISBN: 0596006624 - --- **What's the point?** diff --git a/_posts/2010-10-28-getting-real.markdown b/_posts/2010-10-28-getting-real.markdown index ba6370e..cb3ecd3 100755 --- a/_posts/2010-10-28-getting-real.markdown +++ b/_posts/2010-10-28-getting-real.markdown @@ -1,14 +1,12 @@ --- layout: writeup title: Getting Real +image: getting-real.png +author: 37 Signals +isbn: 0578012812 categories: - writeup ---- -![](/static/getting-real.png) -[Getting Real](http://www.amazon.com/exec/obidos/ASIN/0578012812/ref=nosim&tag=bookreview0a1-20) -37 Signals -ISBN: 0578012812 - +favorite: true --- **What's the point?** diff --git a/_posts/2010-10-28-podcast-roundup.markdown b/_posts/2010-10-28-podcast-roundup.markdown index 4f2ea7b..5d6880c 100755 --- a/_posts/2010-10-28-podcast-roundup.markdown +++ b/_posts/2010-10-28-podcast-roundup.markdown @@ -3,6 +3,8 @@ layout: post title: Podcast Roundup categories: - blog +tags: +- misc --- I have a confession to make...I am a podcast-aholic. I have a 30 minute commute to and from the office every day diff --git a/_posts/2010-10-31-weekly-noise-1-recap.markdown b/_posts/2010-10-31-weekly-noise-1-recap.markdown index fbb6c14..c176993 100644 --- a/_posts/2010-10-31-weekly-noise-1-recap.markdown +++ b/_posts/2010-10-31-weekly-noise-1-recap.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise - Week 1 Recap categories: - blog +tags: +- worklog --- Its been a week since I started my first [Weekly Noise](http://mdswanson.com/blog/2010/10/24/weekly-noise.html) diff --git a/_posts/2010-10-31-weekly-noise-2-so-its-like-a-screensaver.markdown b/_posts/2010-10-31-weekly-noise-2-so-its-like-a-screensaver.markdown index aaa64f3..0e95816 100644 --- a/_posts/2010-10-31-weekly-noise-2-so-its-like-a-screensaver.markdown +++ b/_posts/2010-10-31-weekly-noise-2-so-its-like-a-screensaver.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise 2 - "So it's like a screensaver..." categories: - blog +tags: +- worklog --- I will be moving offices in January and as part of the new design, the office diff --git a/_posts/2010-11-02-more-joel-on-software.markdown b/_posts/2010-11-02-more-joel-on-software.markdown index 711b358..b7183aa 100755 --- a/_posts/2010-11-02-more-joel-on-software.markdown +++ b/_posts/2010-11-02-more-joel-on-software.markdown @@ -1,14 +1,11 @@ --- layout: writeup title: More Joel on Software +author: Joel Spolsky +isbn: 1430209879 +image: more-joel.png categories: - writeup ---- -![](/static/more-joel.png) -[More Joel on Software](http://www.amazon.com/exec/obidos/ASIN/1430209879/ref=nosim&tag=bookreview0a1-20) -Joel Spolsky -ISBN: 1430209879 - --- **What's the point?** diff --git a/_posts/2010-11-14-weekly-noise-3-recap.markdown b/_posts/2010-11-14-weekly-noise-3-recap.markdown index c57bd27..d83005c 100644 --- a/_posts/2010-11-14-weekly-noise-3-recap.markdown +++ b/_posts/2010-11-14-weekly-noise-3-recap.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise 3 Recap/Weekly Noise 4 - Hitting a roadblock categories: - blog +tags: +- worklog --- I ran into some issues this week. The first task that I tried to tackle was diff --git a/_posts/2010-11-22-weekly-noise-4-project-complete.markdown b/_posts/2010-11-22-weekly-noise-4-project-complete.markdown index c9fee92..3ae18d2 100644 --- a/_posts/2010-11-22-weekly-noise-4-project-complete.markdown +++ b/_posts/2010-11-22-weekly-noise-4-project-complete.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise 4 Recap - Glorified Screensaver - Post Mortem categories: - blog +tags: +- worklog --- I was just about to give up on my diff --git a/_posts/2010-11-3-sipping-the-nodejs-koolaid.markdown b/_posts/2010-11-3-sipping-the-nodejs-koolaid.markdown index 30a3868..4b4139d 100644 --- a/_posts/2010-11-3-sipping-the-nodejs-koolaid.markdown +++ b/_posts/2010-11-3-sipping-the-nodejs-koolaid.markdown @@ -3,6 +3,8 @@ layout: post title: Building a Javascript web app, or sipping the node.js koolaid categories: - blog +tags: +- worklog --- I've been toying around with the idea of building a diff --git a/_posts/2010-11-7-weekly-noise-2-recap.markdown b/_posts/2010-11-7-weekly-noise-2-recap.markdown index a3eeb3f..7fb47b5 100644 --- a/_posts/2010-11-7-weekly-noise-2-recap.markdown +++ b/_posts/2010-11-7-weekly-noise-2-recap.markdown @@ -3,7 +3,10 @@ layout: post title: Weekly Noise 2 Recap - alert("It's working!"); categories: - blog +tags: +- worklog --- + The past week I have been working on a [web-based "announcement board"](http://mdswanson.com/blog/2010/10/31/weekly-noise-2-so-its-like-a-screensaver.html) using a [slew of Javascript libraries](http://mdswanson.com/blog/2010/11/03/sipping-the-nodejs-koolaid.html). diff --git a/_posts/2010-11-8-weekly-noise-3-so-its-like-a-screensaver-part2.markdown b/_posts/2010-11-8-weekly-noise-3-so-its-like-a-screensaver-part2.markdown index 94a4d38..20c194c 100644 --- a/_posts/2010-11-8-weekly-noise-3-so-its-like-a-screensaver-part2.markdown +++ b/_posts/2010-11-8-weekly-noise-3-so-its-like-a-screensaver-part2.markdown @@ -3,6 +3,8 @@ layout: post title: Weekly Noise 3 - "So it's like a screensaver..." (Part II) categories: - blog +tags: +- worklog --- I got a lot done [last week](http://mdswanson.com/blog/2010/11/07/weekly-noise-2-recap.html) and I am really liking the **Weekly Noise** format. I've even got a new idea diff --git a/_posts/2010-12-5-envisioning-information.markdown b/_posts/2010-12-5-envisioning-information.markdown index 980d946..1cdb1d3 100644 --- a/_posts/2010-12-5-envisioning-information.markdown +++ b/_posts/2010-12-5-envisioning-information.markdown @@ -1,17 +1,13 @@ --- layout: writeup title: Envisioning Information +image: ei.png +author: Edward Tufte +isbn: 0961392118 categories: - writeup --- -![](/static/ei.png) -[Envisioning Information](http://www.amazon.com/exec/obidos/ASIN/0961392118/ref=nosim&tag=bookreview0a1-20) -Edward Tufte -ISBN: 0961392118 - ---- - **What's the point?** The book is an exploration of how to best present visual information in a variety of mediums. The book covers six main topics and presents examples @@ -31,7 +27,6 @@ also liked the discussion of negative margins and how `1+1=3 or more`. Some of the other sections (like the map/cartography related ones) were certainly interesting, but I didn't really take away anything that useful. - **Who should read it?** The book is skewed more towards designers, but it is a quick read (lots of pictures and under 200 pages). I would recommend it to a developer with an diff --git a/_posts/2011-02-22-how-hackernews-ruined-my-morning.md b/_posts/2011-02-22-how-hackernews-ruined-my-morning.md index 16c452a..bff1ca8 100755 --- a/_posts/2011-02-22-how-hackernews-ruined-my-morning.md +++ b/_posts/2011-02-22-how-hackernews-ruined-my-morning.md @@ -3,6 +3,8 @@ layout: post title: How HackerNews ruined my morning categories: - blog +tags: +- reflections --- Derek Sivers once wrote that ["ideas are just a multiplier of execution"](http://sivers.org/multiply). diff --git a/_posts/2011-04-17-moonwalking-with-einstein.md b/_posts/2011-04-17-moonwalking-with-einstein.md index c500eca..f6c16f4 100755 --- a/_posts/2011-04-17-moonwalking-with-einstein.md +++ b/_posts/2011-04-17-moonwalking-with-einstein.md @@ -1,14 +1,12 @@ --- layout: writeup title: Moonwalking with Einstein +full_title: "Moonwalking with Einstein: The Art and Science of Remembering Everything" +image: moonwalking-with-einstein.jpg +author: Joshua Foer +isbn: 9781594202292 categories: - writeup ---- -![](/static/moonwalking-with-einstein.jpg) -[Moonwalking with Einstein: The Art and Science of Remembering Everything](http://www.amazon.com/exec/obidos/ASIN/0143120530/ref=nosim&tag=bookreview0a1-20) -Joshua Foer -ISBN: 9781594202292 - --- **What's the point?** diff --git a/_posts/2011-05-02-markdown-tools-talk.md b/_posts/2011-05-02-markdown-tools-talk.md deleted file mode 100644 index aa9e66a..0000000 --- a/_posts/2011-05-02-markdown-tools-talk.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Writing with Markdown - Brownbag -categories: -- talk -permalink: /talks/markdown-tools/index.html ---- - diff --git a/_posts/2011-05-16-podcast-roundup-ii.md b/_posts/2011-05-16-podcast-roundup-ii.md index c7668b0..d41475b 100644 --- a/_posts/2011-05-16-podcast-roundup-ii.md +++ b/_posts/2011-05-16-podcast-roundup-ii.md @@ -3,6 +3,8 @@ layout: post title: Podcast Roundup II categories: - blog +tags: +- misc --- I've found a couple new podcasts that I have been listening to and wanted to share. I am diff --git a/_posts/2011-05-30-startups-open-sourced.md b/_posts/2011-05-30-startups-open-sourced.md index 259182e..2ba64fd 100644 --- a/_posts/2011-05-30-startups-open-sourced.md +++ b/_posts/2011-05-30-startups-open-sourced.md @@ -1,16 +1,13 @@ --- layout: writeup title: Startups Open Sourced +author: Jared Tame +image: startups-opensourced.png +book_link: http://www.startupsopensourced.com categories: - writeup --- -![](/static/startups-opensourced.png) -[Startups Open Sourced](http://www.startupsopensourced.com/) -Jared Tame - ---- - **What's the point?** Interviews with startup founders about their experiences and advice they would give. The open sourced part of the title comes from the idea that these founders are opening up and sharing some of their secrets diff --git a/_posts/2011-06-09-personal-kanban.md b/_posts/2011-06-09-personal-kanban.md index 89ac5f5..a7a9ac1 100644 --- a/_posts/2011-06-09-personal-kanban.md +++ b/_posts/2011-06-09-personal-kanban.md @@ -1,17 +1,14 @@ --- layout: writeup title: Personal Kanban +full_title: "Personal Kanban - Mapping Work, Navigating Life" +author: "Jim Benson, Tonianne DeMaria Barry" +isbn: 1453802266 +image: personal-kanban.png categories: - writeup --- -![](/static/personal-kanban.png) -[Personal Kanban - Mapping Work, Navigating Life](http://www.amazon.com/exec/obidos/ASIN/1453802266/ref=nosim&tag=bookreview0a1-20) -Jim Benson & Tonianne DeMaria Barry -ISBN: 1453802266 - ---- - **What's the point?** The book focuses on the how and why of using Kanban in both personal and team-oriented settings. It lays out the fundamentals of creating a Kanban board and then digs into the reason why concepts like limiting WIP diff --git a/_posts/2011-07-02-inspired.md b/_posts/2011-07-02-inspired.md index 239943e..4c89abd 100644 --- a/_posts/2011-07-02-inspired.md +++ b/_posts/2011-07-02-inspired.md @@ -1,17 +1,14 @@ --- layout: writeup title: Inspired +full_title: "Inspired: How to Create Products Customers Love" +author: Marty Cagan +isbn: 0981690408 +image: inspired.png categories: - writeup --- -![](/static/inspired.png) -[Inspired: How to Create Products Customers Love](http://www.amazon.com/exec/obidos/ASIN/0981690408/ref=nosim&tag=bookreview0a1-20) -Marty Cagan -ISBN: 0981690408 - ---- - **What's the point?** The book has tons of practical advice and techniques for creating software products. The main point is that great software begins by first discovering whether it will be feasible, usability and provide value to the diff --git a/_posts/2011-07-04-little-bets.md b/_posts/2011-07-04-little-bets.md index d4e3f61..ac3fa7b 100644 --- a/_posts/2011-07-04-little-bets.md +++ b/_posts/2011-07-04-little-bets.md @@ -1,17 +1,14 @@ --- layout: writeup title: Little Bets +full_title: "Little Bets: How Breakthrough Ideas Emerge from Small Discoveries" +author: Peter Sims +isbn: 9781439170427 +image: little-bets.jpg categories: - writeup --- -![](/static/little-bets.jpg) -[Little Bets: How Breakthrough Ideas Emerge from Small Discoveries](http://www.amazon.com/exec/obidos/ASIN/1439170428/ref=nosim&tag=bookreview0a1-20) -Peter Sims -ISBN: 9781439170427 - ---- - **What's the point?** The book is about making deliberate, small bets to achieve a desirable end result. The idea is to get critical feedback without investing extraneous time or money. By failing fast and learning from the mistakes, diff --git a/_posts/2011-07-09-digging-around-the-github-v3-api.md b/_posts/2011-07-09-digging-around-the-github-v3-api.md index d3e2bd4..2a8e6c8 100644 --- a/_posts/2011-07-09-digging-around-the-github-v3-api.md +++ b/_posts/2011-07-09-digging-around-the-github-v3-api.md @@ -3,6 +3,8 @@ layout: post title: Digging around the Github v3 API categories: - blog +tags: +- worklog --- I've had a little project idea brewing for a while that would require diff --git a/_posts/2011-07-23-digging-around-the-github-api-take-2.md b/_posts/2011-07-23-digging-around-the-github-api-take-2.md index 2337a3a..efbe069 100644 --- a/_posts/2011-07-23-digging-around-the-github-api-take-2.md +++ b/_posts/2011-07-23-digging-around-the-github-api-take-2.md @@ -3,6 +3,8 @@ layout: post title: Making a commit with the Github API categories: - blog +tags: +- worklog --- The [last time I was playing around with the Github API][1] I was able to pull diff --git a/_posts/2011-08-04-ship-it.md b/_posts/2011-08-04-ship-it.md index 0b9c357..8d036a1 100644 --- a/_posts/2011-08-04-ship-it.md +++ b/_posts/2011-08-04-ship-it.md @@ -1,17 +1,14 @@ --- layout: writeup title: Ship It! +full_title: "Ship It! A Practical Guide to Successful Software Projects" +author: "Jared Richardson and William Gwaltney Jr." +isbn: 0974514047 +image: ship-it.jpg categories: - writeup --- -![](/static/ship-it.jpg) -[Ship It! A Practical Guide to Successful Software Projects][0] -Jared Richardson and William Gwaltney Jr. -ISBN: 0974514047 - ---- - **What's the point?** The book has three main sections: tools and infrastructure, project techniques, and problem/solution anecdotes. @@ -41,6 +38,5 @@ hindsight I think I could have skipped this one without missing out on much. Developers who are unhappy with how their team is currently operating, developers who want to introduce best practices but aren't sure how to get buy-in -[0]: http://www.amazon.com/exec/obidos/ASIN/0974514047/ref=nosim&tag=bookreview0a1-20 [1]: /writeup/2010/10/25/pragmatic-programmer.html [2]: http://pragprog.com/book/mnee/release-it diff --git a/_posts/2011-08-21-update-on-lanyon-crossdomain-ajax-posts.md b/_posts/2011-08-21-update-on-lanyon-crossdomain-ajax-posts.md index 09a7255..2ccdb90 100644 --- a/_posts/2011-08-21-update-on-lanyon-crossdomain-ajax-posts.md +++ b/_posts/2011-08-21-update-on-lanyon-crossdomain-ajax-posts.md @@ -3,6 +3,8 @@ layout: post title: Update on Lanyon + Cross-domain AJAX POSTs with CORS categories: - blog +tags: +- worklog --- An update is long past due on [Lanyon][lanyon-repo] (my Jeykll WYSIWYG editor project) so here diff --git a/_posts/2011-09-22-my-take-on-interviewing-and-the-hiring-process.md b/_posts/2011-09-22-my-take-on-interviewing-and-the-hiring-process.md index 0eda206..2e95911 100644 --- a/_posts/2011-09-22-my-take-on-interviewing-and-the-hiring-process.md +++ b/_posts/2011-09-22-my-take-on-interviewing-and-the-hiring-process.md @@ -3,6 +3,8 @@ layout: post title: My take on interviewing and the hiring process categories: - blog +tags: +- practices --- There seem to be few topics that illicit a stronger reaction from developers than @@ -55,13 +57,12 @@ one "right way" to being a developer, each person has their [own path][path]. [path]: http://ofps.oreilly.com/titles/9780596518387/walking_the_long_road.html Contrarian Carl says: ->In my past job I worked on a proprietary, closed source project and I signed a NDA! I can't show ->you any of it. + +>In my past job I worked on a proprietary, closed source project and I signed a NDA! I can't show you any of it. or... ->I'm not a single 20-something that programs in my free time. I have a family and other hobbies, ->and I want to decompress and relax in the evening, not write more code. +>I'm not a single 20-something that programs in my free time. I have a family and other hobbies, and I want to decompress and relax in the evening, not write more code. No problem, those are completely valid reasons. Move on to the next option. @@ -119,13 +120,12 @@ the job. If the candidate is struggling with this task and can't demonstrate com in another way, it should be a huge red flag. Contrarian Carl says: ->I'm no good under pressure. I like to think through code before I write it; it takes me ->a few hours/days to get productive in a new code base. + +>I'm no good under pressure. I like to think through code before I write it; it takes me a few hours/days to get productive in a new code base. or... ->That sounds like it's going to take half a day. You expect me to take paid time off from ->my current job to drive/fly to your office just for an interview? +>That sounds like it's going to take half a day. You expect me to take paid time off from my current job to drive/fly to your office just for an interview? Again, those are reasonable points - though I personally have a bit of the issue with the second one. Next option. @@ -149,14 +149,12 @@ more difficulty to the task should help cut down on this - but keep in mind that unrealistic expectations, you will turn off many candidates. Contrarian Carl says: + >You expect me to spend two evenings working on some stupid toy project? or... ->That's so many hoops to jump through. I've got to do this whole project that I don't even ->care about with the chance I won't even get the job. And then figure out a way for you ->to run in on your machine. And you'll probably tell me that it's not exactly what you ->wanted. +>That's so many hoops to jump through. I've got to do this whole project that I don't even care about with the chance I won't even get the job. And then figure out a way for you to run in on your machine. And you'll probably tell me that it's not exactly what you wanted. If you get to this stage, you have given a candidate three options to demonstrate the core ability required for the job they are seeking. diff --git a/_posts/2011-10-01-podcast-roundup-iii.md b/_posts/2011-10-01-podcast-roundup-iii.md index 107f7bb..e239791 100644 --- a/_posts/2011-10-01-podcast-roundup-iii.md +++ b/_posts/2011-10-01-podcast-roundup-iii.md @@ -3,6 +3,8 @@ layout: post title: Podcast Roundup III categories: - blog +tags: +- misc --- Time for another Podcast Roundup - I've only got two new shows this time, but both are diff --git a/_posts/2011-10-13-intrapreneurship-applying-the-lean-startup-to-internal-tools.md b/_posts/2011-10-13-intrapreneurship-applying-the-lean-startup-to-internal-tools.md index 7389eda..ba57613 100644 --- a/_posts/2011-10-13-intrapreneurship-applying-the-lean-startup-to-internal-tools.md +++ b/_posts/2011-10-13-intrapreneurship-applying-the-lean-startup-to-internal-tools.md @@ -3,6 +3,8 @@ layout: post title: "Intrapreneurship: Applying the Lean Startup to building internal tools" categories: - blog +tags: +- practices --- I recently finished reading Eric Ries' ["The Lean Startup"][ls] and one section really diff --git a/_posts/2011-10-16-the-applebees-of-software-development.md b/_posts/2011-10-16-the-applebees-of-software-development.md index 40178ae..33a1229 100644 --- a/_posts/2011-10-16-the-applebees-of-software-development.md +++ b/_posts/2011-10-16-the-applebees-of-software-development.md @@ -3,6 +3,8 @@ layout: post title: The Applebee's of Software Development categories: - blog +tags: +- tangential --- >"The Applebee's of Software Development" is the first week's prompt for the diff --git a/_posts/2011-10-24-get-better.md b/_posts/2011-10-24-get-better.md index b45fd8d..c8e9426 100644 --- a/_posts/2011-10-24-get-better.md +++ b/_posts/2011-10-24-get-better.md @@ -3,6 +3,9 @@ layout: post title: Get Better categories: - blog +tags: +- growth +favorite: true ---
@@ -15,6 +18,7 @@ categories: [merlin]: http://www.43folders.com/2011/01/17/permission-to-be-awesome Take 5 minutes to: + - Read the most interesting blog post in your RSS reader - Look through the code you wrote today and find a place to improve - Write down any problems you encountered today @@ -22,6 +26,7 @@ Take 5 minutes to: - Ask a co-worker if they've read anything interesting lately Take 15 minutes to: + - Refactor a piece of code you wrote this week - Find code that's missing tests and add one - Update your team/company wiki @@ -33,6 +38,7 @@ Take 15 minutes to: [reddit]: http://reddit.com/r/programming Take 30 minutes to: + - Watch a talk from a [conference that interests you][lanyrd] - Write a blog post about a bug you encountered and how you fixed it - Write a blog post about something you've been working on or learning about @@ -46,6 +52,7 @@ Take 30 minutes to: [euler]: http://projecteuler.net/ Take an hour a week to: + - Help an open source library that you use - patchs, documentation, bugs - Work on a side-project on your own - Watch a [screencast][peepcode] about something new @@ -60,6 +67,7 @@ Take an hour a week to: [ai]: https://www.ai-class.com/ Take 2 hours a month to: + - Go to a [local dev meetup][indyhackers] - Take someone you look up to out to lunch and pick their brain - Do self reflection and update your position on [The Long Road][lr] @@ -69,6 +77,7 @@ Take 2 hours a month to: [lr]: http://ofps.oreilly.com/titles/9780596518387/walking_the_long_road.html#the_long_road Take a weekend a year to: + - Go to a conference - Attend a [Startup Weekend][sup] or [Hackathon][hack] - Use your craft to [help others][givecamp] diff --git a/_posts/2011-11-02-engineering-over-under.md b/_posts/2011-11-02-engineering-over-under.md index 1857003..1085889 100644 --- a/_posts/2011-11-02-engineering-over-under.md +++ b/_posts/2011-11-02-engineering-over-under.md @@ -1,8 +1,10 @@ --- layout: post -title: "Engineering - Over/Under: I'm a Serial Over Committer" +title: "Over/Under: I'm a Serial Over Committer" categories: - blog +tags: +- reflections --- Over committing - taking on too many things at once - is a pretty established anti-pattern. diff --git a/_posts/2011-11-27-overcoming-momentum.md b/_posts/2011-11-27-overcoming-momentum.md index 14e0784..24c1cdb 100644 --- a/_posts/2011-11-27-overcoming-momentum.md +++ b/_posts/2011-11-27-overcoming-momentum.md @@ -3,6 +3,8 @@ layout: post title: Overcoming Momentum categories: - blog +tags: +- practices --- 4:47 pm on a Friday. You've spent all week fighting with your code. But, finally, you diff --git a/_posts/2011-12-01-agile-retrospectives.md b/_posts/2011-12-01-agile-retrospectives.md index 9d7d08b..8179595 100644 --- a/_posts/2011-12-01-agile-retrospectives.md +++ b/_posts/2011-12-01-agile-retrospectives.md @@ -1,15 +1,13 @@ --- layout: writeup title: Agile Retrospectives +full_title: "Agile Retrospectives: Making Good Teams Great" +author: "Esther Derby, Diana Larsen" +isbn: 0977616649 +image: agile-retrospectives.jpg categories: - writeup ---- - -![](/static/agile-retrospectives.jpg) -[Agile Retrospectives: Making Good Teams Great][link] -Esther Derby, Diana Larsen -ISBN: 0977616649 - +favorite: true --- **What's the point?** @@ -35,6 +33,4 @@ each section. **Who should read it?** All team leads, those looking to become team leads, anyone leading retrospectives - if you -haven't read this book, I think you are really missing out. - -[link]: http://www.amazon.com/exec/obidos/ASIN/0977616649/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +haven't read this book, I think you are really missing out. \ No newline at end of file diff --git a/_posts/2011-12-01-the-art-of-readable-code.md b/_posts/2011-12-01-the-art-of-readable-code.md index 4dd5525..f3d9190 100644 --- a/_posts/2011-12-01-the-art-of-readable-code.md +++ b/_posts/2011-12-01-the-art-of-readable-code.md @@ -1,17 +1,13 @@ --- layout: writeup title: The Art of Readable Code +author: "Dustin Boswell, Trevor Foucher" +isbn: 0596802293 +image: art-of-readable-code.png categories: - writeup --- -![](/static/art-of-readable-code.png) -[The Art of Readable Code](http://www.amazon.com/exec/obidos/ASIN/0596802293/ref=nosim&tag=bookreview0a1-20) -Dustin Boswell, Trevor Foucher -ISBN: 0596802293 - ---- - **What's the point?** This books aims to be the "simple and practical" guide to writing better, more readable code. It is structured as a series of tips - with an anecdote and explanation of the how and why. diff --git a/_posts/2011-12-04-whats-on-your-learning-list.md b/_posts/2011-12-04-whats-on-your-learning-list.md index 8d5b31d..05d9cf7 100644 --- a/_posts/2011-12-04-whats-on-your-learning-list.md +++ b/_posts/2011-12-04-whats-on-your-learning-list.md @@ -3,6 +3,8 @@ layout: post title: What's on your Learning List? categories: - blog +tags: +- growth --- How do you track and decide what topics you want to spend time learning? diff --git a/_posts/2011-12-26-one-developer-year-in-review-2011.md b/_posts/2011-12-26-one-developer-year-in-review-2011.md index c5a9833..56bef83 100644 --- a/_posts/2011-12-26-one-developer-year-in-review-2011.md +++ b/_posts/2011-12-26-one-developer-year-in-review-2011.md @@ -1,15 +1,18 @@ --- layout: post -title: "One Developer-Year in Review: 2011" +title: "My Year in Review: 2011" categories: - blog +tags: +- reflections --- This post is mainly for my own benefit -- I am repeatedly surprised by the phenomenon of gradual improvement and taking an hour to summarize my year always makes it clear how much I have learned and grown as a developer. -#Professional +# Professional + My first full calendar year working at [SEP][sep] was quite eventful. I spent the first 9 months continuing work on a long-running web application for an aerospace client. About half of the time I was working on new features in the ASP.NET MVC part of the app and the other half was @@ -83,9 +86,10 @@ in a few key areas, I should be able to do it in 2012. --- -#Personal +# Personal + +## Community -##Community I became a regular attendee and contributer to the Indy ALT.NET group. I gave four mini-talks (15-30 minutes): writing with Markdown, Dive into Node.js, Javascript visualization libraries, and design shortcuts for weekend projects. The group is rebranding to [Indy Software Artisans][isa] and @@ -93,9 +97,9 @@ I am slated to give a talk early in 2012. [isa]: http://indysa.org/ -##Personal Projects +## Personal Projects -###[Bibliotechnical][bt] - Status: abandoned +### Bibliotechnical - Status: abandoned My first stab at building something for public use. The idea was to build a technical book aggregator that ranked books by metrics other than number of copies sold and star ratings. I would rank books on things like shelf life, practical vs theoretical, target developer skill @@ -104,19 +108,21 @@ affiliate links. The main issue was that I had no idea how to rank the books tha I just deferred that until the last moment -- but once I reached the point when I needed to solve the problem, I still didn't have a clue how to tackle it and lost interest. -[bt]: https://github.com/swanson/bibliotechnical +https://github.com/swanson/bibliotechnical + --- -###[LandingPad.rb][lp] - Status: shipped +### LandingPad.rb - Status: shipped I extracted the landing page that I built for Bibliotechnical into a separate project. I didn't understand why developers were paying money to other startups to create a 'viral landing page' when it is pretty simple to make your own. I open sourced my simple version that collects email addresses or Twitter handles which can be deployed to Heroku in just a few minutes. -[lp]: https://github.com/swanson/LandingPad.rb +https://github.com/swanson/LandingPad.rb + --- -###[Netflix-it-now][nin] - Status: Works on my Machine! +### Netflix-it-now - Status: Works on my Machine! Weekend project that I threw together with a friend. We were lamenting over IM one night that it was dumb that Netflix had an "Add to Instant Queue" button, but only for movies that were available to stream. If there was a movie that was only available on DVD, we wanted an option to @@ -125,44 +131,47 @@ extension to solve the problem. It worked well enough for our own use, but we di with support or making sure user data was absolutely secure so we never released it to the general public. -[nin]: https://github.com/swanson/netflix-it-now +https://github.com/swanson/netflix-it-now + --- -###[Lanyon][lan] - Status: shelved +### Lanyon - Status: shelved I wanted a way to write posts for my Github Pages-powered Jekyll blog when I wasn't on my main machine. The idea was to add a single page to my blog to write a post and then, using Javascript to make calls to the Github API, generate a new commit and push it to my repository. I got it working but I hasn't happy with the authentication options: Github supports OAuth, but not a client-side flow. So this project is shelved until that gets sorted out. -[lan]: https://github.com/swanson/lanyon +https://github.com/swanson/lanyon + --- -###[Abe][abe] - Status: shipped +### Abe - Status: shipped "Abraham Lincoln? Isn't he the President who..." -- A stupid one-page app based on a long-running inside joke. Pointless, but fun to make. -[abe]: http://abe.heroku.com/ +http://abe.heroku.com/ + --- -###[CloutBout][cb] - Status: demoed +### CloutBout - Status: demoed A fantasy football for Twitter app I built with some friends at the SocialDevCamp Chicago hackathon. The idea is to apply fantasy sports-style scoring to Twitter: so you get points for tweeting, hash tagging, posting links, etc. I think it's a neat idea and we won a prize, but no one on the team had the time or desire to take it anywhere past the hackathon. -[cb]: https://github.com/swanson/cloutbout +https://github.com/swanson/cloutbout + --- -###[Dasher][dash] - Status: ongoing +### Dasher - Status: ongoing I've been working on and off with two coworkers to build a company dashboard with information that engineers might care about -- data like upcoming developer events, build server status, and a diagram of what projects everyone is working on. -[dash]: http://www.sep.com --- -###[Morale][morale] - Status: shipped +### Morale - Status: shipped By far, my most successful side project of the year. I built a Rails app to track developer moods over the course of a project with a simple daily email. I wrote about it in more detail [here][he]. It's been used at work for around two months across three projects and feedback has been @@ -170,10 +179,10 @@ positive. I am presenting the app to the whole company at a status meeting in Ja for it to be used company-wide and I think it will be a big help in gauging employee satisfaction. [he]: /blog/2011/10/13/intrapreneurship-applying-the-lean-startup-to-internal-tools.html -[morale]: http://www.sep.com + --- -##Blog +## Blog I made a bigger effort to add content to my blog this year. I wrote 21 blog posts and posted reviews for eight books. @@ -196,7 +205,7 @@ Not bad for a random developer in Indiana! --- -#Closing Thoughts on 2011 +# Closing Thoughts on 2011 It's hard to see your own improvement -- your day-to-day performance doesn't seem to be any different. On the internet, it seems like everyone is doing cool stuff all the time and you are falling behind. You aren't alone, I get this feeling all the time; we are always our own toughest @@ -209,4 +218,4 @@ about "never producing anything". Take an hour this week to look back at your own year's accomplishments and I think you'll find that you've done and learned more than you thought. -Have a safe and happy New Year. \ No newline at end of file +Have a safe and happy New Year. diff --git a/_posts/2012-01-07-software-craftsmanship-the-new-imperative.md b/_posts/2012-01-07-software-craftsmanship-the-new-imperative.md index 881205a..53642d5 100644 --- a/_posts/2012-01-07-software-craftsmanship-the-new-imperative.md +++ b/_posts/2012-01-07-software-craftsmanship-the-new-imperative.md @@ -1,17 +1,13 @@ --- layout: writeup title: "Software Craftsmanship: The New Imperative" +author: Pete McBreen +isbn: 0201733862 +image: software-craftsmanship.jpg categories: - writeup --- -![](/static/software-craftsmanship.jpg) -[Software Craftsmanship: The New Imperative](http://www.amazon.com/exec/obidos/ASIN/0201733862/ref=nosim&tag=bookreview0a1-20) -Pete McBreen -ISBN: 0201733862 - ---- - **What's the point?** The book lays out the concept of software craftsmanship, how it differs from software engineering, and why your company might want to shift to a craftsmanship model. diff --git a/_posts/2012-01-25-driving-technical-change.md b/_posts/2012-01-25-driving-technical-change.md index d40b821..5e95fa1 100644 --- a/_posts/2012-01-25-driving-technical-change.md +++ b/_posts/2012-01-25-driving-technical-change.md @@ -1,15 +1,13 @@ --- layout: writeup title: Driving Technical Change +full_title: "Driving Technical Change: Why People on Your Team Don't Act on Good Ideas, and How to Convince Them They Should" +author: Terrence Ryan +isbn: 1934356603 +image: driving-technical-change.jpeg categories: - writeup ---- - -![](/static/driving-technical-change.jpeg) -[Driving Technical Change: Why People on Your Team Don't Act on Good Ideas, and How to Convince Them They Should][link] -Terrence Ryan -ISBN: 1934356603 - +favorite: true --- **What's the point?** @@ -46,5 +44,4 @@ topic for the past few months. The goal of the book is to help you convince co-works to adopt new ideas without resorting to the BS of office politics and top-down mandates - so if that sounds appealing to you, give this book a shot. -[link]: http://www.amazon.com/exec/obidos/ASIN/1934356603/ref=nosim&tag=bookreview0a1-20 [fc]: http://www.amazon.com/exec/obidos/ASIN/0201741571/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file diff --git a/_posts/2012-01-30-repeating-background-textures-in-android.md b/_posts/2012-01-30-repeating-background-textures-in-android.md index 5f478e3..049bcd5 100644 --- a/_posts/2012-01-30-repeating-background-textures-in-android.md +++ b/_posts/2012-01-30-repeating-background-textures-in-android.md @@ -3,6 +3,8 @@ layout: post title: "Repeating Background Textures in Android" categories: - blog +tags: +- android --- * Pick something from [Subtle Patterns][sp], e.g. `irongrip.png` and diff --git a/_posts/2012-03-22-test-first-as-system-2-thinking.md b/_posts/2012-03-22-test-first-as-system-2-thinking.md index 2a56a80..e1d0f20 100644 --- a/_posts/2012-03-22-test-first-as-system-2-thinking.md +++ b/_posts/2012-03-22-test-first-as-system-2-thinking.md @@ -3,6 +3,8 @@ layout: post title: "Test First as System 2 Thinking" categories: - blog +tags: +- tangential --- I've been reading Daniel Kahneman's excellent [*Thinking, Fast and Slow*][tfs] lately; the book introduces two types of thinking: System 1 and System 2. diff --git a/_posts/2012-04-01-the-wisdom-of-crowds.md b/_posts/2012-04-01-the-wisdom-of-crowds.md index e5d06ea..dbc03d1 100644 --- a/_posts/2012-04-01-the-wisdom-of-crowds.md +++ b/_posts/2012-04-01-the-wisdom-of-crowds.md @@ -1,17 +1,13 @@ --- layout: writeup title: "The Wisdom of Crowds" +author: James Surowiecki +isbn: 0385721706 +image: wisdom-of-crowds.jpg categories: - writeup --- -![](/static/wisdom-of-crowds.jpg) -[The Wisdom of the Crowds][link] -James Surowiecki -ISBN: 0385721706 - ---- - **What's the point?** It seems like a small group of experts would be best at making intelligent predictions and decisions, but, under the right circumstances, a group of @@ -33,6 +29,4 @@ varied experiences is useful. **Who should read it?** In the end, it was a very approachable book about behavioral economics (which I like) in the same genre and style of Freakonomics and Malcolm Gladwell (which I also -like), but those looking for new and pragmatic approaches will probably be letdown. - -[link]: http://www.amazon.com/exec/obidos/ASIN/0385721706/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +like), but those looking for new and pragmatic approaches will probably be letdown. \ No newline at end of file diff --git a/_posts/2012-04-01-what-ive-learned-from-failure.md b/_posts/2012-04-01-what-ive-learned-from-failure.md index e033717..2f4f209 100644 --- a/_posts/2012-04-01-what-ive-learned-from-failure.md +++ b/_posts/2012-04-01-what-ive-learned-from-failure.md @@ -1,17 +1,14 @@ --- layout: writeup title: "What I've Learned From Failure" +full_title: "What I've Learned From Failure: A quarter-century of experience shipping software, distilled into fixnum bittersweet essays" +author: Reginald Braithwaite +image: learned-from-failure.jpeg +book_link: http://leanpub.com/shippingsoftware categories: - writeup --- - -![](/static/learned-from-failure.jpeg) -[What I've Learned From Failure: A quarter-century of experience shipping software, distilled into fixnum bittersweet essays][link] -Reginald Braithwaite - ---- - **What's the point?** Delivering software is as much about avoiding "failure modes" as it is about using best practices or the flavor-of-the-month process. By identifying common sources of @@ -40,6 +37,4 @@ Do not let the length fool you, it is short but dense with great material. **Who should read it?** Project managers and clients that want to avoid failure; frustrated engineers that -don't always understand the How and Why of dealing with clients - -[link]: http://leanpub.com/shippingsoftware +don't always understand the How and Why of dealing with clients \ No newline at end of file diff --git a/_posts/2012-05-30-primitive-obsession.md b/_posts/2012-05-30-primitive-obsession.md index 5b8cf03..04e6479 100644 --- a/_posts/2012-05-30-primitive-obsession.md +++ b/_posts/2012-05-30-primitive-obsession.md @@ -4,6 +4,8 @@ title: "A Dangerous Obsession with Primitives" categories: - blog date: 2012-05-31 +tags: +- growth --- I recently came across a code smell called **Primitive Obsession** in James Shore's diff --git a/_posts/2012-06-21-the-cucumber-book.md b/_posts/2012-06-21-the-cucumber-book.md index 8ed70ed..8adb015 100644 --- a/_posts/2012-06-21-the-cucumber-book.md +++ b/_posts/2012-06-21-the-cucumber-book.md @@ -1,17 +1,14 @@ --- layout: writeup title: "The Cucumber Book" +full_title: "The Cucumber Book: Behaviour-Driven Development for Testers and Developers" +author: Matt Wynne and Aslak Hellesoy +isbn: 1934356808 +image: cucumber-book.jpg categories: - writeup --- -![](/static/cucumber-book.jpg) -[The Cucumber Book: Behaviour-Driven Development for Testers and Developers][link] -Matt Wynne and Aslak Hellesoy -ISBN: 1934356808 - ---- - **What's the point?** Cucumber is a tool for writing BDD tests. This book is an introduction to using the tool and then a worked example of using Cucumber to drive the development of a web-based ATM @@ -27,6 +24,4 @@ book, unfortunately, didn't help much in that regard. **Who should read it?** I would recommend the book as a way for someone to pick up Cucumber if they were going to -use it on a project, but I don't think it is strictly necessary. - -[link]: http://www.amazon.com/exec/obidos/ASIN/1934356808/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +use it on a project, but I don't think it is strictly necessary. \ No newline at end of file diff --git a/_posts/2012-06-22-growing-object-oriented-software.md b/_posts/2012-06-22-growing-object-oriented-software.md index 463e315..09142a4 100644 --- a/_posts/2012-06-22-growing-object-oriented-software.md +++ b/_posts/2012-06-22-growing-object-oriented-software.md @@ -1,15 +1,12 @@ --- layout: writeup title: "Growing Object Oriented Software, Guided By Tests" +author: Steve Freeman and Nat Pryce +isbn: 0321503627 +image: goos-gbt.jpg categories: - writeup ---- - -![](/static/goos-gbt.jpg) -[Growing Object-Oriented Software Guided by Tests][link] -Steve Freeman and Nat Pryce -ISBN: 0321503627 - +favorite: true --- **What's the point?** @@ -36,5 +33,3 @@ and material is very relevant to the current fascination with OO design. This is a great mid-to-advanced level book on TDD. I don't know if I would recommend it to someone completely new to the topic; but for someone with a bit of experience, this is the book you want to read. - -[link]: http://www.amazon.com/exec/obidos/ASIN/0321503627/ref=nosim&tag=bookreview0a1-20 diff --git a/_posts/2012-07-08-theres-always-a-duck.md b/_posts/2012-07-08-theres-always-a-duck.md index f95fb8f..f3d3bb3 100644 --- a/_posts/2012-07-08-theres-always-a-duck.md +++ b/_posts/2012-07-08-theres-always-a-duck.md @@ -1,16 +1,14 @@ --- layout: writeup title: "There's Always a Duck" +full_title: "There's Always a Duck: A collection of essays about people, culture, and teams" +author: Elisabeth Hendrickson +image: always-a-duck.jpeg +book_link: http://leanpub.com/alwaysaduck categories: - writeup --- -![](/static/always-a-duck.jpeg) -[There's Always a Duck: A collection of essays about people, culture, and teams][link] -Elisabeth Hendrickson - ---- - **What's the point?** The book is a collection of essays written the point-of-view of a test/QA engineer on agile teams about soft skills and personal interactions. @@ -31,5 +29,4 @@ Nothing earth-shattering, but it was a short, pleasant read. Developers looking for some insight into how testing fits into agile teams from a Test/QA engineer POV -[link]: http://leanpub.com/alwaysaduck [event]: http://testobsessed.com/blog/2011/05/31/agile-up-3-here/ diff --git a/_posts/2012-07-10-everyday-rails-testing-with-rspec.md b/_posts/2012-07-10-everyday-rails-testing-with-rspec.md index e2e9d4a..6f9aeb8 100644 --- a/_posts/2012-07-10-everyday-rails-testing-with-rspec.md +++ b/_posts/2012-07-10-everyday-rails-testing-with-rspec.md @@ -1,16 +1,14 @@ --- layout: writeup title: "Everyday Rails Testing with RSpec" +full_title: "Everyday Rails Testing with RSpec: A practical approach to test-driven development" +author: Aaron Sumner +image: everyday-rails.png +book_link: http://leanpub.com/everydayrailsrspec categories: - writeup --- -![](/static/everyday-rails.png) -[Everyday Rails Testing with RSpec: A practical approach to test-driven development][link] -Aaron Sumner - ---- - **What's the point?** Everyday Rails Testing with RSpec focuses on getting started with RSpec testing in Rails. Instead of assuming the reader has started by TDDing an app, the book takes the approach @@ -38,5 +36,3 @@ of a real Rails app. **Who should read it?** Developers looking to get started with testing Rails applications using RSpec. You will probably want some background knowledge on using Rails before picking up this book. - -[link]: http://leanpub.com/everydayrailsrspec diff --git a/_posts/2012-07-11-objects-on-rails.md b/_posts/2012-07-11-objects-on-rails.md index c5c4fc7..0bf1b7c 100644 --- a/_posts/2012-07-11-objects-on-rails.md +++ b/_posts/2012-07-11-objects-on-rails.md @@ -1,16 +1,14 @@ --- layout: writeup title: "Objects on Rails" +full_title: "Objects on Rails: Notes on flexible web application design" +author: Avdi Grimm +image: objects-on-rails.jpg +book_link: http://objectsonrails.com/ categories: - writeup --- -![](/static/objects-on-rails.jpg) -[Objects on Rails: Notes on flexible web application design][link] -Avdi Grimm - ---- - **What's the point?** This book takes the form of an "engineer's notebook" and examines a handful of alternative OO-patterns to make your Rails applications more flexible and maintainable. @@ -37,5 +35,3 @@ injection, aggregate root) fit into a Rails app. Anyone with interest in the on-going "how to do OO in Rails" debate; basic-to-intermediate Rails knowledge required to get the most out of this book -[link]: http://objectsonrails.com/ - diff --git a/_posts/2012-07-25-technical-blogging.md b/_posts/2012-07-25-technical-blogging.md index a4dfbc5..99b61cf 100644 --- a/_posts/2012-07-25-technical-blogging.md +++ b/_posts/2012-07-25-technical-blogging.md @@ -1,17 +1,14 @@ --- layout: writeup title: "Technical Blogging" +full_title: "Technical Blogging: Turn Your Expertise into a Remarkable Online Presence" +author: Antonio Cangiano +isbn: 1934356883 +image: technical-blogging.jpg categories: - writeup --- -![](/static/technical-blogging.jpg) -[Technical Blogging: Turn Your Expertise into a Remarkable Online Presence][link] -Antonio Cangiano -ISBN: 1934356883 - ---- - **What's the point?** This book provides a step-by-step guide for planning and writing a successful technical blog. Additionally, the author describes how to get the most benefit from your blog. @@ -33,6 +30,4 @@ blogging (building an audience, becoming an expert in the field). **Who should read it?** Overall, I think the book would be very useful for someone interested in blogging that didn't know where to begin. For people that already have a blog, you can probably skim a -few of the later sections and skip the rest. - -[link]: http://www.amazon.com/exec/obidos/ASIN/1934356883/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +few of the later sections and skip the rest. \ No newline at end of file diff --git a/_posts/2012-07-25-the-personal-mba.md b/_posts/2012-07-25-the-personal-mba.md index b536689..5037002 100644 --- a/_posts/2012-07-25-the-personal-mba.md +++ b/_posts/2012-07-25-the-personal-mba.md @@ -1,15 +1,13 @@ --- layout: writeup title: "The Personal MBA" +full_title: "The Personal MBA: Master the Art of Business" +author: Josh Kaufman +isbn: 1591843529 +image: personal-mba.jpg categories: - writeup ---- - -![](/static/personal-mba.jpg) -[The Personal MBA: Master the Art of Business][link] -Josh Kaufman -ISBN: 1591843529 - +favorite: true --- **What's the point?** @@ -28,6 +26,4 @@ and it was easy to digest the book a few sections at a time. **Who should read it?** I would recommend anyone interested in learning more about business or entrepreneurship to start by reading this book. Afterwards, you can pick a topic to dive deeper into -based on the author's other recommendations. - -[link]: http://www.amazon.com/exec/obidos/ASIN/1591845572/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +based on the author's other recommendations. \ No newline at end of file diff --git a/_posts/2012-08-27-move-your-feet.md b/_posts/2012-08-27-move-your-feet.md index 33bac12..90788ba 100644 --- a/_posts/2012-08-27-move-your-feet.md +++ b/_posts/2012-08-27-move-your-feet.md @@ -3,6 +3,9 @@ layout: post title: "Move your feet" categories: - blog +tags: +- growth +favorite: true --- * Four books. 28 hours of screencasts. Two online courses. @@ -50,5 +53,5 @@ pairs of wicking socks I would need, etc — when the trainer looked over an comment that really resonated with me:
-

Wanna know the secret to improving your running? Move your feet.

+

Wanna know the secret to improving your running? Move your feet.

\ No newline at end of file diff --git a/_posts/2012-09-05-learned-optimism.md b/_posts/2012-09-05-learned-optimism.md index be89ab0..879f1a6 100644 --- a/_posts/2012-09-05-learned-optimism.md +++ b/_posts/2012-09-05-learned-optimism.md @@ -1,18 +1,15 @@ --- layout: writeup title: "Learned Optimism" +full_title: "Learned Optimism: How to Change Your Mind and Your Life" +author: Martin Seligman +isbn: 0671019112 +image: learned-optimism.jpg categories: - writeup date: 2012-09-20 --- -![](/static/learned-optimism.jpg) -[Learned Optimism: How to Change Your Mind and Your Life][link] -Martin Seligman -ISBN: 0671019112 - ---- - **What's the point?** Optimism has proven benefits over pessimism is nearly every aspect of life, from personal happiness to success in business. People can learn to become helpless @@ -44,6 +41,4 @@ beyond your control. **Who should read it?** If you're into pop psychology books (like I am), then it's worth a read. There is some fascinating stuff about using optimism tests when hiring insurance salesmen that might -also work for hiring developers. - -[link]: http://www.amazon.com/exec/obidos/ASIN/1400078393/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +also work for hiring developers. \ No newline at end of file diff --git a/_posts/2012-09-05-new-coke-ux.md b/_posts/2012-09-05-new-coke-ux.md index 65bc214..56b191f 100644 --- a/_posts/2012-09-05-new-coke-ux.md +++ b/_posts/2012-09-05-new-coke-ux.md @@ -4,6 +4,9 @@ title: "New Coke User Experience" categories: - blog date: 2012-09-25 +tags: +- tangential +favorite: true --- If you've been to any fast food restaurant lately, you may have noticed the fancy, new diff --git a/_posts/2012-09-05-the-optimistic-programmer.md b/_posts/2012-09-05-the-optimistic-programmer.md index 9c1e2fa..af3c684 100644 --- a/_posts/2012-09-05-the-optimistic-programmer.md +++ b/_posts/2012-09-05-the-optimistic-programmer.md @@ -4,6 +4,8 @@ title: "The Optimistic Programmer" categories: - blog date: 06-11-2012 +tags: +- tangential --- Imagine two developers — Alice and Bob — both fresh out of school and ready to diff --git a/_posts/2012-10-02-a-short-history-of-nearly-everything.md b/_posts/2012-10-02-a-short-history-of-nearly-everything.md index 06f7fb0..56a77d7 100644 --- a/_posts/2012-10-02-a-short-history-of-nearly-everything.md +++ b/_posts/2012-10-02-a-short-history-of-nearly-everything.md @@ -1,18 +1,13 @@ --- layout: writeup title: "A Short History of Nearly Everything" +author: Bill Bryson +isbn: 0767908171 +image: short-history.jpg categories: - writeup --- - -![](/static/short-history.jpg) -[A Short History of Nearly Everything][link] -Bill Bryson -ISBN: 0767908171 - ---- - **What's the point?** Have you ever wondered how exactly scientists can measure the weight of the Earth? @@ -43,6 +38,4 @@ them. **Who should read it?** I found the book to be an enjoyable blend of learning and humor and would recommend it to anyone that has ever sat through a high school science class and wondered why it was so -damn boring. - -[link]: http://www.amazon.com/exec/obidos/ASIN/076790818X/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +damn boring. \ No newline at end of file diff --git a/_posts/2012-10-14-better.md b/_posts/2012-10-14-better.md index 9e8106f..828da9e 100644 --- a/_posts/2012-10-14-better.md +++ b/_posts/2012-10-14-better.md @@ -1,15 +1,14 @@ --- layout: writeup title: "Better: A Surgeon's Notes On Performance" +author: Atul Gawande +isbn: 0805082115 +image: better.jpg categories: - writeup ---- - -![](/static/better.jpg) -[Better: A Surgeon's Notes on Performance][link] -Atul Gawande -ISBN: 0805082115 - +tags: +- tangential +favorite: true --- **What's the point?** @@ -55,4 +54,3 @@ There are good lessons for every developer in this book. Before you reach for th software book about improvement, performance, or team dynamics give this cross-disciplinary book a shot; I think you'll be glad you did. -[link]: http://www.amazon.com/exec/obidos/ASIN/0312427654/ref=nosim&tag=bookreview0a1-20 diff --git a/_posts/2012-10-23-the-five-dysfunctions-of-a-team.md b/_posts/2012-10-23-the-five-dysfunctions-of-a-team.md index 7a51bb7..99858fa 100644 --- a/_posts/2012-10-23-the-five-dysfunctions-of-a-team.md +++ b/_posts/2012-10-23-the-five-dysfunctions-of-a-team.md @@ -1,18 +1,14 @@ --- layout: writeup title: "The Five Dysfunctions of a Team" +full_title: "The Five Dysfunctions of a Team: A Leadership Fable" +author: Patrick Lencioni +isbn: 0787960756 +image: five-dysfunctions.jpg categories: - writeup --- - -![](/static/five-dysfunctions.jpg) -[The Five Dysfunctions of a Team: A Leadership Fable][link] -Patrick Lencioni -ISBN: 0787960756 - ---- - **What's the point?** There are five dysfunctions that plague workplace teams. A good team leader will identify how the dysfunctions are manifesting in their team and take action to overcome them. @@ -42,5 +38,3 @@ It's a quick read and good for those working on teams that you don't feel tight- while the fictional company does make software, a development background is not required to read this one. -[link]: http://www.amazon.com/exec/obidos/ASIN/0787960756/ref=nosim&tag=bookreview0a1-20 - diff --git a/_posts/2012-10-26-how-children-succeed.md b/_posts/2012-10-26-how-children-succeed.md index fc08cb5..c71d7ea 100644 --- a/_posts/2012-10-26-how-children-succeed.md +++ b/_posts/2012-10-26-how-children-succeed.md @@ -1,19 +1,14 @@ --- layout: writeup title: "How Children Succeed" +full_title: "How Children Succeed: Grit, Curiosity, and the Hidden Power of Character" +author: Paul Tough +isbn: 0547564651 +image: grit.jpg categories: - writeup --- - - -![](/static/grit.jpg) -[How Children Succeed: Grit, Curiosity, and the Hidden Power of Character][link] -Paul Tough -ISBN: 0547564651 - ---- - **What's the point?** Traditional wisdom tells us that intelligence is a leading indicator in predicting success in life — children that score highly on preschool admissions tests are @@ -47,9 +42,6 @@ By using techniques inspired from psychotherapy, the chess team coach helped stu learn from their mistakes and better handle their losses. By building up this quality in her team, they were able to dominate schools that would be favored by more traditional metrics (IQ, income level, quality of education). - -[b2w]: http://5by5.tv/b2w/87 -[lo]: http://mdswanson.com/writeup/2012/09/20/learned-optimism.html **Who should read it?** While the book is primarily focused on education, I think the idea that IQ isn't the @@ -58,4 +50,5 @@ end-all, be-all predictor of success is an interesting one to explore in any fie Software certainly has many cases of individuals without strong academic backgrounds succeeding through raw grit, determination, and courage. -[link]: http://www.amazon.com/exec/obidos/ASIN/0547564651/ref=nosim&tag=bookreview0a1-20 \ No newline at end of file +[b2w]: http://5by5.tv/b2w/87 +[lo]: http://mdswanson.com/writeup/2012/09/20/learned-optimism.html \ No newline at end of file diff --git a/_posts/2012-10-28-i-dont-have-time.md b/_posts/2012-10-28-i-dont-have-time.md index e7e9bb3..ce218b6 100644 --- a/_posts/2012-10-28-i-dont-have-time.md +++ b/_posts/2012-10-28-i-dont-have-time.md @@ -3,6 +3,8 @@ layout: post title: "I Don't Have Time" categories: - blog +tags: +- growth --- Is there something you'd like to create? A project you want to build? A goal you want to diff --git a/_posts/2012-10-29-complications.md b/_posts/2012-10-29-complications.md index 19c6e47..79912cd 100644 --- a/_posts/2012-10-29-complications.md +++ b/_posts/2012-10-29-complications.md @@ -1,15 +1,14 @@ --- layout: writeup title: "Complications" +full_title: "Complications: A Surgeon's Notes on an Imperfect Science" +author: Atul Gawande +isbn: 0805063196 +image: complications.jpg categories: - writeup ---- - -![](/static/complications.jpg) -[Complications: A Surgeon's Notes on an Imperfect Science][link] -Atul Gawande -ISBN: 0805063196 - +tags: +- tangential --- **What's the point?** @@ -57,4 +56,3 @@ perspective on similar problems. So if that sounds useful to you, check out this book. [better]: http://mdswanson.com/writeup/2012/10/14/better.html -[link]: http://www.amazon.com/exec/obidos/ASIN/0312421702/ref=nosim&tag=bookreview0a1-20 diff --git a/_posts/2012-11-04-code-reviews-good-idea-bad-idea.md b/_posts/2012-11-04-code-reviews-good-idea-bad-idea.md index 3f3f68a..f5a6aed 100644 --- a/_posts/2012-11-04-code-reviews-good-idea-bad-idea.md +++ b/_posts/2012-11-04-code-reviews-good-idea-bad-idea.md @@ -3,6 +3,9 @@ layout: post title: "Code Reviews: Good idea, bad idea?" categories: - blog +tags: +- practices +favorite: true --- Code reviews seem to be a relatively docile topic in software development. diff --git a/_posts/2012-11-18-motion-is-not-progress.md b/_posts/2012-11-18-motion-is-not-progress.md index 0535af2..e6d7d21 100644 --- a/_posts/2012-11-18-motion-is-not-progress.md +++ b/_posts/2012-11-18-motion-is-not-progress.md @@ -3,6 +3,8 @@ layout: post title: "Motion is not Progress" categories: - blog +tags: +- reflections --- I've put about 40 hours of my free time into writing a technical book. diff --git a/_posts/2012-12-10-personal-time-capsule.md b/_posts/2012-12-10-personal-time-capsule.md index 8c90edf..d451d8c 100644 --- a/_posts/2012-12-10-personal-time-capsule.md +++ b/_posts/2012-12-10-personal-time-capsule.md @@ -3,6 +3,9 @@ layout: post title: "Personal Time Capsule" categories: - blog +tags: +- reflections +favorite: true --- In the spring of 2008 — nearly 5 years ago — I wrote my first piece of useful software; it @@ -45,4 +48,4 @@ It's a very personal and reflective activity and I would encourage you to try it finding some old code, reading your very first blog post, or revisiting a design from years ago. There is always more to learn and an infinite number of ways to improve, but don't forget to stop and -evaluate how face you've come. \ No newline at end of file +evaluate how far you've come. diff --git a/_posts/2013-01-01-year-in-review-2012.md b/_posts/2013-01-01-year-in-review-2012.md index d96a67e..8afe325 100644 --- a/_posts/2013-01-01-year-in-review-2012.md +++ b/_posts/2013-01-01-year-in-review-2012.md @@ -3,12 +3,14 @@ layout: post title: "My Year in Review: 2012" categories: - blog +tags: +- reflections --- Last year, I wrote a laundry list of my accomplishments in 2011. This time, I want to share some themes in my life for 2012 instead. -##A Year of Tracking +## A Year of Tracking I've been drawn to the [Quantified Self][qs] movement since I first read the blog a year and a half ago. I tried to get on the tracking bandwagon a few times, but I always fizzled after a couple days — I need effortless data capture or I just stop doing it. @@ -84,7 +86,7 @@ convince most of SEP, but several other companies in the beta, to click a "Good" indicate their mood every day. My weekend hack has grown into a full product and has over 250 users in our current beta. I spent many late nights adding new graphs and visualizations to the app this year. -[m]: https://www.moraleapp.com/ +[m]: /morale/ ![](/static/queuerunner.png) @@ -98,7 +100,7 @@ working on my design chops. [qg]: https://github.com/swanson/queue-runner [qr]: http://www.queuerunner.com/ -##Getting Involved +## Getting Involved If you saw me at a Meetup or Indianapolis dev event this year, you would probably be surprised if I told you I was paralyzingly afraid of going to these events just a few years ago. I've been on the IndyPy meetup group @@ -137,12 +139,12 @@ Thank you [Kyle][k] and [Anthony][a] for helping organize this meetup; it is som to every week. We all push and support each other to get better, ship more, and eat [large potatoes][spud]. We love seeing new faces at the group, so if you are ever in Indy on a Monday night — please stop by! -[isl]: http://indystartuplab.org/ +[isl]: https://indystartuplab.github.io/ [k]: https://twitter.com/kyleashipley [a]: https://twitter.com/panozzaj [spud]: http://www.in.mcalistersdeli.com/menu/giant-spuds -##Closing Thoughts on 2012 +## Closing Thoughts on 2012 Change is hard. diff --git a/_posts/2013-01-20-worst-bug-ever.md b/_posts/2013-01-20-worst-bug-ever.md index 3c12108..932183f 100644 --- a/_posts/2013-01-20-worst-bug-ever.md +++ b/_posts/2013-01-20-worst-bug-ever.md @@ -3,6 +3,9 @@ layout: post title: "Worst. Bug. Ever." categories: - blog +tags: +- reflections +favorite: true --- Some bugs are the worst because they [cost money][money]. Some because they [cost lives][lives]. diff --git a/_posts/2013-01-28-evaluating-technical-arguments.md b/_posts/2013-01-28-evaluating-technical-arguments.md index 9df5ba1..b48bbe6 100644 --- a/_posts/2013-01-28-evaluating-technical-arguments.md +++ b/_posts/2013-01-28-evaluating-technical-arguments.md @@ -3,6 +3,8 @@ layout: post title: "Evaluating Technical Arguments" categories: - blog +tags: +- growth --- Every day Hacker News, Reddit, and Twitter ebb and flow with dozens of new articles about @@ -28,7 +30,7 @@ How can we effectively evaluate these technical arguments? --- -##Do I even have this problem? +## Do I even have this problem? How do you best design an API? Should you build a [hypermedia API][yes]? Or [not][no]? Is [REST or HATEOAS][rorh] the way to go? Should it speak [XML][xml]? [JSON][json]? [Siren][siren]? [HAL][hal]? [Protocol buffers][pb]? @@ -54,7 +56,7 @@ run into than right now, so delay any decisions as long as possible. [hal]: http://stateless.co/hal_specification.html [pb]: https://developers.google.com/protocol-buffers/docs/overview -##Where's the code? +## Where's the code? Writing, especially persuasive writing, is a messy thing. We are unable to separate emotion from logic in the heat of an argument. @@ -75,7 +77,7 @@ ultimately switched back to MVC. A new pattern can make sense in the abstract, but not be fully fleshed out when it comes to a concrete implementation. Do a **side-by-side comparison** of what actual code looks like using -competing techniques. You should be able to instinctive tell which option you prefer. +competing techniques. You should be able to instinctively tell which option you prefer. A technical argument without code almost seems like an economist postulating about why the GDP went down without using any supporting data. It seems absurd in other fields, why not ours? @@ -85,7 +87,7 @@ went down without using any supporting data. It seems absurd in other fields, wh [3]: http://saturnflyer.com/blog/jim/2012/12/18/chubby-models-are-still-fat-with-concerns-dci-focuses-on-how-things-work-together/ [4]: http://andrzejonsoftware.blogspot.com/2012/01/dci-and-rails-lessons-learnt.html -##Where is the author coming from? +## Where is the author coming from? Does the author work at a 5 person startup or a 50 person consulting shop or a 500 person corporation? Where do you work? @@ -122,4 +124,4 @@ author will help expand your understanding of the issue. This enables you to be to pick the best option for *you*. Being able to reach this conclusion and knowing when it is okay to go against the conventional -wisdom is a sign that you are growing as a developer. \ No newline at end of file +wisdom is a sign that you are growing as a developer. diff --git a/_posts/2013-03-19-cross-pollination.md b/_posts/2013-03-19-cross-pollination.md index 379fa38..277430d 100644 --- a/_posts/2013-03-19-cross-pollination.md +++ b/_posts/2013-03-19-cross-pollination.md @@ -3,6 +3,8 @@ layout: post title: "Cross-Pollinate" categories: - blog +tags: +- growth --- I learned an RSpec naming convention while pairing with a [developer][vam] at @@ -39,5 +41,5 @@ pair for an hour. I'd love for you to share what you learn with me someday. ---
-

Psst, if you're in the Indianapolis area, come pair with me any Monday night.

+

Psst, if you're in the Indianapolis area, come pair with me any Monday night.

\ No newline at end of file diff --git a/_posts/2013-03-26-too-much-information.md b/_posts/2013-03-26-too-much-information.md index 228cffc..59c4a98 100644 --- a/_posts/2013-03-26-too-much-information.md +++ b/_posts/2013-03-26-too-much-information.md @@ -3,6 +3,8 @@ layout: post title: "Too Much Information" categories: - blog +tags: +- growth --- *"So how long will this task take?"* An innocent question from the client at a diff --git a/_posts/2013-04-02-more-complicated-than-it-needs-to-be.md b/_posts/2013-04-02-more-complicated-than-it-needs-to-be.md index 92ec4c2..4eb859e 100644 --- a/_posts/2013-04-02-more-complicated-than-it-needs-to-be.md +++ b/_posts/2013-04-02-more-complicated-than-it-needs-to-be.md @@ -3,18 +3,16 @@ layout: post title: "More Complicated Than It Needs To Be" categories: - blog +tags: +- delightful_products --- -> Once you’ve hit the point where a simpler pattern isn’t working for you anymore and you -> have to start using the more complicated one, \[there’s a natural tendency\] to then -> always reach for the complicated one in other situations where the simple one would -> be just fine. -> Martin Fowler +> Once you’ve hit the point where a simpler pattern isn’t working for you anymore and you have to start using the more complicated one, \[there’s a natural tendency\] to then always reach for the complicated one in other situations where the simple one would be just fine. Martin Fowler The Boss needs an app to capture employee suggestions --- we can't use a cardboard box with a cut-out slot, we are a software company! -{% highlight ruby %} +```ruby class SuggestionsController < ApplicationController::Base before_filter :authenticate! before_filter :boss_only, except: [:new, :create] @@ -57,12 +55,12 @@ class SuggestionsController < ApplicationController::Base end end end -{% endhighlight %} +``` Sometimes simple is better. -{% highlight ruby %} +```ruby class SuggestionBox < Sinatra::Base get "/" do erb :form @@ -78,4 +76,4 @@ class SuggestionBox < Sinatra::Base redirect to("/") end end -{% endhighlight %} \ No newline at end of file +``` \ No newline at end of file diff --git a/_posts/2013-04-05-are-your-lights-on.md b/_posts/2013-04-05-are-your-lights-on.md index b390ca9..b6a8f7d 100644 --- a/_posts/2013-04-05-are-your-lights-on.md +++ b/_posts/2013-04-05-are-your-lights-on.md @@ -1,15 +1,13 @@ --- layout: writeup title: "Are Your Lights On?" +full_title: "Are Your Lights On?: How to Figure Out What the Problem Really Is" +author: "Donald Gause, Gerald Weinberg" +isbn: 0932633161 +image: lights-on.jpg categories: - writeup ---- - -![](/static/lights-on.jpg) -[Are Your Lights On?: How to Figure Out What the Problem Really Is][link] -Donald Gause, Gerald Weinberg -ISBN: 0932633161 - +favorite: true --- **What's the point?** @@ -63,4 +61,3 @@ programming books][dhh] and I am really glad I read it. It is a short book dealing with arguments about solutions or confusion about problems. [dhh]: http://37signals.com/svn/posts/3375-the-five-programming-books-that-meant-most-to-me -[link]: http://www.amazon.com/Are-Your-Lights-On-ebook/dp/B004WOXYV2/ref=nosim&tag=bookreview0a1-20 diff --git a/_posts/2013-04-10-changing-plans.md b/_posts/2013-04-10-changing-plans.md index a03f91d..239f820 100644 --- a/_posts/2013-04-10-changing-plans.md +++ b/_posts/2013-04-10-changing-plans.md @@ -3,6 +3,8 @@ layout: post title: "Changing Plans" categories: - blog +tags: +- practices --- There is some friction between agile methodologies and the desire for @@ -40,7 +42,7 @@ you depend on as arguments. Change from this: -{% highlight csharp %} +```csharp public class Appraisal { private ComicBook comicBook { get; set; } @@ -53,11 +55,11 @@ public class Appraisal { return comicBook.ListPrice * percentageModifier; } } -{% endhighlight %} +``` to this: -{% highlight csharp %} +```csharp public class Appraisal { private ICollectible collectible { get; set; } private IGrader collectableGrader { get; set; } @@ -72,7 +74,7 @@ public class Appraisal { return collectible.ListPrice * percentageModifier; } } -{% endhighlight %} +``` Did I have to define a Registry in an XML file? Is there some DI Container framework I have to setup? Nope, just a constructor argument. @@ -106,13 +108,13 @@ interrogating. For each public method, ask the object in the form of a question: [poodr]: http://www.poodr.info/ -{% highlight csharp %} +```csharp public class QuarterlySalesReport { public FiscalQuarter SalesQuarter() { ... } public IEnumerable AllSales() { ... } public Product MostProfitableProduct() { ... } } -{% endhighlight %} +``` "Mr. `QuarterlySalesReport`, what sale quarter are you for?" diff --git a/_posts/2013-04-17-how-to-not-quit.md b/_posts/2013-04-17-how-to-not-quit.md index 776ba3d..2fff2ce 100644 --- a/_posts/2013-04-17-how-to-not-quit.md +++ b/_posts/2013-04-17-how-to-not-quit.md @@ -3,10 +3,13 @@ layout: post title: "How to Not Quit" categories: - blog +tags: +- growth --- -> 1. Make friends with others who make software, and share your in-progress work with each other frequently. -> 2. Learn to think of \[1\] -- rather than the front page of HN/TechCrunch -- as the destination of your work. +> 1) Make friends with others who make software, and share your in-progress work with each other frequently. +> +> 2) Learn to think of \[1\] -- rather than the front page of HN/TechCrunch -- as the destination of your work. > > Look at it this way: if all goes well, they will eventually come to *you*. diff --git a/_posts/2013-05-02-expanding-contracting.md b/_posts/2013-05-02-expanding-contracting.md index 717f4e6..3137b90 100644 --- a/_posts/2013-05-02-expanding-contracting.md +++ b/_posts/2013-05-02-expanding-contracting.md @@ -3,6 +3,8 @@ layout: post title: "Expanding and Contracting" categories: - blog +tags: +- reflections --- I've been thinking about the concept of expansion and contraction lately. @@ -42,13 +44,13 @@ processes that no longer provide value. Both phases of the Expansion/Contraction Cycle are necessary. -Without expansion, you will hover around a [local maxima][max] - expending large amounts of time and effort +Without expansion, you will hover around a [local maxima][max] — expending large amounts of time and effort for minimal gain. Without contraction, you drift around in a sea of endless options and have only surface-level knowledge of anything. [max]: http://en.wikipedia.org/wiki/Maxima_and_minima -Near the phases transitions is when tension occurs. +Near the phase transitions, tension occurs.
Expansion / Contraction Cycle diff --git a/_posts/2013-05-08-delightful-software.md b/_posts/2013-05-08-delightful-software.md index 1135a00..1cb1f2e 100644 --- a/_posts/2013-05-08-delightful-software.md +++ b/_posts/2013-05-08-delightful-software.md @@ -3,6 +3,8 @@ layout: post title: "You (yes you!) can make delightful products" categories: - blog +tags: +- delightful_products --- You've probably heard about [delighting your customers][delight]. @@ -81,6 +83,6 @@ was this self-aware message in the footer — reminding myself to stop using [mission]: http://missionbelt.com/ [gh]: http://greyhousecoffee.com/ [hbr]: http://hbr.org/2010/07/stop-trying-to-delight-your-customers -[morale]: https://www.moraleapp.com/ +[morale]: /morale/ [queuerunner]: https://github.com/swanson/queue-runner [stringer]: https://github.com/swanson/stringer \ No newline at end of file diff --git a/_posts/2013-05-29-the-30-second-standup.md b/_posts/2013-05-29-the-30-second-standup.md index ec4fcdf..3f2abde 100644 --- a/_posts/2013-05-29-the-30-second-standup.md +++ b/_posts/2013-05-29-the-30-second-standup.md @@ -3,6 +3,9 @@ layout: post title: "The 30 Second Standup" categories: - blog +tags: +- practices +favorite: true --- The Three Pillars of Standup Meetings: @@ -15,7 +18,7 @@ Everyone stands in a circle and takes their turn answering the questions. The wh last only a few minutes and gets everyone of the same page. But when you consider all the extra crap that gets talked about at a standup — the -*"Oh, did you remember to do X when you did Y?"*, the *"I told you were should have done A, but the client +*"Oh, did you remember to do X when you did Y?"*, the *"I told you we should have done A, but the client made us do B"*, the *"By the way, can we add a new item type in Jira for tracking requirement changes?"*, the *"Let me tell you about every line of awesome code I wrote yesterday"* — you are now approaching the 15 minute mark and the cost is breaching four-figures. @@ -70,4 +73,4 @@ So should every team switch to the 30 Second Standup? Absolutely not. Every team should continuously **challenge dogmatic practices and reflect on their value**. Don't be afraid to tweak processes that aren't working for your team. Don't blindly follow the rules if -you can't justify them to an outsider. \ No newline at end of file +you can't justify them to an outsider. diff --git a/_posts/2013-05-31-summer-reading-list.md b/_posts/2013-05-31-summer-reading-list.md index caa9921..98f42ed 100644 --- a/_posts/2013-05-31-summer-reading-list.md +++ b/_posts/2013-05-31-summer-reading-list.md @@ -3,6 +3,8 @@ layout: post title: "The Intern & New Hire Summer Reading List" categories: - blog +tags: +- growth disclaimer: true --- @@ -19,6 +21,7 @@ everything from getting the most out of your development tools to software desig development and how to work in a team environment. Sections to pay close attention to: + * __Communicate!__: a crash course in technical communications * __Tracer Bullets__: write a barebones, end-to-end skeleton * __Decoupling and the Law of Demeter__: smaller modules with minimal dependencies are good @@ -45,6 +48,7 @@ a career in software. There is so much fantastic advice in this book that it des known. Sections to pay close attention to: + * __The Long Road__: keep your focus on the long term, value growth over salary * __Find Mentors__: seek out and learn from those that are ahead of you * __Create Feedback Loops__: how to get useful feedback @@ -71,6 +75,7 @@ Tell Don't Ask, role behavior, object composition — that doesn't feel over won't pick up and master every concept the first time, but it is good to get exposure as early as possible. Sections to pay close attention to: + * __Deciding What Belongs in a Class__: introduction to SRP, code that is easy to change * __Writing Loosely Coupled Code__: managing dependencies and choosing dependency direction * __Creating Flexible Interfaces__: thinking about Messages diff --git a/_posts/2013-06-03-jekyll-201.md b/_posts/2013-06-03-jekyll-201.md index f567f2c..a91ee6d 100644 --- a/_posts/2013-06-03-jekyll-201.md +++ b/_posts/2013-06-03-jekyll-201.md @@ -31,7 +31,7 @@ If you are coming from a traditional web development background, you might want to know how to pass in data to a partial. Maybe you have some book recommendations in your sidebar, like so: -{% highlight html %} +```html
  • @@ -45,7 +45,7 @@ recommendations in your sidebar, like so: A book about Getting Real and stuff...
-{% endhighlight %} +``` You can make a partial (e.g. `_includes/recommendation.html`) so you aren't copy-pasting HTML code: @@ -253,8 +253,8 @@ Are there more Jekyll topics you want to see covered? Hit me up on [fm]: http://jekyllrb.com/docs/frontmatter/ [plugin]: http://jekyllrb.com/docs/plugins/ -[isl]: http://indystartuplab.org -[islc]: https://github.com/IndyStartupLab/indystartuplab.org +[isl]: https://indystartuplab.github.io/ +[islc]: https://github.com/IndyStartupLab/indystartuplab.github.io [lwh]: http://letsworkhappier.com [lwhc]: https://github.com/sep/letsworkhappier.com [aa]: http://www.lostdecadegames.com/blog-author-attribution-using-jekyll/ diff --git a/_posts/2013-07-04-delightful-ux-mediums-time-to-read.md b/_posts/2013-07-04-delightful-ux-mediums-time-to-read.md new file mode 100644 index 0000000..0974ff4 --- /dev/null +++ b/_posts/2013-07-04-delightful-ux-mediums-time-to-read.md @@ -0,0 +1,73 @@ +--- +layout: post +title: "Delightful UX: Medium's Time to Read" +categories: +- blog +tags: +- delightful_products +favorite: true +--- + +[Medium][m] recently implemented a simple feature that I think is +really great. + +[m]: https://medium.com + +At the top of every blog post, there is a blurb telling you how long the +article will take to read — this post is a "3 min read" or a "12 min read". + + + +As soon as I noticed this, I smiled. + +The implementation is probably trivially easy, something like: + +```ruby +def minutes_to_read(post) + (post.word_count / AVG_WORDS_PER_MIN).round +end +``` + +But what it shows is that Medium has a deep understanding of how people consume +blog posts. + +Do you ever glance at the scroll bar to see if a post is a huge essay or a quick +hitter you can read while your code is compiling? Because I do all the time. And +I've never seen this "Time to Read" feature on any other blog platform. + +Additionally, it keeps readers on Medium for longer — even if you are +only mildly interested in an article, if you know it's only going to take 2 +minutes to finish, you'll stick it out. Since Medium's whole vision seems to +be centered around high quality content, preventing a sub-10 second bounce seems +worthwhile. + +--- + +Newer models of the Kindle have a similar feature: using your past page turning +speed to predict when you will finish your next chapter (or even the whole book). + +
+ Kindle's Time Left in Chapter/Book +
+ +Kindle users reap similar benefits — I can decide to pause reading for the +night or press on a few more minutes to reach a natural stopping point at the +chapter break. + +And Amazon benefits from me seeing that I have only 20 minutes left in this +book, but eight days of vacation left — time to go order a new book. + +--- + +It's a small thing, but **the sum of small UX delights leads to a great product**. + +Have you seen any other small bits of awesome UX lately? Hit me up +on [Twitter][tw], I'd love to hear about it. + +By the way, this post should have taken you 2 minutes to read. + +[tw]: https://twitter.com/_swanson diff --git a/_posts/2013-07-05-the-first-20-hours.md b/_posts/2013-07-05-the-first-20-hours.md new file mode 100644 index 0000000..12c0806 --- /dev/null +++ b/_posts/2013-07-05-the-first-20-hours.md @@ -0,0 +1,44 @@ +--- +layout: writeup +title: "The First 20 Hours" +full_title: "The First 20 Hours: How to Learn Anything...Fast!" +author: Josh Kaufman +isbn: 1591845556 +image: first-20-hours.jpg +categories: +- writeup +--- + +**What's the point?** +You aren't going to become an expert at most things in only 20 hours, but that's +okay. There is a minimum level of competency that you can achieve that turns a +hobby into something enjoyable. + +This book includes a list of tips for rapid skill acquisition and a collection +of diary-style chapters about how the author used the tips to learn things like +web development, playing go, and yoga. + +**How was it?** +It was a fun read. The framework is laid out in the first few chapters; steps +include choosing a project you enjoy, acquiring necessary tools, and defining a +clear target level of performance. + +The book goes a bit astray when it switches to examples. The concept of using the +author's own experience picking up new skills is interesting — but I was left +wanting more insight. When Kaufman mentioned researching the best materials +for each skill, I wanted to know more about his process for finding the +books: what did he search for, how did he find helpful experts, etc. + +The examples focused too much on just recounting what the author did; this was +frustrating since the majority of the book was devoted to these recaps. + +Overall, I think the first two sections about tips for rapid skill acquisition +and improving your learning ability are worthwhile. I would recommend reading +those and then maybe one of the examples that most interests you (and skipping +the rest). + +**Who should read it?** +If you are looking to become competent in a new skill, I think the book is worth +a ready; just don't hope for a magic solution to that will help you master anything +without putting in long hours. + diff --git a/_posts/2013-07-07-crush-it.md b/_posts/2013-07-07-crush-it.md new file mode 100644 index 0000000..e245df1 --- /dev/null +++ b/_posts/2013-07-07-crush-it.md @@ -0,0 +1,35 @@ +--- +layout: writeup +title: "Crush It" +full_title: "Crush It: Why Now Is the Time to Cash In on Your Passion" +author: Gary Vaynerchuk +isbn: 0061914177 +image: crush-it.jpg +categories: +- writeup +--- + +**What's the point?** +Success comes from out-working your competition. If you are really passionate +about something, you can make money at it — but it will be a long and +unglamorous road. + +**How was it?** +Very mixed opinions on this one. It was very motivational and I appreciated +concrete steps for building a brand and audience (although some of it seemed +a little spammy). + +But at the same time, I didn't really learn any new skills or gain perspective. + +I was also convinced by the next book I read — [So Good They Can't Ignore You][good] +— that following your passionate is not a good idea and doesn't even lead to +happiness in your work life. + +**Who should read it?** +If you are dead-set on trying out the "lifestyle design" path that is popular +these days, I think this book is helpful and provides a place to start. Just be +sure to be a bit skeptical as you go. + +[good]: http://mdswanson.com/writeup/2013/07/08/so-good-they-cant-ignore-you.html + + diff --git a/_posts/2013-07-08-microinteractions.md b/_posts/2013-07-08-microinteractions.md new file mode 100644 index 0000000..a837a47 --- /dev/null +++ b/_posts/2013-07-08-microinteractions.md @@ -0,0 +1,42 @@ +--- +layout: writeup +title: "Microinteractions" +full_title: "Microinteractions: Designing with Details" +author: Dan Saffer +isbn: 144934268X +image: microinteractions.jpg +categories: +- writeup +favorite: true +--- + +**What's the point?** +Microinteractions are the small moments of action we take in a product — +the details that together make up a feature. The design of these interactions can +make a product more memorable, more enjoyable and easier to use. + +**How was it?** +Really good — I think this book fills a missing gap for a skill set that is +becoming increasingly important. This kind of delightful UX is going to be a key +differentiator for products and this book is a must-read. + +The book wastes no time diving into the structure of a [microinteraction][m]: + +[m]: http://microinteractions.com/ + +* Trigger - either user or system initiated, something has to kick off the interaction +* Rules - the constraints for an interaction (what can or can't be done, what order, how to prevent errors) +* Feedback - help the users understand the Rules of the microinteraction, determine the best channel for communication (visual, audio, haptic) +* Loops / Modes - use long loops to remember past interactions or improve on them over time; limit modes to infrequent actions as much as possible + +Each of these steps are broken down and explained with plenty of examples for real +applications. There is also a really great list of questions to help fix dull +microinteractions that I wish I had for several of my past projects at work. + +This is a great reference that I can point to when trying to describe how +to build a delightful user experience. It is a concept that is hard to explain +and having a common language and framework will be very helpful going forward. + +**Who should read it?** +Any developer or designer that wants to work on user-facing products should read +this book ASAP and then go try to implement the concepts in their own work. diff --git a/_posts/2013-07-08-so-good-they-cant-ignore-you.md b/_posts/2013-07-08-so-good-they-cant-ignore-you.md new file mode 100644 index 0000000..baeb275 --- /dev/null +++ b/_posts/2013-07-08-so-good-they-cant-ignore-you.md @@ -0,0 +1,49 @@ +--- +layout: writeup +title: "So Good They Can't Ignore You" +full_title: "So Good They Can't Ignore You: Why Skills Trump Passion in the Quest for Work You Love" +author: Cal Newport +isbn: 1455509124 +image: so-good.jpg +categories: +- writeup +favorite: true +--- + +**What's the point?** +"Follow your passion" is actually not good advice if you are seeking happiness +with your job. Passion is rare, dangerous, and oftentimes only comes with mastery. + +A better approach is to focus on improving your skills, gaining more control, and +finding a mission. + +**How was it?** +This is my favorite book of the year by far. + +Newport takes a very academic approach by making a hypothesis and then providing +evidence to support his views. He argues that "passion mindset" — in which +you focus on what value your job is offering to you — leads to unhappiness +and constantly hoping for a magically new job just around the corner that will fix +everything. + +Instead, Newport argues we should adopt a "craftsman mindset" and focus on the +value you can offer to the world through your job. By increasing your skill level +in areas that are "rare and valuable" you gain career capital that you can leverage +to create work that you love. + +By not focusing on getting a great job, but instead looking at the *traits* of +great jobs, we can think about them in terms of basic supply and demand. To get +a great job, you must have something of great value to offer. And deliberate +practice and a focus on being "so good they can't ignore you" is a highly effective +strategy for acquiring valuable skills. You can then use those skills to increase +aspects of a job that are scientifically-proven to make you happier, like control, +autonomy, and expertise. + +The book also makes a strong argument against the "courage culture" of today's +resources for landing a dream job. If you have not built up the skills to succeed +in a new field, passion and the courage to quit your job are not going to magically +make you successful or fulfilled. + +**Who should read it?** +If you've ever daydreamed about how much better your life would be if you were +only working at that cool company, you should seriously read this book. diff --git a/_posts/2013-07-12-confident-ruby.md b/_posts/2013-07-12-confident-ruby.md new file mode 100644 index 0000000..5bb131a --- /dev/null +++ b/_posts/2013-07-12-confident-ruby.md @@ -0,0 +1,34 @@ +--- +layout: writeup +title: "Confident Ruby" +author: Avdi Grimm +image: confident-ruby.png +book_link: http://devblog.avdi.org/2013/05/19/confident-ruby-now-in-beta/ +categories: +- writeup +--- + +**What's the point?** +Confident codes tells a story without getting bogged down in edge-cases or +excessive defensive programming habits. + +By improving timid code and other distractions, we can write better code that +others (or our future selves) will be able to jump right into. + +**How was it?** +Some of the techniques seemed a bit esoteric to me — especially the stuff +on conversion protocols — but overall there was good, practical advice +that I can incorporate into my code. + +The sections that I found most beneficial were on policy objects and making +better use of blocks and yielding (something I am pretty bad at). + +The book follows a pattern template; not the greatest for flow but easier to search +through as a reference. I wish I could go back in time and pass a few copies of +this around before my most recent Ruby project — there was a real lack of +confident code and the notorious `nil` affliction. + +**Who should read it?** +It is a good source of learning material for an intermediate Ruby programmer; some +of the more generic patterns (Null Object, Policy Object, Parameter Object) are +applicable outside of Ruby, but there is quite a bit of Ruby-specific stuff. diff --git a/_posts/2013-07-12-the-motivation-hacker.md b/_posts/2013-07-12-the-motivation-hacker.md new file mode 100644 index 0000000..3a113de --- /dev/null +++ b/_posts/2013-07-12-the-motivation-hacker.md @@ -0,0 +1,43 @@ +--- +layout: writeup +title: "The Motivation Hacker" +author: Nick Winter +image: motivation-hacker.jpg +book_link: https://amzn.com/B00C8N4FNK?tag=mdswanson-20 +categories: +- writeup +--- + +**What's the point?** +According to research science, motivation can be modeled by an equation: + + Motivation = Expectancy x Value + --------------------- + Impulsiveness x Delay + +By tweaking the parameters ("hacking" in the parlance of today's self-help books) +using different techniques, we can increase motivation and achieve goals. + +**How was it?** +It was an interesting read and I picked up a few new techniques that seemed +novel. + +One of the main concepts in the book is "success spirals". By increasing +your confidence that you will achieve a goal, you raise your Expectancy and +improve motivation. By building up small victories, you make success the norm; +the goals can be very small — things like exercising for one second a day. + +The other technique I liked was "precommitment". This one reduces Impulsiveness +by limiting your future options so you can't weasel out when the time comes. This +includes things like scheduling events way in advance, prepaying and setting an +unreversible "punishment" if you fail to achieve something by a certain date. + +Even if you aren't into motivation hacking, the book was entertaining as the +author detailed his quest to achieve 18 goals (while writing this book). + +**Who should read it?** +I'm a sucker for this kind of motivation and self-improvement book that has a +splash of psychology thrown in, but I thought this was a very refreshing and +practical look at motivation. If you have set goals in the past and not achieved +them, I think you can use the Motivation Equation to explain (or at least +rationalize!) why you went off the rails. diff --git a/_posts/2013-07-14-whats-your-10-minute-hobby.md b/_posts/2013-07-14-whats-your-10-minute-hobby.md new file mode 100644 index 0000000..4f7c835 --- /dev/null +++ b/_posts/2013-07-14-whats-your-10-minute-hobby.md @@ -0,0 +1,39 @@ +--- +layout: post +title: "What's your 10 minute hobby?" +categories: +- blog +published: false +--- + +I often find myself with 10 mintues on my hands. I might be waiting for a +meeting to start, in line at a take-out place, or riding as a passenger in a +car. + +I've been trying to find a way to capture this time and turn it into something +productive. My current time filler is to check Twitter or Hacker News — +something I do more than enough of already. + +Ideally, I'd like something that I can do on my phone that has some value and +is conducive to being done in small chunks. + +I haven't found what a great solution yet but here is what I have tried: + +* Puzzle game: I like the simplicity and design of this puzzle game but it +got repetitive and depends on randomness too much; plus games are not very +productive +* Sudoku: More mentally stimulating, but didn't hold my attention for long; games +seemed to take too long and it was hard to remember where I left off +* Go "Tsumego": This is like the puzzle mode of the ancient board game Go; there +are apparently tons of these online with a good range of difficulties but I could +not find any good Android apps that were beginner friendly +* Learn a language: Many people suggest studying a foreign language with +vocabulary flash cards and some type of spaced repition model; I don't speak any +languages and I think this would be hard for me to stick with +* General SRS: Use a spaced repition app to help memorize some stuff; I tried +Anki but I couldn't find any decks that seemed useful to me + +Maybe I am being too picky, but I'd like to find something mental stimulating to +fill this dead time with. + +What should I try next? Any suggestions? diff --git a/_posts/2013-07-15-helplessness.md b/_posts/2013-07-15-helplessness.md new file mode 100644 index 0000000..377df02 --- /dev/null +++ b/_posts/2013-07-15-helplessness.md @@ -0,0 +1,69 @@ +--- +layout: post +title: "Helplessness" +categories: +- blog +published: false +--- + +It was Wednesday night. 10:45 pm. + +The project was due at the start of the lab. Just under six hours to go. + +The ECE270 semester project was not worth a large portion of your grade, but +it did carry consequences if you bombed. + +I was working in a group of four, though I felt like a group of one. Not because +I was pulling the weight of the rest of the group, but because **I** was the one +being pulled. + +I was doing fine in the class, but I got talked into an ambitious project design +— one that I wasn't capable of executing. I tried my best to make +contributions, but as the deadline loomed, I felt helpless. + +Unable to help debug the problems we were having, I just sat behind a wizard, +hoping that he could conjure the right magic for us to pass the course. + +It was a horrible feeling of not being in control. I was leaving my fate up to +someone else. I didn't like it. + +--- + +The same feelings came rushing back to me on a recent project. As the project +schedule slipped, I was frozen. I couldn't fix the problems — I didn't +know how. All I could do was try to give general advice and serve as a rubber +duck. + +I could see my teammates struggling and putting in long hours, but I couldn't +help. + +I get very uneasy when I have to work with something I don't understand. + +Treat it like black box! That doesn't really work when your self-confidence has +been shredded as you flail around not getting anywhere. + +I felt this on a small scale when I started doing web development. There were big +areas where I just felt helpless: JavaScript, databases, testing, CSS. + +It led me to expanding my breadth and picking up front and backend skills. I think +I even have pretty good design chops now. + +I did not want to end up helpless again. I hated having to rely on other people to +finish my projects. I had high standards of quality — sometimes irrationally +high — and I wanted to just do it myself to make sure it was done right. + +It's not really working. + +Sure, I can ship an app on my own. But the fringes are always scary and never stop +expanding. + +Provisioning servers is still largely a mystery to me. I can string together some +jQuery but client-side MVC is kicking my ass. I have trouble maintaining quality +across larger apps. Customer interviews and the people aspects of building a +product make me anxious. + +I can't do it all. + +I need to get better at letting go and trusting others. But man, that is hard. + + diff --git a/_posts/2013-07-17-myers-briggs-for-programming-styles.md b/_posts/2013-07-17-myers-briggs-for-programming-styles.md new file mode 100644 index 0000000..dc5dbaf --- /dev/null +++ b/_posts/2013-07-17-myers-briggs-for-programming-styles.md @@ -0,0 +1,60 @@ +--- +layout: post +title: "Myers-Briggs for Programming Styles" +categories: +- blog +tags: +- tangential +favorite: true +--- + +The [Myers-Briggs Type Indicator][mbti] assessment is a well-known test that is +said to measure someone's personality. You answer a series of questions and based +on your results, you get a "type" — a four letter code like `ESTJ` or `INFP`. + +[mbti]: http://en.wikipedia.org/wiki/Myers-Briggs_Type_Indicator + +The basic idea is that people fall somewhere along a range on four pairs of +preferences ("dichotomies" is the fancy term). By answering a bunch of questions, the +test determines which end best fits your personality. + + + Extraversion (E) --- (I) Introversion + Sensing (S) --- (N) Intuition + Thinking (T) --- (F) Feeling + Judging (J) --- (P) Perception + +I'm not really into the Myers-Briggs or anything, but some people are! + +I've definitely heard things like "Oh, I won't get along with Joe because he is +an `INTP` and I'm `ENFP`". + +It got me thinking: could you do a similar test tailored to programming +styles? + +Everyone has their own personality when developing, their own nuances and conventions +that they follow. And sometimes they aren't compatible across teams. + +If someone favors functionality programming and loves using it everywhere, that could +create friction amongst a group of OO diehards. If I value testing more than you, we +might argue about a perceived lack of test coverage, neither one of us willing to back +down. + +Obviously, I am not a psychologist but I would be interested in taking such a test. + +The test questions could feature a bunch of code snippets and you pick which options +you prefer. Maybe the Myers-Briggs for Programming Styles dichotomies would be +something like: + + + Convention/Magic (M) --- (V) Configuration/Verbosity + Functional (F) --- (O) Object Oriented + Readability (R) --- (P) Performance + Quality/Robustness (Q) --- (S) Speed/Productivity + +I think some of these traits change depending on context and specific projects, but +I can say that generally speaking I am a `VORS` on this made-up scale. Maybe this +would be useful to know if you were going to work with me or we were always getting +into technical arguments. If nothing else, it would be fun to measure! + +What do you think? Has something like this been done before? diff --git a/_posts/2013-07-18-step-by-step-ux-improvement.md b/_posts/2013-07-18-step-by-step-ux-improvement.md new file mode 100644 index 0000000..231fab9 --- /dev/null +++ b/_posts/2013-07-18-step-by-step-ux-improvement.md @@ -0,0 +1,120 @@ +--- +layout: post +title: "Step-by-Step UX Improvement: Project Screenshots" +categories: +- blog +tags: +- work_log +--- + +I've been playing the role of UX fairy on my current project at work +this week — I go around the app, sprinkling little bits of +small improvements. + +I thought it might be useful to document some my decisions and reasoning. + +Background: The app tracks company projects (who worked on them, what +technologies were used, etc). A new feature was added recently to +allow for project screenshots to be uploaded and displayed, but it +could use some UI/UX love. + + +Chops UX Step 0 + + +
+
+ +## Scenario: A project with no screenshots + + +Chops UX Step 1 + + +Observations: + +* The stock image for [placehold.it][ph] that was left from +development +* View All link takes user to an empty page that says "No screenshots +for this project" + +[ph]: http://placehold.it/ + +Tweaks: + +* Remove hot-linked placeholder with basic styled text; I can't photoshop +my way out of an Adobe-brand paperbag so I have to stick to text instead of +making a better placeholder image +* Add conditional to not render View All if there are no screenshots to +prevent the user from performing an "empty action" + + +Chops UX Step 2 + + +## Scenario: A project with one screenshot + +Chops UX Step 3 + + +Observations: + +* Carousel arrows are shown but don't do anything since there is only one +image +* Inconsistent casing on user actions (each word capitalized vs first word +only) +* Use of black `|` pipe instead of gray `·` dot does not match rest of the +app + +Tweaks: + +* Use Javascript to hide carousel controls if there is only one screenshot +* Change user action text to be consistent (we use lowercase +throughout the app) and more terse +* Swap in dot separator + + +Chops UX Step 4 + + +## Scenario: A project with multiple screenshots + +Chops UX Step 5 + + +Observations: + +* Everything looks pretty good! + +## Final tweaks + +Chops UX Step 6 + + +* I added a screenshot icon to the placeholder using [FontAwesome][fa] for a +little bit of visual flair + +[fa]: http://fortawesome.github.io/Font-Awesome/ + +Compared the before and after, had a teammate give it a quick once over, +and pushed the changes to master. While doing this, I noticed that there +isn't a way to remove a screenshot, so I added a work item to implement this +feature. + +--- + +Overall, I am pretty happy with the changes — it feels like a good +balance between time and improvement. All in all, it took about 30 minutes +(less than the time it took to write this post). It's nothing ground-breaking +but making small improvements constantly helps keep the UX tight and gives +other developers good examples to reference. + +Hopefully this was helpful! I picked up most of this stuff from working +with others that had a good sense for design and playing around with it +on my own, but there are certainly some common patterns that are generally +applicable. + +If you liked this format, let me know on [Twitter][tw] and I'll write up a few +more. + +[tw]: https://twitter.com/_swanson diff --git a/_posts/2013-07-19-getting-traction-for-your-open-source-project.md b/_posts/2013-07-19-getting-traction-for-your-open-source-project.md new file mode 100644 index 0000000..688b55f --- /dev/null +++ b/_posts/2013-07-19-getting-traction-for-your-open-source-project.md @@ -0,0 +1,175 @@ +--- +layout: post +title: "Getting Traction for your Open Source Project" +categories: +- blog +tags: +- practices +--- + +I released an open source RSS reader — [Stringer][s] — a few +months ago and it has enjoyed a fair amount of popularity. It is a bit +tough to measure usage (GitHub doesn't track number of clones, self- +hosted with no mechanism to "phone home") but it is approaching 2000 +stars on GitHub and has at least [1300 installs][marco]. + + +[marco]: http://www.marco.org/2013/07/10/post-google-reader-subscriber-stats + +This is my first project on GitHub to really blow up; I had mild +success (~50 star range) for a landing page app I built a while ago, +but Stringer has far exceeded that. + +This post recounts my observations about getting traction for Stringer +— results may vary but I think this is pretty sound and very +actionable advice. + +There is definitely luck involved but I want to talk about a great +concept from Jason Roberts: [luck surface area][lsa]. The amount of +luck you have is proportional with the number of people you have +communicated your something to. + +[lsa]: http://www.codusoperandi.com/posts/increasing-your-luck-surface-area + +Here are some deliberate steps I took to increase my luck surface area +for Stringer: + +# Timing + +The Google Reader shutdown had been announced. Like most people I was +a little bummed out, but it was far enough in the future that I didn't +give finding an alternative much thought. + +By March, I was starting to get bothered by the "Google Reader is +shutting down" popups and decided to look for other options. + +When I released Stringer it was near the beginning of the "hey I wrote +an RSS reader" wave that was picking up steam. There was a bit of first +mover advantage here, if I could build something compelling to a user +they wouldn't have to write their own or go with one of the other +options. + +The timing was also important for "freshness" — Stringer was not +the only self-hosted RSS reader out there. [Fever][f] and [Tiny-Tiny RSS][ttr] were +both popular, but they both looked dated and unmaintained. In +comparison, Stringer was new and in active development. + +[f]: http://www.feedafever.com/ +[ttr]: http://tt-rss.org/redmine/projects/tt-rss/wiki + +# Screenshots, screenshots, screenshots... + +I'm not going to lie: design is huge for this kind of project. Design +is huge for every open source project, it just takes different forms. + +[Requests][req] doesn't need pretty screenshots, but it needs to convey the +well-designed API with clear examples at the top of the README. + +[req]: https://github.com/kennethreitz/requests + +An app **must** have screenshots — or some kind of demo mode. + +Go look at a bunch of "Show HN" posts and you will almost always see a +comment along the lines of "I'm not going to register just to see what +your app looks like, please add a screenshot". + +And they are right! Are you really going to clone my git repo, install +a bunch of gems and setup a database to find out what the thing looks +like? Of course not. I wouldn't and I can't imagine who would. + +Stringer has three big screenshots, all specifically picked to show a +different part of the app. An instruction page that shows you use the +thing, an Inception-like shot of someone reading a post about Stringer +while using Stringer, and a final shot showing the feed management +page. + +Stringer Screenshot + +Compare the [README][rm] of Stringer to some competitors: [CommaFeed][cf] +[selfoss][ss] [NewsBlur][nb]. You can tell if Stringer is going to be the right choice for you right away. + +[rm]: https://github.com/swanson/stringer/blob/master/README.md +[cf]: https://github.com/Athou/commafeed/blob/master/README.md +[nb]: https://github.com/samuelclay/NewsBlur +[ss]: https://github.com/SSilence/selfoss + +# Marketing - it's all about the Snowball + +I don't have a large Twitter following. At the time of this writing I +have 375 followers. When I first tweeted about Stringer I had closer +to 275. + +I had local connections from the Indy.RB meetup group so I got a few +retweets from that, but by and large I didn't make a huge ripple. + +I sent a tweet with the `#replacereader` hashtag, something that I came +across when looking for alternatives. Again, nothing big here. + +And lastly, I sent a [tweet][tcl] to `@TheChangelog` — the +only blog about open source that I really knew of. + +[tcl]: https://twitter.com/_swanson/status/330344830364434432 + +I posted a [ShowHN][shn] (19 pts - got autoflagged because I direct +linked to it on Twitter, don't do that) and posted it to /r/programming +and /r/ruby (+188 and +76 respectively). + +[shn]: https://news.ycombinator.com/item?id=5650606 + +And then it was time for the Snowball Effect to kick in. + +`@TheChangelog` (6k followers) [tweeted it][cl] and put it on their blog +(I was so pumped!). The reddit and HN Twitter bots started sending it +out, there are a few accounts with a couple thousand followers that +just tweet the top stories. + +[cl]: http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/ + +`@ruby_news` (14k) picked it up from /r/ruby and it was later in Peter +Cooper's Ruby Weekly newsletter (10k+ readers, %55 open rate). + +From there other blogs and people on Twitter start picking it up +and pretty soon you are at 1000 stars. Now you are a trending repo on +GitHub and are showing up at the top of GitHub searches for "rss +reader"! + +I made sure to respond to any questions on Twitter and to post a link +to Stringer in a few comment threads on HN about RSS readers (but not +every one, don't come off as spammy). + +Stringer got picked up by [OneThingWell][otw] and started getting some +attention from the designer space. I started getting tweets from +users that had it up and running and were telling their friends. + +[otw]: http://onethingwell.org/post/49859167693/swanson + +Luck plays a huge part, but just telling people about what +you made really improves your luck. + +# Personality/Vision + +Early on, I gave the project a distinct product vision. Stringer is an +anti-social RSS reader. I took an opinionated stance on the direction +I wanted to take and made it very clear from the get-go. Maybe you will +lose some potential users that feel alienated, but for a smaller group +your project will really resonate and they will help you promote it. + +It is the same line of thinking that has become popular in product +development. Build something that a small group loves instead of a +bland one-size-fits-all app with 37 features. + +Having a strong tagline also gives people good tweet-fodder ;-) + +I felt really awful having to reject pull requests that didn't fit the +vision of the project, but at the end of the day Stringer is better for +it. + +--- + +Was it lucky that [Stringer][s] got so popular? Absolutely. + +But I increased my luck surface area substantially with good timing, +plenty of screenshots, telling people, and giving it some +personality. + +[s]: https://github.com/swanson/stringer \ No newline at end of file diff --git a/_posts/2013-07-21-email-as-the-interface.md b/_posts/2013-07-21-email-as-the-interface.md new file mode 100644 index 0000000..a18c431 --- /dev/null +++ b/_posts/2013-07-21-email-as-the-interface.md @@ -0,0 +1,90 @@ +--- +layout: post +title: "Email as the Interface" +categories: +- blog +tags: +- delightful_products +favorite: true +--- + +I think using Email as the Interface is a really interesting concept for building new +products. I know it sounds old-school, but hear me out. + +Think about some of the advantages for building an email-first application: + +* **Widespread corporate adoption**: every company has email (at least every company that +would buy a software product) and receiving email doesn't require any special software +to be install. + +* **Asynchronous**: as [Ryan Hoover points out][rh], email is asynchronous. This facilitates a +concierge model that lets you [do things that don't scale][pg]. Imagine a monthly email +recommending books I should read written by an actual bibliophile and not some automated +recommendation system; it might take someone an hour per user, but you've got all month +to finish them. + +[rh]: http://ryanhoover.me/post/43986871442/email-first-startups +[pg]: http://paulgraham.com/ds.html + +* **Push system**: in a standard web app, you are often relying on users to come to your site, +login and do some task. With email, you can create a "push system" and keep a user engaged +in your application. [Life-cycle emails][lc] are all the rage, why not adapt them into your actual +product workflows? + +[lc]: https://training.kalzumeus.com/lifecycle-emails + +* **One less application**: lots of business folks spend most of their days in Gmail or Outlook +already, so an email interface has less cognitive overhead. You can get email on your phone, +tablet, or laptop; no need to build native apps right off the bat. + +* **Less features**: you might not think is a benefit but email forces you to be very deliberate +about design user interactions and simplifying processes. You can't embed a drag-and-drop AJAX +calendar in an email, but you could email someone three date options as links and let them +pick one. + +![Morale daily email]({{ site.url }}/static/morale-email.png) + +* **The future is interesting**: Gmail recently came out with something called [Schemas][sc], a +special markup you can add to emails to create buttons and other actions (add to calendar, +write a review, etc) directly in the user's inbox. + +![Gmail Add to Queue button]({{ site.url }}/static/gmail-add-to-queue.png) + +[sc]: https://developers.google.com/gmail/schemas/reference/one-click-action + +* **Easier to delight**: for whatever reason, getting a weekly email with movie recommendations +seems more fun than logging into Netflix; when I saw [Minimalytics][ma] I got super excited about +getting a weekly metrics email, even though the same information is available in the apps +directly. + +[ma]: http://www.minimalytics.com/ + +* **Less competition**: there are tons of CRM apps, but email based applications like [Streak][st] have +a built-in differentiator. + +[st]: http://www.streak.com/ + +* **Scaling is crazy cheap**: sending emails is ridiculously cheap right now. [Mandrill][md] is sending +thousands of emails for [MoraleApp][morale] a month and we are still under the 12k/month free plan +and Mandrill is doing all the hard work of maintaining a positive reputation to avoid landing in spam. + +* **Interesting technical challenges**: go tell a computer scientist you need an NLP +system to parse expenses out of a free-form inbound email and watch their face light up. Or how +about a headless Javascript engine to generate [beautiful summary emails][ps] on the fly? + +[ps]: http://blog.parsely.com/post/34241210620/whatever-it-takes + +--- + +Email may seem old and crusty, but that's fine with me — Email as the Interface is a great +fit for prototyping and building out a laser-focused product that can easily integrate into +people's everyday usage. + +So while a committee argues about the OAuth3 spec, I'll be building something cool that's coming +to your inbox soon. + +[morale]: /morale/ +[md]: http://mandrill.com/pricing/ +[sc]: https://developers.google.com/gmail/schemas/ + + diff --git a/_posts/2013-07-21-half-baked-thoughts-on-ruby-web-architecture.md b/_posts/2013-07-21-half-baked-thoughts-on-ruby-web-architecture.md new file mode 100644 index 0000000..7b5e498 --- /dev/null +++ b/_posts/2013-07-21-half-baked-thoughts-on-ruby-web-architecture.md @@ -0,0 +1,265 @@ +--- +layout: post +title: "Half-Baked Thoughts on Ruby Web Architecture" +categories: +- blog +--- + +Some half-baked ideas I've been playing around with on my Ruby projects recently. + +# Informal DCI + +I got really into DCI a few months ago. I picked up [Clean Ruby][cr] and acquired a copy of +[Lean Architecture][la] (didn't make it past page 10), but I need to explore most ideas in actual +code instead of books. + +[cr]: http://www.clean-ruby.com/ +[la]: http://www.leansoftwarearchitecture.com/ + +The idea of DCI — as I have cystallized it — is to extract behavior into groups +of roles or actions and then inject this new behavior into objects. + +The canonical example, instead of this: + +```ruby +class User < ActiveRecord::Base + attr_accessible :email, :name + + ... bunch of validators ... + + ... tons of other crap ... + + def approve(request) + request.state = :approved + ApprovalMailer.send_approval_mail(request) + end +end + +user.approve(request) +``` + +Do something like this: + +```ruby +class User < ActiveRecord::Base + ... only user model stuff ... +end + +class Approver + def approve(request) + request.state = :approved + ApprovalMailer.send_approval_mail(request) + end +end + +user.extend(Approver) +user.approve(request) +``` + +It is now easier to test the `Approver` behavior in isolation, `User` becomes less of a junk +drawer, it sort of makes more sense from a real-world sense since a user will be acting as +an approver in some contexts (and maybe acting as a `Moderator` or something in another context). + +I've seen some people [arguing for a convention][call] were all of the behavior roles have a method +called `call`. This seems really silly to me and I can't think of a good reason for it (and +the reason against it is that it hurts readability). I've also read arguments that using `extend` +really screws up the "method cache" and is [apparently bad][busted]. + +So for a while I was in this weird state: I liked the idea of DCI but none of the implementations +felt right. And if it didn't feel right, I knew I wasn't going to stick with it. + +I tried to take some of the ideas about roles and behavior extraction in a slightly different way. +I looked at some of the Command/Query stuff that seems to be more popular in .NET-land and tried +building an app using Commands (or Use Cases, there is so much overloaded terminology it is +maddening). + +This style felt right to me. I was writing a bunch of small, super focused classes to do some work. +My controllers were pretty simple and I stopped testing them for the most part. + +Some examples from my [RSS reader][stringer] (small Sinatra app): + +[stringer]: https://github.com/swanson/stringer + +```ruby +class MarkAsRead + def initialize(story_id, repository = StoryRepository) + @story_id = story_id + @repo = repository + end + + def mark_as_read + @repo.fetch(@story_id).update_attributes(is_read: true) + end +end + +post "/stories/mark_all_as_read" do + MarkAllAsRead.new(params[:story_ids]).mark_as_read + + redirect to("/news") +end +``` + +```ruby +class ImportFromOpml + ONE_DAY = 24 * 60 * 60 + + def self.import(opml_contents) + feeds = OpmlParser.new.parse_feeds(opml_contents) + + feeds.each do |feed| + Feed.create(name: feed[:name], + url: feed[:url], + last_fetched: Time.now - ONE_DAY) + end + end +end + +post "/feeds/import" do + ImportFromOpml.import(params["opml_file"][:tempfile].read) + + redirect to("/setup/tutorial") +end +``` + +I combined these command/use-case things with Repositories and wrote most of the +test as isolated unit tests — super fast to run because I mock out the database...well, +and I'm not using Rails so they are pretty fast already. + +# Persistence Layer Separation + +Repositories seem like a natural fit given the recent change of heart about Fat Models from +the Rails community. Again, my experience with this pattern comes from .NET, but the basic idea +is use a class to get a group of domain objects out of a database. I think about a Repository +as a group of Query objects with a common theme (usually the underlying model). + +The code looks like: + +```ruby +class StoryRepository + def self.read(page = 1) + Story.where(is_read: true).includes(:feed) + .order("published desc").page(page).per_page(20) + end +end +``` + +Instead of using a `scope` or putting more methods on `Story`, we just do the querying behind +a clean `StoryRepository#read` interface. This is definitely not common in the Rails apps I've +seen. I really like using this pattern: my controller isn't cluttered with sort order or pagination +stuff, my model doesn't need to know every possible way a caller wants to query it, I can +stub out that nasty method chain in a test easily. + +This feels kind of strange for `ActiveRecord` based applications — since the domain objects +and the data mapping are the same thing, `ActiveRecord::Base` subclasses. In my experience +with other tools like `NHibernate` you have dumber domain objects and explicit mapping objects +that link up database columns to properties. + +This separation comes with trade-offs: the Rails Way is quicker to code up (with just one class) +but you end up with hard coupling to the database whenever you create domain objects (not good +for tests). Maybe the [Ruby Object Mapper][rom] project will bring more popularity to splitting out +domain models and mapping objects. + +I haven't really found a good solution for this yet. My latest exploration was just stubbing the +Repository methods to return `OpenStruct`-like objects built in test factories. + +# Dependency Injection + +DI is so easy in Ruby and really helps with testing. I don't think I would ever go without it +anymore. I also like how glaringly obvious your dependencies become when you use injection. + +```ruby +class FeedDiscovery + def discover(url, finder = Feedbag, parser = Feedzirra::Feed) + ... + end +end +``` + +I could lie and say that this pattern is handy if I ever need to swap out gems, but who am I +kidding? That never actually happens. Since Ruby allows for default arguments there is really +no downside to this style of coding — the calling interface is the same but I can test much +easier. Win, win. + +# Controller Callbacks + +The biggest problem I had with my use-case/command style was that handling more than the happy +path flow in the controller got clunky. I see two possible solutions to look into: returning +result objects or some kind of callbacks on the controller. + +Result objects seem like the more tame path. Define some convention for status, probably a hash +with keys like `:status`, `:errors`, and `:model` and then handle that in the controller. + +```ruby +def create + result = AddFeedSubscription.subscribe(params[:feed]) + + if result[:status] == :success + flash[:success] = "Subscribed!" + redirect_to result[:model] + else + flash[:errors] = result[:errors] + render "new" + end +end +``` + +I don't think this is a bad approach and probably what I would do with a team larger than 2. + +The other approach, which I first saw in Hexagonal Rails, is to pass the controller as an +argument and call methods on it. + +```ruby +def create + result = AddFeedSubscription.new(self, params[:feed]).subscribe +end + +private + def subscription_succeeded(subscription) + flash[:success] = "Subscribed!" + redirect_to subscription + end + + def subscription_failed(subscription) + flash[:errors] = subscription.errors + render "new" + end +end + +class AddFeedSubscription + def initialize(callback, params) + @callback = callback + @params = params + end + + def subscribe + ... some work ... + + @callback.subscription_succeeded(subscription) + end +end +``` + +This seems kind of inside-out, but something feels right about it to me. If you are going to have +more than a if/else branch in the controller action, then the callbacks seem like they might be a +win. + +And controller testing can mostly go out the window. Throw in a double for callback and keep the +actual callbacks simple and mostly framework plumbing and I think you have a recipe for good design. + +This idea seems to be the one advocated by the [DCI in Ruby sample application][dci-sample], which +is the closest resource I've found that mirrors my own preferences and findings. + +# What's still stewing? + +Decorators/Presenters/View Models - I think if you are going all-in on view models then you should +use something logicless, but that means Liquid right now for your templating. I can't imagine +building a whole app using Liquid and not wanting to pull my hair out. + +Client-side JS - Can this co-exist with a typically server side app? Or are you in for a world of +hurt if you don't put clients-ide MVC as the first class citizen and just build a JSON API backend? +My limited experience trying to use Backbone with Sinatra was painful, but workable. + +[dci-sample]: http://dci-in-ruby.info/technical_overview.html +[rom]: https://github.com/rom-rb +[call]: http://mikepackdev.com/blog_posts/24-the-right-way-to-code-dci-in-ruby +[busted]: http://tonyarcieri.com/dci-in-ruby-is-completely-broken diff --git a/_posts/2013-07-22-more-tales-in-bad-restaurant-ux.md b/_posts/2013-07-22-more-tales-in-bad-restaurant-ux.md new file mode 100644 index 0000000..65045ae --- /dev/null +++ b/_posts/2013-07-22-more-tales-in-bad-restaurant-ux.md @@ -0,0 +1,81 @@ +--- +layout: post +title: "More Tales in Bad Restaurant UX" +categories: +- blog +tags: +- tangential +--- + +I've been trying to hold back my rants on restaurant UX after +I went a [little crazy on the new Freestyle Coke machines][f] (I still +hate them with a burning passion), but my beloved McAllister's Deli +has really made a big blunder. + +[f]: http://mdswanson.com/blog/2012/09/25/new-coke-ux.html + +I go to [McAllister's Deli][m] every Monday for [Indy Startup Lab][sl], +rain or shine. Recently, they switched all of their menus to digital, +displaying the items on ten large vertical monitors. + +[m]: http://www.mcalistersdeli.com +[sl]: https://indystartuplab.github.io/ + +Visually, they are pretty neat; lots of big pictures of the food and +an attractive color scheme. + +![McAllister's Deli - Terrible UX Menu Board]({{site.url}}/static/mcallisters-menu.png) + +But they are absolutely terrible to use! + +One of the most important pieces of information for a menu to display +is the ingredients or toppings on an item. + +I know what a Club Sandwich *usually* has on it, but is there bacon? +Is there mayonnaise? Is there mustard? What kind of bread? What's the +difference between the King Club and the McAllister's Club?!? + +This information is relegated to the very bottom of each column +on the new menu boards. And worse, it only displays the details +for whichever item +is "active". The screens cycle through the list of sandwiches +[like a carousel][c], only revealing what the heck is on the Spud +Óle if you happen to glance over at the right time. + +[c]: http://shouldiuseacarousel.com/ + +The menu items cycle at a 10 second interval so I get to wait nearly +2 minutes to see what comes on my sandwich if I miss it the first time +around. Okay, I could ask at the counter but what is the point of +listing it all? + +The whole menu board is designed like it's a application or +something. It would work great with a mouse `:hover` or if I could +tap the menu item to select it — but this isn't an app! It's a +32" monitor mounted to the ceiling! + +The font size scales based on how many items are in each category +so you have the desserts at 24px and the sandwiches at a squint-worthy +13px right next to each other. You literally cannot read the list of +sides (a choice that every single customer has to make!) until you +are at the register. Ugh. + +Look, I get it McAllister's CEO — you are trying to modernize +and make it easier to swap in new menu items. But I can't imagine how +this passed through any kind of user testing. At the end of the day, +every minute spent explaining what is on a sandwich slows down the +process for everyone. Go to McAllister's during the lunch rush and you +will find a line wrapped around the restaurant so speed does matter. + +My recommendation: the old menu boards worked great, why don't you +just digitize them instead of rolling out this frustrating carousel of +sadness? + +\[Addendum, 08/05/2013\]: Overheard some McAllister's +employees talking about the downsides of the new system. +They agreed that the boards were very pretty, but that they +had been receiving four times as many questions about items +when ordering. Also, if the computer system powering the +menu has problems, it takes 30 minutes for them to reboot. + + diff --git a/_posts/2013-07-24-step-by-step-ux-improvement-screenshot-upload.md b/_posts/2013-07-24-step-by-step-ux-improvement-screenshot-upload.md new file mode 100644 index 0000000..73c9524 --- /dev/null +++ b/_posts/2013-07-24-step-by-step-ux-improvement-screenshot-upload.md @@ -0,0 +1,131 @@ +--- +layout: post +title: "Step-by-Step UX Improvement: Screenshot Upload" +categories: +- blog +tags: +- worklog +--- + +My last post [detailing the step-by-step process][lp] I use to +make UX improvements was well-received so here is another +walk-through for a series of small changes to my current work project. + +[lp]: http://mdswanson.com/blog/2013/07/18/step-by-step-ux-improvement.html + +Background: The app tracks company projects (who worked on them, +what technologies were used, etc). A new feature was added +recently to allow for project screenshots to be uploaded and +displayed, but it could use some UI/UX love. + +Today, I am going to be working on the upload page for screenshots. +Screenshots have three components: the actual image, whether it is +public or private, and an optional caption. + +## Starting Point + +[![]({{site.url}}/static/chops-upload-ux-0-thumb.png)]({{site.url}}/static/chops-upload-ux-0.png) + +It is pretty rough around the edges — but I will say it is +completely functional and works great! It's just kinda ugly. + +Observations: + +* `New screenshot` header is unnecessary; the user just +clicked the link to add a new screenshot and this is also shown +in the breadcrumbs +* The checkbox from `Private?` is on a new line (this is very +common in Rails apps because of how the form builder works) +* The input order is weird; I have to write a caption +and pick the visibility before I pick the image + +Tweaks: +* Remove `

` tag, expand breadcrumb to "Add new screenshot" +* Make the `Private?` checkbox inline +* Swap the order of inputs (picking image first) + +[![]({{site.url}}/static/chops-upload-ux-1-thumb.png)]({{site.url}}/static/chops-upload-ux-1.png) + +I particularly like the ordering after this change. The most +important part of a screenshot is the image and it is right at the +top. The visibility is more important than the caption (which is +optional) so it comes next. + +Observations: + +* The drag-and-drop landing area is way too big +* Having the file inputs stacked vertically is confusing — do +I drop and then browse? Why are their two inputs for one field? +* `Drag and drop an image here` isn't great copy and doesn't follow +other conventions I've seen (text *inside* the landing area) + +Tweaks: +* Shrink landing area drastically +* Move drag-and-drop text inside area +* Change file inputs to be side by side with clear indication that +you can drop **or** browser, not both + +[![]({{site.url}}/static/chops-upload-ux-2-thumb.png)]({{site.url}}/static/chops-upload-ux-2.png) + +Observations: + +* The form fits above the fold! Victory! +* `Add this data` is redundant. It is obvious that form fields need +to be filled in. +* Button does not match the styles in the rest of the app +(smaller, grey background) +* Caption is supposed to be a short description, why is the field +multiline? + +Tweaks: +* Remove redundant text +* Apply correct `btn-primary` class to the button, tweak copy +* Change caption to text `` instead of `