summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCasey Robinson <casey@rampantmonkey.com>2018-04-29 20:20:32 -0400
committerCasey Robinson <casey@rampantmonkey.com>2018-04-29 20:20:32 -0400
commitd4672ed27034c2e635d9b9f45f28edc4c374d43e (patch)
treefded5e1e8e8c0ebdabb821cde106e962bf56a512
parent94ef95e39150905a2cec99cf0e757dd93ff1ddb2 (diff)
parentc149600e53135d9b16745a0d797bb5a5851fa666 (diff)
downloadrampantmonkey-d4672ed27034c2e635d9b9f45f28edc4c374d43e.tar.gz
rampantmonkey-d4672ed27034c2e635d9b9f45f28edc4c374d43e.tar.bz2
rampantmonkey-d4672ed27034c2e635d9b9f45f28edc4c374d43e.zip
merge website into a subdirectory
-rw-r--r--website/.gitignore1
-rw-r--r--website/.gitmodules6
-rw-r--r--website/README.md12
-rw-r--r--website/config.toml9
-rw-r--r--website/content/posts/2010/06/graphene-hydrogenation-results.html85
-rw-r--r--website/content/posts/2010/06/project-description-reu-2009.html13
-rw-r--r--website/content/posts/2010/07/about-rampant-monkey.html16
-rw-r--r--website/content/posts/2010/07/coupled-oscillator-project-description.html63
-rw-r--r--website/content/posts/2010/07/new-ipod-impressions.html41
-rw-r--r--website/content/posts/2010/08/my-first-program.html78
-rw-r--r--website/content/posts/2010/08/smoking-tv.html21
-rw-r--r--website/content/posts/2010/12/survivor-struggling.html43
-rw-r--r--website/content/posts/2011/05/rainbow-tables.html23
-rw-r--r--website/content/posts/2011/06/logcat.html33
-rw-r--r--website/content/posts/2011/07/customizing-terminal.html121
-rw-r--r--website/content/posts/2011/07/timemachine-and-windows-shares.html21
-rw-r--r--website/content/posts/2011/09/goodbye-windows.html37
-rw-r--r--website/content/posts/2011/09/natural-scrolling-and-mice.html25
-rw-r--r--website/content/posts/2011/10/p0ng-now-available.html27
-rw-r--r--website/content/posts/2011/10/upgrading-macbook-pro-memory.html51
-rw-r--r--website/content/posts/2011/11/levenshtein-distance.html83
-rw-r--r--website/content/posts/2011/11/moom-window-management-in-os-x.html21
-rw-r--r--website/content/posts/2011/12/css-star.html226
-rw-r--r--website/content/posts/2012/01/dynamic-levenshtein.html99
-rw-r--r--website/content/posts/2012/04/typographic-refresh.html31
-rw-r--r--website/content/posts/2012/07/flac-to-mp3.html11
-rw-r--r--website/content/posts/2012/07/flaky-wifi-solution.html19
-rw-r--r--website/content/posts/2012/07/passwords-and-sourceforge.html23
-rw-r--r--website/content/posts/2012/07/subspace-sampling-control-run.html14
-rw-r--r--website/content/posts/2012/07/the-oatmeal-on-religion.html15
-rw-r--r--website/content/posts/2012/07/useful-tutorial-for-using-git-with-svn-repositories.html10
-rw-r--r--website/content/posts/2012/08/add-ssh-key-to-authorized-keys.html13
-rw-r--r--website/content/posts/2012/08/electronic-spin-resonance.html58
-rw-r--r--website/content/posts/2012/08/git-resources.html20
-rw-r--r--website/content/posts/2012/08/love-the-boring-bits.html13
-rw-r--r--website/content/posts/2012/08/operating-systems-intro.html10
-rw-r--r--website/content/posts/2012/08/set-time-zone-in-ubuntu.html9
-rw-r--r--website/content/posts/2012/09/amazon-s3-cors.html15
-rw-r--r--website/content/posts/2012/09/maximum-flux-transition-paths.html16
-rw-r--r--website/content/posts/2012/09/portable-programming.html16
-rw-r--r--website/content/posts/2012/09/school.html11
-rw-r--r--website/content/posts/2012/09/stanford-education-experiment.html13
-rw-r--r--website/content/posts/2012/09/study-of-rare-events.html18
-rw-r--r--website/content/posts/2012/09/transition-state-method.html20
-rw-r--r--website/content/posts/2012/09/user-friendliness.html13
-rw-r--r--website/content/posts/2012/09/what-every-computer-science-major-should-know.html22
-rw-r--r--website/content/posts/2012/09/wireless-data-caps.html16
-rw-r--r--website/content/posts/2012/10/dynamic-string-method.html16
-rw-r--r--website/content/posts/2012/10/iteratively.html14
-rw-r--r--website/content/posts/2012/10/link_prediction.html12
-rw-r--r--website/content/posts/2012/10/motion-input.html14
-rw-r--r--website/content/posts/2012/10/normal-mode-partitioning.html12
-rw-r--r--website/content/posts/2012/10/paravirtualization.html14
-rw-r--r--website/content/posts/2012/10/project_proposal_video.html20
-rw-r--r--website/content/posts/2012/11/GPU-molecular-dynamics.md18
-rw-r--r--website/content/posts/2012/11/advanced-git-aliases.md15
-rw-r--r--website/content/posts/2012/11/app-store-casino.md21
-rw-r--r--website/content/posts/2012/11/byod.html16
-rw-r--r--website/content/posts/2012/11/classic-nintendo-games-are-np-hard.md30
-rw-r--r--website/content/posts/2012/11/conferences-or-journals.html16
-rw-r--r--website/content/posts/2012/11/question-to-ask-a-contractor.md18
-rw-r--r--website/content/posts/2012/11/research-without-walls.md19
-rw-r--r--website/content/posts/2012/11/walking-on-potential-energy-surfaces.html16
-rw-r--r--website/content/posts/2012/12/bbedit-10-5.md17
-rw-r--r--website/content/posts/2012/12/carmine-contraption-v0-0-6.md21
-rw-r--r--website/content/posts/2012/12/lego-jedi-starfighter-time-lapse.md10
-rw-r--r--website/content/posts/2012/12/retrospective-2012-edition.html71
-rw-r--r--website/content/posts/2013/01/explicit-vs-implicit.md28
-rw-r--r--website/content/posts/2013/01/some-small-refactorings-in-ruby.md23
-rw-r--r--website/content/posts/2013/02/nazi-algorithms.md13
-rw-r--r--website/content/posts/2013/04/pokemon-exception-handling.md18
-rw-r--r--website/content/posts/2013/08/ruby-warrior.md187
-rw-r--r--website/content/posts/2013/10/first-publication.md17
-rw-r--r--website/content/posts/2013/11/giggle-test.md13
-rw-r--r--website/content/posts/2013/11/tool-sharpening.md110
-rw-r--r--website/content/posts/2013/12/fingerprint-scanner.md41
-rw-r--r--website/content/posts/2014/01/2014-reading-list.md51
-rw-r--r--website/content/posts/2014/01/of-orcs-and-software-craftsmanship.md25
-rw-r--r--website/content/posts/2014/02/css-parallax.md122
-rw-r--r--website/content/posts/2014/02/stack-exchange.md49
-rw-r--r--website/content/posts/2014/02/vim-macros.md88
-rw-r--r--website/content/posts/2014/03/ffmpeg-clip-extraction.md19
-rw-r--r--website/content/posts/2014/05/no-more-frameworks.md15
-rw-r--r--website/content/posts/2014/05/pokemon-capture-mechanics.md18
-rw-r--r--website/content/posts/2014/05/ruby-strtok.md54
-rw-r--r--website/content/posts/2014/06/quit-school.md15
-rw-r--r--website/content/posts/2014/08/first-experience-with-salt.md116
-rw-r--r--website/content/posts/2014/09/coreos-now-available-on-digitalocean.md13
-rw-r--r--website/content/posts/2014/09/dockerize-fantasy-reality.md183
-rw-r--r--website/content/posts/2014/10/btrfs-and-hexdump.md42
-rw-r--r--website/content/posts/2014/10/how-is-competitive-programming-different-from-real-life-programming.md17
-rw-r--r--website/content/posts/2014/10/reverse-engineering-star-wars-yoda-stories.md22
-rw-r--r--website/content/posts/2014/11/handmade-hero.md28
-rw-r--r--website/content/posts/2014/12/one-time-passwords.md106
-rw-r--r--website/content/posts/2015/06/computing-fibonacci.md139
-rw-r--r--website/content/posts/2015/06/gpg-transition.md79
-rw-r--r--website/content/posts/2015/12/9-player-game-of-thrones.md136
-rw-r--r--website/content/posts/2015/12/pandemic_legacy_june_debreif.md46
-rw-r--r--website/content/posts/2016/10/lycanthropic_love.md205
-rw-r--r--website/content/posts/2016/11/shortening_the_rust_edit_feedback_cycle.md75
-rw-r--r--website/content/posts/2017/01/rainbow_box.md539
-rw-r--r--website/content/posts/2017/10/the_adventure_zone.md18
-rw-r--r--website/content/posts/micro/217173010632142d8b1cce2cd8e62f0f4ef9ecaa.md8
-rw-r--r--website/content/posts/micro/2aa350d608242eeba603a88a761b59f7178f9f30.md6
-rw-r--r--website/content/posts/micro/cb16aa920be51fb53dc11b7805f60bc708eba4b4.md6
-rw-r--r--website/default.nix10
-rwxr-xr-xwebsite/deploy.sh14
-rw-r--r--website/drafts/free-and-potential-energy.html12
-rw-r--r--website/drafts/getting-started-with-ruby.md26
-rw-r--r--website/drafts/improving-the-amazing-race.html16
-rw-r--r--website/drafts/migrating-to-git.md3
-rw-r--r--website/drafts/retropsective-2012-edition.md62
-rw-r--r--website/drafts/test.md18
-rw-r--r--website/drafts/thinner-is-not-a-feature.html8
-rwxr-xr-xwebsite/migrate_posts.sh49
-rwxr-xr-xwebsite/serve.sh3
-rw-r--r--website/static/css/Junction-webfont.ttfbin0 -> 21852 bytes
-rw-r--r--website/static/css/League_Gothic-webfont.ttfbin0 -> 45212 bytes
-rw-r--r--website/static/css/flexgrid.css77
-rw-r--r--website/static/css/ie.css3
-rw-r--r--website/static/css/master.css663
-rw-r--r--website/static/css/photo.css165
-rw-r--r--website/static/css/reset.css26
-rw-r--r--website/static/css/screen.css5
-rw-r--r--website/static/gpg/caseyrobinson.public.gpg-key203
-rw-r--r--website/static/gpg/gpg-transition-statement-2015-06.txt64
-rw-r--r--website/static/media/9_player_map.jpgbin0 -> 3610372 bytes
-rw-r--r--website/static/media/9_player_map_780x993.jpgbin0 -> 187081 bytes
-rw-r--r--website/static/media/DSC03098-320x179.jpgbin0 -> 10382 bytes
-rw-r--r--website/static/media/DSC03106-320x179.jpgbin0 -> 14412 bytes
-rw-r--r--website/static/media/DSC03119-320x179.jpgbin0 -> 9855 bytes
-rw-r--r--website/static/media/DSC03151-320x179.jpgbin0 -> 22704 bytes
-rw-r--r--website/static/media/DSC03170-320x179.jpgbin0 -> 19430 bytes
-rw-r--r--website/static/media/Slide1.pngbin0 -> 4050 bytes
-rw-r--r--website/static/media/Slide10.pngbin0 -> 303885 bytes
-rw-r--r--website/static/media/Slide11.pngbin0 -> 8139 bytes
-rw-r--r--website/static/media/Slide12.pngbin0 -> 22852 bytes
-rw-r--r--website/static/media/Slide2.pngbin0 -> 1459122 bytes
-rw-r--r--website/static/media/Slide3.pngbin0 -> 15735 bytes
-rw-r--r--website/static/media/Slide4.pngbin0 -> 8463 bytes
-rw-r--r--website/static/media/Slide5.pngbin0 -> 10191 bytes
-rw-r--r--website/static/media/Slide6.pngbin0 -> 10851 bytes
-rw-r--r--website/static/media/Slide7.pngbin0 -> 79371 bytes
-rw-r--r--website/static/media/Slide8.pngbin0 -> 112049 bytes
-rw-r--r--website/static/media/Slide9.pngbin0 -> 80793 bytes
-rw-r--r--website/static/media/TM-Restore-320x240.pngbin0 -> 81147 bytes
-rw-r--r--website/static/media/absorbance-curve.pngbin0 -> 49250 bytes
-rw-r--r--website/static/media/absorptionProb_full.pngbin0 -> 99406 bytes
-rw-r--r--website/static/media/arryn_cards.jpgbin0 -> 469242 bytes
-rw-r--r--website/static/media/arryn_cards_762x604.jpgbin0 -> 118583 bytes
-rw-r--r--website/static/media/background_position.pngbin0 -> 8400 bytes
-rw-r--r--website/static/media/background_repeat.pngbin0 -> 22033 bytes
-rw-r--r--website/static/media/beforeAndAfter-276x300.pngbin0 -> 51192 bytes
-rw-r--r--website/static/media/camera.svg61
-rw-r--r--website/static/media/cardboard.pngbin0 -> 205316 bytes
-rw-r--r--website/static/media/cardboard_blue.pngbin0 -> 197698 bytes
-rw-r--r--website/static/media/control_full_1080p.mp4bin0 -> 9301698 bytes
-rw-r--r--website/static/media/cork.jpgbin0 -> 124051 bytes
-rw-r--r--website/static/media/dpph-chemical-structure.pngbin0 -> 38819 bytes
-rw-r--r--website/static/media/esr-plot.pngbin0 -> 90338 bytes
-rw-r--r--website/static/media/fingerprint_components.pngbin0 -> 2958405 bytes
-rw-r--r--website/static/media/fr_docker_arch.pngbin0 -> 18703 bytes
-rw-r--r--website/static/media/game_of_thrones_pieces.jpgbin0 -> 2121744 bytes
-rw-r--r--website/static/media/game_of_thrones_pieces_953x658.jpgbin0 -> 110782 bytes
-rw-r--r--website/static/media/google_authenticator_screenshot.pngbin0 -> 145520 bytes
-rw-r--r--website/static/media/grid.pngbin0 -> 13504 bytes
-rw-r--r--website/static/media/iphone-slot-machine.jpgbin0 -> 52679 bytes
-rw-r--r--website/static/media/kittylog1-257x300.jpgbin0 -> 19248 bytes
-rw-r--r--website/static/media/living-room-vent.jpgbin0 -> 308396 bytes
-rw-r--r--website/static/media/magic-tee-schematic.pngbin0 -> 23810 bytes
-rw-r--r--website/static/media/menu.pngbin0 -> 138 bytes
-rw-r--r--website/static/media/menu_alt.pngbin0 -> 478 bytes
-rw-r--r--website/static/media/microcenter_loot.jpgbin0 -> 1961360 bytes
-rw-r--r--website/static/media/microwave-schematic.pngbin0 -> 70738 bytes
-rw-r--r--website/static/media/nazi-algorithms-screenshot.pngbin0 -> 185871 bytes
-rw-r--r--website/static/media/nintendo-framework.jpgbin0 -> 36151 bytes
-rw-r--r--website/static/media/office-vent.jpgbin0 -> 367776 bytes
-rw-r--r--website/static/media/parallax_diagram.pngbin0 -> 26362 bytes
-rw-r--r--website/static/media/pokemon-blue.jpgbin0 -> 2853350 bytes
-rw-r--r--website/static/media/pokemon-capture-algorithm-flow-chart-downsized.pngbin0 -> 80873 bytes
-rw-r--r--website/static/media/pokemon-capture-algorithm-flow-chart.dot132
-rw-r--r--website/static/media/pokemon-capture-algorithm-flow-chart.pngbin0 -> 536764 bytes
-rw-r--r--website/static/media/pokemon-capture-algorithm-flow-chart.svg629
-rw-r--r--website/static/media/rainbow_box.123dxbin0 -> 313106 bytes
-rw-r--r--website/static/media/rainbow_box_intro.gifbin0 -> 4482171 bytes
-rw-r--r--website/static/media/rainbow_box_intro.mp4bin0 -> 518161 bytes
-rw-r--r--website/static/media/rainbow_box_model_screenshot.pngbin0 -> 286453 bytes
-rw-r--r--website/static/media/rainbow_box_wiring.pngbin0 -> 127139 bytes
-rw-r--r--website/static/media/rainbow_box_wiring.svg626
-rw-r--r--website/static/media/rampantmonkey.ascii.txt51
-rw-r--r--website/static/media/reading_list.pngbin0 -> 83169 bytes
-rw-r--r--website/static/media/reading_list.svg175
-rw-r--r--website/static/media/register_finger.pngbin0 -> 34809 bytes
-rw-r--r--website/static/media/rmLogo.svg40
-rw-r--r--website/static/media/rmLogoSleep.svg215
-rw-r--r--website/static/media/rmLogoSmall.pngbin0 -> 3604 bytes
-rw-r--r--website/static/media/ss-800-3-0-320x192.pngbin0 -> 11222 bytes
-rw-r--r--website/static/media/ss-800-4-0-320x192.pngbin0 -> 3983 bytes
-rw-r--r--website/static/media/stack_exchange_logo.pngbin0 -> 5751 bytes
-rw-r--r--website/static/media/starDecomposition.pngbin0 -> 4633 bytes
-rw-r--r--website/static/media/targaryen_cards.jpgbin0 -> 4454543 bytes
-rw-r--r--website/static/media/targaryen_cards_744x1052.jpgbin0 -> 158663 bytes
-rw-r--r--website/static/media/test2.jpgbin0 -> 217021 bytes
-rw-r--r--website/static/media/tully_cards.jpgbin0 -> 5174847 bytes
-rw-r--r--website/static/media/tully_cards_744x1052.jpgbin0 -> 183127 bytes
-rw-r--r--website/static/media/vimlogo.pngbin0 -> 34462 bytes
-rw-r--r--website/static/media/whiteboard.svg108
-rw-r--r--website/static/media/writing.svg373
m---------website/static/projects/24game0
m---------website/static/projects/betrayal0
-rw-r--r--website/static/projects/bingbong/index.html244
-rw-r--r--website/static/projects/energyconversion.html108
-rw-r--r--website/static/projects/gatesoftime/index.html2217
-rw-r--r--website/static/projects/index.html48
-rw-r--r--website/static/projects/numberconversion.html102
-rw-r--r--website/static/projects/pics/betrayal.jpgbin0 -> 27903 bytes
-rw-r--r--website/static/projects/pics/codebreaker.jpgbin0 -> 161490 bytes
-rw-r--r--website/static/projects/pics/contraption.jpgbin0 -> 170725 bytes
-rw-r--r--website/static/projects/pics/energyconverter.pngbin0 -> 20989 bytes
-rw-r--r--website/static/projects/pics/fantasyrealitysc.pngbin0 -> 97687 bytes
-rw-r--r--website/static/projects/pics/game_boy_logo.pngbin0 -> 49804 bytes
-rw-r--r--website/static/projects/pics/numconverter.pngbin0 -> 53060 bytes
-rw-r--r--website/static/projects/pics/oryx.pngbin0 -> 292312 bytes
-rw-r--r--website/static/projects/pics/tree2011.pngbin0 -> 22702 bytes
-rw-r--r--website/static/projects/tree/index.html32
-rw-r--r--website/static/projects/tree/tree.css153
-rw-r--r--website/static/ssh/caseyrobinson.public.ssh-keys3
-rw-r--r--website/themes/rampantmonkey/LICENSE.md20
-rw-r--r--website/themes/rampantmonkey/archetypes/default.md0
-rw-r--r--website/themes/rampantmonkey/layouts/_default/list.html19
-rw-r--r--website/themes/rampantmonkey/layouts/_default/single.html0
-rw-r--r--website/themes/rampantmonkey/layouts/article/single.html3
-rw-r--r--website/themes/rampantmonkey/layouts/index.html49
-rw-r--r--website/themes/rampantmonkey/layouts/link/single.html3
-rw-r--r--website/themes/rampantmonkey/layouts/micro/single.html3
-rw-r--r--website/themes/rampantmonkey/layouts/partials/article.html25
-rw-r--r--website/themes/rampantmonkey/layouts/partials/footer.html13
-rw-r--r--website/themes/rampantmonkey/layouts/partials/header.html24
-rw-r--r--website/themes/rampantmonkey/layouts/partials/link.html28
-rw-r--r--website/themes/rampantmonkey/layouts/partials/micro.html12
-rw-r--r--website/themes/rampantmonkey/static/.keep0
-rw-r--r--website/themes/rampantmonkey/theme.toml6
242 files changed, 11590 insertions, 0 deletions
diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 0000000..a48cf0d
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1 @@
+public
diff --git a/website/.gitmodules b/website/.gitmodules
new file mode 100644
index 0000000..e654c82
--- /dev/null
+++ b/website/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "static/projects/24game"]
+ path = static/projects/24game
+ url = git@github.com:rampantmonkey/24game.git
+[submodule "static/projects/betrayal"]
+ path = static/projects/betrayal
+ url = git@github.com:rampantmonkey/betrayal.git
diff --git a/website/README.md b/website/README.md
new file mode 100644
index 0000000..2ad10dd
--- /dev/null
+++ b/website/README.md
@@ -0,0 +1,12 @@
+# Rampant Monkey Content
+
+This is the raw content for my website [rampantmonkey.com](http://rampantmonkey.com).
+
+It is transformed into the website with my static blogging engine [contraption](https://github.com/rampantmonkey/contraption)
+For example: `contraption -s rampant_monkey_content -d /var/www/public_html`
+
+# License
+
+Unless otherwise indicated the following licenses apply to all content.
+Prose is licensed under [Creative Commons Share Alike](http://creativecommons.org/licenses/by-sa/4.0/legalcode).
+Source code is released under [MIT License](http://opensource.org/licenses/MIT)
diff --git a/website/config.toml b/website/config.toml
new file mode 100644
index 0000000..d8caeea
--- /dev/null
+++ b/website/config.toml
@@ -0,0 +1,9 @@
+baseurl = "http://rampantmonkey.com"
+languageCode = "en-us"
+title = "Rampant Monkey"
+paginate = 4
+footnotereturnlinkcontents = "↩"
+
+[permalinks]
+ posts = "/:year/:month/:filename/"
+ code = "/:filename/"
diff --git a/website/content/posts/2010/06/graphene-hydrogenation-results.html b/website/content/posts/2010/06/graphene-hydrogenation-results.html
new file mode 100644
index 0000000..74a6765
--- /dev/null
+++ b/website/content/posts/2010/06/graphene-hydrogenation-results.html
@@ -0,0 +1,85 @@
++++
+title = "Graphene Hydrogenation Results"
+type = "Article"
+date = "2010-06-25"
+tags = [ "Graphene" ]
+slug = "graphene-hydrogenation-results"
++++
+
+<img class="alignleft" title="graphane" src="/media/graphane-300x243.png" alt="" width="231" height="187" />
+
+
+
+<p>Graphene is a conductor with extremely high electron mobility. This high electron mobility will lead to an increase in the speed of electronic devices through a reduction of the heat dissipation. Due to the increase in operating speed, graphene will possibly replace silicon in the next generation of electronic devices. However, graphene is a two dimensional sheet of carbon atoms. To create conducting channels and devices we need to embed graphene into an insulating matrix. Our group found that by hydrogenation a gap larger than 3.5 eV can be produced in graphene, forming a compound called graphane. The problem is the creation of this 100% hydrogenated graphene, graphane, has yet to be verified.</p>
+
+
+
+<p>The goal of this project is to use the Monte Carlo method to speed up study of graphene hydrogenation. A Monte Carlo simulation requires an absorption probability for each site. In order to obtain reasonable results without an enormous parameter space, a probability for each nearest neighbor(NN) configuration should be determined. Ten possible arrangements of hydrogen atoms attached to the nearest neighbors exist.</p>
+
+
+
+<img class="aligncenter" title="nn_config" src="/media/nn_config-300x198.png" alt="" width="300" height="198" />
+
+
+
+<h4>Calculating Probability</h4>
+
+
+
+<p>The hard cube model is the theoretical basis for calculating the probability of absorption. This model involves integrating the Maxwell-Boltzmann speed distribution from a minimum to aa maximum velocity and normalizing.</p>
+
+
+
+<img class="aligncenter" title="Maxwell-Boltzmann Distribution" src="/media/boltzmann-300x257.png" alt="" width="300" height="257" />
+
+
+
+<h4>Finding Velocities</h4>
+
+
+
+<p>The minimum and maximum velocities were found using ReaxFF 2, a molecular dynamics program. A Hydrogen atom was 'shot' at the graphene sheet at different velocities, and its impact with the surface was analyzed. After finding a general range, the velocity was incremented slowly to find the maximum and minimum speed which still yielded bonding to the plane.</p>
+
+
+
+<img class="aligncenter" title="velocities" src="/media/velocities-300x207.png" alt="" width="300" height="207" />
+
+
+
+<h4>Results</h4>
+
+<p>The discovered velocities fall into three†ranges with a large separation between each range. The underlying cause of this separation is undetermined.
+
+Since the Maxwell-Boltzmann Distribution is dependant on temperature it is important to maintain that dependance in thhe probability calculation. The graph below shows this temperature dependence as well as visually showing the grouping effect. Click the graph to see the full size version.</p>
+
+<a href="/media/absorptionProb_full.png"><img class="aligncenter" title="absorptionProb_thumb" src="/media/absorptionProb_thumb-300x165.png" alt="" width="300" height="165" /></a>
+
+
+
+<h4>Conclusions</h4>
+
+<ul>
+
+ <li>There is in fact a correlation between NN configuration and absorption probability.</li>
+
+ <li>The absorption energy for pristine graphene is larger than results obtained from DFT.</li>
+
+ <li>The probability curves are grouped, which implies a more fundamental relationship.</li>
+
+</ul>
+
+
+
+<h4>Future Work</h4>
+
+<ul>
+
+ <li>Apply probabilities to Monte Carlo simulation</li>
+
+ <li>Compare ReaxFF results with DFT simulations</li>
+
+ <li>Study graphane clustering with percolation and Monte Carlo simulation</li>
+
+ <li>Use same methods for flourine</li>
+
+</ul>
diff --git a/website/content/posts/2010/06/project-description-reu-2009.html b/website/content/posts/2010/06/project-description-reu-2009.html
new file mode 100644
index 0000000..58c4e8e
--- /dev/null
+++ b/website/content/posts/2010/06/project-description-reu-2009.html
@@ -0,0 +1,13 @@
++++
+title = "Project Description - REU 2009"
+type = "Article"
+date = "2010-06-25"
+tags = [ "Graphene" ]
+slug = "project-description-reu-2009"
++++
+
+<p>Graphene is a conductor with extremely high electron mobility. This high electron mobility will lead to an increase in the speed of electronic devices through a reduction of the heat dissipation. Due to the increase in operating speed, graphene will possibly replace silicon in the next generation of electronic devices. However, graphene is a two dimensional sheet of carbon atoms. To create conducting channels and devices we need to embed graphene into an insulating matrix. Our group found that by hydrogenation a gap larger than 3.5 eV can be produced in graphene, forming a compound called graphane. The problem is the creation of this 100% hydrogenated graphene, graphane, has yet to be verified.</p>
+
+<p>My project is to use a Monte Carlo approach to analyze the hydrogenation of graphene. The first task is to calculate the probabilities of an atom sticking to the sheet of graphene. The probability is derived from the Maxwell-Boltzmann speed distribution of a hydrogen atom moving towards a sheet of graphene. Atoms with too low velocity cannot overcome the formation barrier while atoms with too large velocity bounce back. This sets the upper and lower velocity are used as the limits of integration. The minimum kinetic energy, and consequently the minimum velocity, required for absorption is related to the energy barrier of the reaction. The maximum velocity is derived from a hard cube model of the collision.</p>
+
+<p> Once reasonable probabilities are calculated analysis of the hydrogenation can begin. Cluster size, number of clusters, shape of clusters, and percent hydrogenation are some of the variables of interest. These variables will be used to measure defects and help determine how close the product of the simulation is to ordered graphane. This work can also be applied to fluorine. These results will be compared to molecular dynamics simulations performed by other group members. The probabilistic approach is advantageous because it runs much faster, while providing similar results.</p>
diff --git a/website/content/posts/2010/07/about-rampant-monkey.html b/website/content/posts/2010/07/about-rampant-monkey.html
new file mode 100644
index 0000000..91a4105
--- /dev/null
+++ b/website/content/posts/2010/07/about-rampant-monkey.html
@@ -0,0 +1,16 @@
++++
+title = "About Rampant Monkey"
+type = "Article"
+date = "2010-07-25"
+slug = "about-rampant-monkey"
++++
+
+<p>I have wanted to build a website for a long time, but I was always too busy to dive in. After graduating from Penn State I found myself with a lot of free time. This provided the perfect opportunity to learn the art of webdesign. Previously I have only had limited experience with HTML and CSS.</p>
+
+
+
+<p>Once I dove into the initial development of Rampant Monk3y I realized that a more powerful solution was required. The combination PHP, MySQL, and Javascript fit the bill. In order to learn those languages I have spent the last six months experimenting with this site. I plan to continue tweaking and adding new features, such as a photo gallery and survivor fantasy league, but you can expect my site to be updated regularly.</p>
+
+
+
+<p>If there is anything that you would like to see or if you have any questions feel free to email <a href="mailto:kc@rampantmonkey.com">me</a>.</p>
diff --git a/website/content/posts/2010/07/coupled-oscillator-project-description.html b/website/content/posts/2010/07/coupled-oscillator-project-description.html
new file mode 100644
index 0000000..b29d88f
--- /dev/null
+++ b/website/content/posts/2010/07/coupled-oscillator-project-description.html
@@ -0,0 +1,63 @@
++++
+title = "Coupled Oscillator Project Description"
+type = "Article"
+date = "2010-07-09"
+tags = [ "Sea Lamprey" ]
+slug = "coupled-oscillator-project-description"
++++
+
+<img class="alignright" title="Sea Lamprey " src="/media/Picture1.jpg" alt="" width="234" height="170" />
+
+<h4>Abstract</h4>
+
+
+
+<p>The main objective of this project is to model the neuron activity in a sea lamprey spinal cord. Currently, the model is only forced at the ends. Eventually we hope to apply forcing at any point along the spinal cord. There are many parameters that we will change in an effort to find stable structures of the differential equations.</p>
+
+
+
+<p>This project will eventually be integrated into a larger model that characterizes lamprey locomotion. This project builds on the research of Dr. Previte and Behrend student Jeremy Sopko.</p>
+
+
+
+<h4>Introduction </h4>
+
+
+
+<p>This project is part of a larger project that aims to understand sea lamprey locomotion.
+
+Normally brown or gray, the sea lamprey is an aquatic parasite which grows up to 90 cm long and is typically found on the Atlantic coasts of Europe and North America. This project will use coupled differential equations to model the neural activity in a sea lamprey spinal cord.</p>
+
+
+
+<p>I will analyze and test generalizations of the current model. The spinal cord initiates locomotion, thus our model is a logical first step to a comprehensive model. The current model involves linear chains of neurons that are coupled together in a nearest neighbor fashion with external forcing at the ends of the chain, see:<em>Kopell, N. &amp; Ermentrout, B. [1986] <a href="http://www.sciencedirect.com/science?_ob=ArticleURL&amp;_udi=B6T0V-485RJFY-B3&amp;_user=10&amp;_coverDate=11/30/1992&amp;_rdoc=1&amp;_fmt=high&amp;_orig=search&amp;_sort=d&amp;_docanchor=&amp;view=c&amp;_searchStrId=1395863014&amp;_rerunOrigin=scholar.google&amp;_acct=C000050221&amp;_version=1&amp;_urlVersion=0&amp;_userid=10&amp;md5=7492c9d515cfa9841980e7c48fa30717" target="_blank">Symmetry and phase locking in chains of weakly coupled oscillators,</a> Commun. Pure Appl. Math. 39, 623-660</em>.</p>
+
+
+
+<p>This research is going to allow variable coupling among the neurons, rather than just nearest neighbor. External forcing will also be allowed to occur at any neuron along the spinal cord, as opposed to just the ends. The goal is to analyze the stable structures of the resulting differential equations and characterize them in terms of external forcing. This analysis will follow the pattern set out in the paper:<em>Rebecca Ellison, Virginia Gardner*, Joel Lepak, Meghan O'Malley, Joseph Paullet, Joseph P. Previte, Beth Ann Reid* and Katy Vizzard*, <a href="http://www.worldscinet.com/ijbc/15/1507/S0218127405013150.html" target="_blank">Pattern Formation in Small Arrays of Locally Coupled Oscillators</a>, Int. J. of Bifurcation and Chaos 15 2283-2293. (2005), </em>where a similar model was analyzed. The ultimate goal is to integrate this research into a larger model that characterizes lamprey locomotion.</p>
+
+
+
+<h4>Problem Statement and Research Plan</h4>
+
+
+
+<p>The goal of this project is to propose and analyze a model of the neural activity in a sea lamprey spinal cord. This data will be the first step in understanding the locomotion of a sea lamprey. As previously mentioned, this model will be a generalized form of current models.
+
+The fact that the system is relatively large (50 dimensional) limits analytical analysis to a few specific cases. This leads us to a numerical approach. We have observed three possible behaviors based on initial conditions and parameters; synchrony, pseudo-synchrony, and nonsynchrony.</p>
+
+
+
+<p>In order to efficiently analyze data we will write a program to automate the process. This will involve XPP, C++, and Gawk. We plan to create a computer program to determine how each parameter affects the stability of the system. To do this I will first have to understand how the current model works. The stable structures that we find should correspond to the experimental data given to us by biologists from the University of Maryland.</p>
+
+
+
+<p>The collaborative effort with Maryland will be two way. As we see stable structures in our model, we will report this data to the biological researchers who will confirm our results in the actual spinal cord, and as certain behaviors are seen in the spinal cord, we will attempt to see similar behavior in he model, this process may involve model fitting.</p>
+
+
+
+<h4>Anticipated Outcome</h4>
+
+
+
+<p>The goal will be to analyze the data then present my findings at the Undergraduate Research Conference in the spring and at the regional MAA meeting in the spring. The larger goal is to aid in the development of a fully integrated model tat describes the motion of the sea lampey.</p>
diff --git a/website/content/posts/2010/07/new-ipod-impressions.html b/website/content/posts/2010/07/new-ipod-impressions.html
new file mode 100644
index 0000000..d373da4
--- /dev/null
+++ b/website/content/posts/2010/07/new-ipod-impressions.html
@@ -0,0 +1,41 @@
++++
+title = "New iPod Impressions"
+type = "Article"
+date = "2010-07-26"
+tags = [ "apple","hardware" ]
+slug = "new-ipod-impressions"
++++
+
+<p>Last month I purchased a refurbished 8GB second generation iPod Touch. Wow that is a mouthful. I'll take you through my decision and then provide my early impressions of the device.</p>
+
+
+
+<p>First let's discuss the refurbished attribute. Buying a refurbished model offered a 25% discount at the Apple store. That is quite a few apps. <a href="http://store.apple.com/us/browse/home/specialdeals/ipod?mco=OTY2ODY4NQ">Refurbished models</a> come with a new battery, all original accessories (dock cable, new headphones, and dock adapter), instruction manual, and a 1 yr warranty.</p>
+
+
+
+<p>I have over 40 gigabytes of music and audio books. That doesn't even include the storage required for all of the podcasts that I listen to every week or apps that I want to install. Upon first glance it might seem crazy for me to purchase an 8GB iPod. However, I found an incredible app that allows me to stream all of my media from my home server to my iPod. <a href="http://itunes.apple.com/us/app/air-video-watch-your-videos/id306550020?mt=8">AirVideo</a>) also transcodes incompatible video on the fly.</p>
+
+
+
+<p>Moving on to the hardware, the screen is the perfect size. Fits well in my pocket yet us large enough to browse the web and watch video comfortably. Quick access to my email makes communication quite easy.</p>
+
+
+
+<p>I have not had any issues with battery life. The device was still going after spending hours watching video. A word of caution, if you upgrade to iOS 4 you will see a drop in battery life and dramatic slow down with the iPod.</p>
+
+
+
+<p>As far as the OS is concerned, it takes a while to adjust to the single tasking nature of iOS but it gets the job done. I am irritated that it takes forever to arrange the apps, fortunately this is only done once. The mail app and music app are†convenient and after browsing the app store I have no idea what I would else I need.</p>
+
+
+
+<p>The keyboard takes a while to become accustomed with, but after a few hours typing speed increases and errors decrease. I even managed to type the rough draft of this article on the iPod.</p>
+
+
+
+<p>Internet access in my pocket changes how I interact with my computer. The wordpress app allows management of this blog. In fact I typed this post completely on my iPod. Google designed an intuitive interface into gmail, google docs, Buzz, and reader. Digg, Facebook, and TweetDeck take care of my social needs. This only leaves a few things that require the use of my desktop; programming, webdesign, and intense writing.</p>
+
+
+
+<p>I am completely satisfied with my purchase and see no signs of that changing. If anyone has suggestions of apps for me to try out post a comment.</p>
diff --git a/website/content/posts/2010/08/my-first-program.html b/website/content/posts/2010/08/my-first-program.html
new file mode 100644
index 0000000..b2f2654
--- /dev/null
+++ b/website/content/posts/2010/08/my-first-program.html
@@ -0,0 +1,78 @@
++++
+title = "My First Program"
+type = "article"
+date = "2010-08-09"
+tags = [ "C++","programming" ]
+slug = "my-first-program"
++++
+
+<p>This is the first "useful" program that I wrote in high school. It is designed to convert a decimal number to it's binary representation. There are many flaws in this code, but let's dig deeper.</p>
+
+<pre><code>#include &lt;iostream&gt;
+using namespace std;
+int sol[20];
+int bin[20];
+int number = 0;
+int answer = 0;
+</code></pre>
+
+<p>I am confused by my choice to pass variables to each function as well as to use global variables. It is obvious that I did not understand the intricacies of <a href="http://functionx.com/cppcli/variables/Lesson22.htm">variable scope</a>. Since this was such a small program global variables did not cause a problem. I would not recommend that global variables be used for anything other than settings in most programs.</p>
+
+<pre><code>int input() {
+ cout &lt;&lt; "Enter number to convert to binary \t:"; cin &gt;&gt; number;
+ return number;
+}
+</code></pre>
+
+<p>This function works, but it should not be a separate function. I was excited that I could create multiple functions and still compile the code.</p>
+
+<pre><code>int* pwrsoftwo(int) {
+ sol[0]=1;
+ int loopcount = 1;
+ while (loopcount &lt;20) {
+ sol[loopcount] = sol[loopcount-1]*2;
+ loopcount = loopcount +1;
+ }
+ return sol;
+}
+</code></pre>
+
+<p>I chose to use an array of integers to represent a binary number. Looking back, a string would make much more sense to use here.</p>
+
+<pre><code>int* conversion(int,int*) {
+ int x = 19;
+ do {
+ if (number- sol[x] - answer &lt; 0) bin[x] = 0;
+ else {
+ bin [x] = 1;
+ answer = sol[x] + answer;
+ }
+ x--;
+ } while(x &gt; -1);
+ return bin;
+}
+</code></pre>
+
+<p>This function illustrates the importance of focusing on readability and comments while coding. It takes a few minutes of disection to understand what is going on, and more importantly it is not close to the most efficient solution.</p>
+
+<pre><code>void display(int*) {
+ int y = 19;
+ do {
+ cout&lt;&lt; bin[y];
+ y --;
+ } while (y &gt;-1);
+}
+
+int main() {
+ input();
+ pwrsoftwo(number);
+ conversion(number,sol);
+ display(bin);
+ cin.get();
+ cin.ignore(2);
+}
+</code></pre>
+
+<p>Overall the code works, but could be vastly improved. Using a vector to represent the number, or at least an array of bits, would make the code more efficient and readable. Bitshift would be a more elegant method of calculation and system("pause") should replace the last two lines of main.</p>
+
+<p>I hope that this exercise has been useful to you. I know that it has helped me realize how far I have come in the last 10 years. If you are interested to see my web based version of this code visit my <a href="http://rampantmonkey.com/projects/">projects page</a>.</p>
diff --git a/website/content/posts/2010/08/smoking-tv.html b/website/content/posts/2010/08/smoking-tv.html
new file mode 100644
index 0000000..bfc9772
--- /dev/null
+++ b/website/content/posts/2010/08/smoking-tv.html
@@ -0,0 +1,21 @@
++++
+title = "Smoking TV"
+type = "Article"
+date = "2010-08-22"
+tags = [ "failure","Television"," hardware" ]
+slug = "smoking-tv"
++++
+
+<p>Today My wife was watching tv in the bedroom in an attempt to relax after a long week of work. About 90% of the way through her movie the sound started cutting in and out. As with any technology problem I was quickly ushered into the room to investigate.</p>
+
+
+
+<p>Previously the coaxial cable has worked it's way lose leading to degraded performance. Thus the cable connection was the first thing I checked. When I bent I over to touch the cable I smelled that undeniable stench of burnt silicon.</p>
+
+
+
+<p>For the last few days most of our bedroom outlets and light were inoperable. After unplugging the tv all of the outlets and lights came back. Apparently the tv has been slowly failing resulting in an increased current draw. This additional load would explain the failure of the circuit.</p>
+
+
+
+<p>The good news, it was a commercial and my wife was able to finish the movie in the living room without missing a scene.</p>
diff --git a/website/content/posts/2010/12/survivor-struggling.html b/website/content/posts/2010/12/survivor-struggling.html
new file mode 100644
index 0000000..58a9c15
--- /dev/null
+++ b/website/content/posts/2010/12/survivor-struggling.html
@@ -0,0 +1,43 @@
++++
+title = "Survivor Struggling"
+type = "Article"
+date = "2010-12-02"
+tags = [ "Television","Survivor" ]
+slug = "survivor-struggling"
++++
+
+<p>Two things happened last night on Survivor: Nicaragua that make me question if Survivor is on its last legs.</p>
+
+
+
+<p>First,<strong> reward challenge.</strong>
+
+Yet another team challenge. I thought that it was an individual game now. What happened to the pecking order challenge? That always added a major twist to alliances, usually ending up with the underdogs coming out on top. </p>
+
+
+
+<p>Also at the reward challenge we are inundated with an ad for Gulliver's Travels. While I appreciate the fact that CBS has to earn a profit to continue to producing Survivor, this is a new low. This was quite different from the Coke and Sears product placements of previous seasons. Gulliver's Travels completely took over the challenge and the reward, something that CBS usually reserves for the likes of Big Brother.</p>
+
+
+
+
+
+<p>Second,<strong> quitters.</strong>
+
+Survivor has had quitters in the past. Some for more valid reasons than others (Sue and Jenna in All-Stars). Others just gave up on the game entirely (Osten in Pearl Islands). All but one of these occurred before the Jury started. Janu quit season 10 (Palau) with one person already on the Jury. After much discussion at Tribal Council she was allowed to join the Jury in spite of quitting the game.</p>
+
+
+
+<p>On Jeff Probst's EW <a href="http://popwatch.ew.com/2010/12/02/jeff-probst-blogs-survivor-nicaragua-episode-12/">blog</a> he claims that Janu set the precedent of quitters on the Jury. I do not agree with this at all. In Palau there was no tribe swap and Koror only voted out two people: Willard (who practically volunteered) and Coby (7-1-1 with Janu voting Stephanie). So before Janu quit she had very little impact on the game. Compare this to Naonka and Kelly. Both had voted out numerous people who were actually playing the game, which dramatically affected the course of Survivor: Nicaragua. Because of this difference the "precedent" should not apply.</p>
+
+
+
+<p>Naonka and Kelly quit the game. Yet they are on the jury which is part of the game. So the only thing that they quit was sitting in the rain. The punishment should be more severe. They should have nothing to do with the show. No Jury. No money. No exit confessional. No reunion. Instead there would be two empty seats to serve as a reminder to the future contestants of the penalty for quitting.</p>
+
+
+
+<p>The last one is still possible, but I doubt it. For some reason the majority of tv viewers like watching people blow up and argue irrationally which is why Naonka was cast to begin with. Which leads to the underlying problem. CBS just wants people to watch the show, so the casting crew steaks out bars across the country looking for attractive people that want to be on tv. The problem is that once you go for a few days without a shower no one looks attractive. Also these people do not care about the show as much as fans who apply through the traditional channels. Thus they do not know how hard it can be and are more likely to quit.</p>
+
+
+
+<p>If CBS does not start looking for better players soon Survivor might have trouble competing with American Idol on Wednesday nights.</p>
diff --git a/website/content/posts/2011/05/rainbow-tables.html b/website/content/posts/2011/05/rainbow-tables.html
new file mode 100644
index 0000000..b19d837
--- /dev/null
+++ b/website/content/posts/2011/05/rainbow-tables.html
@@ -0,0 +1,23 @@
++++
+title = "Rainbow Tables"
+type = "Article"
+date = "2011-05-08"
+tags = [ "class project","encryption" ]
+slug = "rainbow-tables"
++++
+
+<p>This semester I took a course on encoding and encryption. Throughout the semester we covered topics from cesear cyphers to AES, Enigma to SHA. Since encryption is a vast field each student was required to give a presentation on a chosen topic. My topic was <a href="http://en.wikipedia.org/wiki/Rainbow_table">rainbow tables</a>. Below are my presentation slides.</p>
+
+
+<img class="aligncenter" src="/media/Slide1.png" />
+<img class="aligncenter" src="/media/Slide2.png" />
+<img class="aligncenter" src="/media/Slide3.png" />
+<img class="aligncenter" src="/media/Slide4.png" />
+<img class="aligncenter" src="/media/Slide5.png" />
+<img class="aligncenter" src="/media/Slide6.png" />
+<img class="aligncenter" src="/media/Slide7.png" />
+<img class="aligncenter" src="/media/Slide8.png" />
+<img class="aligncenter" src="/media/Slide9.png" />
+<img class="aligncenter" src="/media/Slide10.png" />
+<img class="aligncenter" src="/media/Slide11.png" />
+<img class="aligncenter" src="/media/Slide12.png" />
diff --git a/website/content/posts/2011/06/logcat.html b/website/content/posts/2011/06/logcat.html
new file mode 100644
index 0000000..272ef6d
--- /dev/null
+++ b/website/content/posts/2011/06/logcat.html
@@ -0,0 +1,33 @@
++++
+title = "LogCat"
+type = "Article"
+date = "2011-06-04"
+tags = [ "Android","programming" ]
+slug = "logcat"
++++
+
+<img src="/media/kittylog1-257x300.jpg" alt="" title="kittylog1" width="257" height="300" class="alignright size-medium wp-image-256" />
+
+<p>While working through chapter two's example todo list app I ran into some unexpected issues. Upon start the application would crash. This occured before a single item was drawn on the screen.</p>
+
+
+
+<p>At first I thought that it was possibly an error with how I configured the AVD. So I created a second AVD, this time with target platform 2.1 (instead of 2.3.3), and re-ran the program. Same problem. Now I have to dig deeper.</p>
+
+
+
+<p>I know that the Java code and xml is an exact match to the book and could not find any reports of issues with the implementation. The next step is to figure out how to trace what happens in the emulator beyond the "Force Quit" dialog box.</p>
+
+
+
+<p>Eventually I found an excellent tutorial online walking me through basic Android development, including debugging, at Build Mobile. Here I was introduced to LogCat, an awesome resource for wathcing the details of the emulation. LogCat is part of the Android Developer Tools (ADT) plugin for Eclipse and I highly recommend leaving this view open while testing applications.</p>
+
+
+
+<p>After reviewing the output from LogCat I found this message:
+
+<code>06-04 12:14:53.664: ERROR/AndroidRuntime(229): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.paad.todolist/com.paad.todolist.Todo}: java.lang.ClassNotFoundException: com.paad.todolist.Todo in loader dalvik.system.PathClassLoader@44c06810</code></p>
+
+
+
+<p>This error was key to solving my issue. Once I read this message I knew that my class extending activity was not matching up with what the emulator was expecting to find. The emulator uses a value stored in the manifest to look for the correct class. Changing this value allowed the program to run smoothly. Next time this will be the first thing I look for before attempting to run an application.</p>
diff --git a/website/content/posts/2011/07/customizing-terminal.html b/website/content/posts/2011/07/customizing-terminal.html
new file mode 100644
index 0000000..55f8ad6
--- /dev/null
+++ b/website/content/posts/2011/07/customizing-terminal.html
@@ -0,0 +1,121 @@
++++
+title = "Customizing Terminal"
+type = "Article"
+date = "2011-07-01"
+tags = [ "OS X" ]
+slug = "customizing-terminal"
++++
+
+
+<p>When working in Ubuntu or OS X there always comes a time when you run across something that requires using Terminal. Terminal is an application that emulates the terminal interface from the days of olde and is also referred to as the terminal window. This interface is extremely useful, in fact some users prefer Terminal versions of programs to using a GUI.</p>
+
+
+
+<p>Customizing the Terminal (<a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)">Bash Shell</a>) is simple and improve your experience. You will need to create a file to store your settings. In both OS X and Ubuntu this file will be stored in your home directory (/Users/kc or /home/kc in my case). OS X looks for a file called <strong>.bash_profile</strong>, and <strong>.bashrc</strong> in Ubuntu.</p>
+
+
+
+<p>The most interesting task that my .bash_profile (.bashrc) file performs is displaying the current directory. Above the current line, the active directory is displayed in blue text surrounded by square brakets. This allows a quick check to verify that you are in the correct directory before entering commands.</p>
+
+
+
+<p>Below is my current file and a screenshot of the results.</p>
+
+
+
+
+<code>##################################
+
+# Casey Robinson's .bash_profile
+
+# Last Modified: 1 July 2011
+
+# Running on OS X 10.6.8
+
+##################################
+
+
+
+#Exports
+
+#################################
+
+
+
+PATH=$PATH:/usr/lib/festival/ ;export PATH
+
+export PS1="[\[\033[1;34m\w\e[0m]\n[\t \u]$ "
+
+export EDITOR=/usr/bin/pico
+
+export HISTFILESIZE=3000 # the bash history should save 3000 commands
+
+export HISTCONTROL=ignoredups #don't put duplicate lines in the history.
+
+alias hist='history | grep $1' #Requires one input
+
+
+
+# Define a few Color's
+
+BLACK='\e[0;30m'
+
+BLUE='\e[0;34m'
+
+GREEN='\e[0;32m'
+
+CYAN='\e[0;36m'
+
+RED='\e[0;31m'
+
+PURPLE='\e[0;35m'
+
+BROWN='\e[0;33m'
+
+LIGHTGRAY='\e[0;37m'
+
+DARKGRAY='\e[1;30m'
+
+LIGHTBLUE='\e[1;34m'
+
+LIGHTGREEN='\e[1;32m'
+
+LIGHTCYAN='\e[1;36m'
+
+LIGHTRED='\e[1;31m'
+
+LIGHTPURPLE='\e[1;35m'
+
+YELLOW='\e[1;33m'
+
+WHITE='\e[1;37m'
+
+NC='\e[0m' # No Color
+
+
+
+#Modified Commands
+
+#################################
+
+
+
+# Alias to multiple ls commands
+
+alias la='ls -Al' # show hidden files
+
+alias lk='ls -lSr' # sort by size
+
+alias lc='ls -lcr' # sort by change time
+
+alias lu='ls -lur' # sort by access time
+
+alias lr='ls -lR' # recursive ls
+
+alias lt='ls -ltr' # sort by date
+
+alias lm='ls -al |more' # pipe through 'more'
+
+
+
+</code>
diff --git a/website/content/posts/2011/07/timemachine-and-windows-shares.html b/website/content/posts/2011/07/timemachine-and-windows-shares.html
new file mode 100644
index 0000000..4fb6b00
--- /dev/null
+++ b/website/content/posts/2011/07/timemachine-and-windows-shares.html
@@ -0,0 +1,21 @@
++++
+title = "TimeMachine and Windows Shares"
+type = "Article"
+date = "2011-07-01"
+tags = [ "OS X","Backup" ]
+slug = "timemachine-and-windows-shares"
++++
+
+<img src="/media/TM-Restore-320x240.png" alt="" title="TM Restore" width="320" height="240" class="alignright" />
+
+
+
+<p>I recently bought a MacBook Pro for my classwork and research projects. Integrating this new device into my workflow has provided some interesting challenges. The most recent: backup.</p>
+
+
+
+<p><a href="http://www.apple.com/support/timemachine/">TimeMachine</a>, which is built into OS X, is the most obvious solution. This service is designed to work with external hard drives or TimeCapsule devices. Neither of these options is ideal since I already have a Windows 2008 file server up and running.</p>
+
+
+
+<p>In order to use my server I scoured the internet for solutions. Many exist but I was only able to get one method to work. Hupio's Weblog has only <a href="http://hupio.wordpress.com/2008/04/27/osx-timemachine-and-sambawindows-share/">one post</a> fortunately it contains excellent advice.</p>
diff --git a/website/content/posts/2011/09/goodbye-windows.html b/website/content/posts/2011/09/goodbye-windows.html
new file mode 100644
index 0000000..b9314bf
--- /dev/null
+++ b/website/content/posts/2011/09/goodbye-windows.html
@@ -0,0 +1,37 @@
++++
+title = "Goodbye Windows"
+type = "Article"
+date = "2011-09-13"
+tags = [ "apple","EyeFinity"," OS X"," Windows" ]
+slug = "goodbye-windows"
++++
+
+<p>My new mission is to rid the house of Windows.</p>
+
+
+
+<p>As of yesterday we had three Windows 7 machines in the house. Today we are down to two. The first machine to leave Windows behind was the HTPC. I have been using my old laptop to stream videos - ripped dvd's and recorded tv episodes - from the home server. Windows was the first choice since it was already installed. It worked fine (read: videos would play after a few minutes of tweaking) for a few weeks. The time to begin watching increased exponentially. The final straw was reached yesterday.</p>
+
+
+
+<p>We were trying to watch an episode of The Mole - best reality show I have ever watched - and found nothing but trouble. First the WiFi had difficulty connecting. Once that issue was resolved the laptop decided to output an unsupported resolution to the tv and refused to switch back to the laptop screen while the HDMI cable was connected. Finally, after hours of pain and suffering (first world problems), I grabbed my USB Ubuntu (Natty Narhwal) installer and replaced Windows 7.</p>
+
+
+
+<p>Twenty minutes later I was enjoying pizza and The Mole. Needless to say, this was the catalyst for change in the Robinson household.</p>
+
+
+
+<p>Transitioning will be difficult; my wife and I use programs and features only available with Windows.</p>
+
+
+
+<p>My wife uses Microsoft Office to produce her monthly newsletters for work. Most likely I will teach her how to use VirtualBox for the few applications needed. This setup works for me, hopefully it will work for her as well.</p>
+
+
+
+<p>I love playing pc games. The game landscape on Mac is improving and most of the games I play are released for both Windows and Mac. But I enjoy playing my games with <a href="http://www.amd.com/us/products/technologies/amd-eyefinity-technology/Pages/eyefinity.aspx">EyeFinity</a> which is only available on Windows. I also enjoy computer hardware and eliminating pc gaming means that I will not be able to convince my wife that I need a new graphics card.</p>
+
+
+
+<p>By Christmas Windows will be relegated to VirtualBox and gaming duty. Unfortunately Windows will still remain in the house - at least it will not have to connect to the file server. I refuse to move exclusively console games and my wife is stuck using MS Office. Hopefully I can move her to a Mac with a Windows VirtualBox for the times she takes a break from Facebook and works on her newsletters and calendars.</p>
diff --git a/website/content/posts/2011/09/natural-scrolling-and-mice.html b/website/content/posts/2011/09/natural-scrolling-and-mice.html
new file mode 100644
index 0000000..4e47ff4
--- /dev/null
+++ b/website/content/posts/2011/09/natural-scrolling-and-mice.html
@@ -0,0 +1,25 @@
++++
+title = "Natural Scrolling and Mice"
+type = "Article"
+date = "2011-09-10"
+tags = [ "Lion","OS X"," Razer"," UX" ]
+slug = "natural-scrolling-and-mice"
++++
+
+<p>Ever since the scroll wheel was introduced it was used to move the viewing window up or down. With the multitouch trackpad this concept was extended into two dimensions to allow panning around an image or screen.</p>
+
+
+
+<p>In Lion Apple decided to reverse the direction of panning/scrolling as part of their movement to unify the user experience between iOS and OS X. This works well on the trackpad and gives the sensation of moving the content instead of the window. However, when a mouse is introduced a reversed scroll direction is counter intuitive.</p>
+
+
+
+<p>Fortunately there is a <a href="http://www.cultofmac.com/how-to-change-the-scrolling-direction-in-lion-os-x-tips/108120">quick fix</a>; change a setting in the System Preferences pane. The option to reverse scrolling direction is under both "Mouse" and "Trackpad". While the checkboxes work independently, there is only one global setting. Since there are two ways to change this setting each pane is not guaranteed to accurately display the current state, frustrating users.</p>
+
+
+
+<p>Natural Scrolling works with a trackpad and reverse scrolling works with a mouse. But what if you use both?</p>
+
+
+
+<p>Enter Razer. Many of Razer's gaming mice have onboard memory (Razer Synapse) to store settings and profiles. I happened to have a Mamba lying around so I dug around in the settings looking for a solution to the problem.. The amount of configuration possible is astounding. Every button can be mapped to an action, a macro, or a key combination. It is even possible to assign a different function to scroll up and scroll down. Bingo! Swap these two settings and the problem is solved.</p>
diff --git a/website/content/posts/2011/10/p0ng-now-available.html b/website/content/posts/2011/10/p0ng-now-available.html
new file mode 100644
index 0000000..0166e66
--- /dev/null
+++ b/website/content/posts/2011/10/p0ng-now-available.html
@@ -0,0 +1,27 @@
++++
+title = "P0ng Now Available"
+type = "Article"
+date = "2011-10-18"
+tags = [ "Android","p0ng"," programming" ]
+slug = "p0ng-now-available"
++++
+
+<img src="/media/ss-800-4-0-320x192.png" alt="" title="ss-800-4-0" width="320" height="192" class="aligncenter" />
+
+
+
+<p>Over the summer I took an Android Development class at YSU. For the final project I decided to create my own adaptation of <a href="http://en.wikipedia.org/wiki/Pong">Pong</a>. Version 1.0 is now available on the <a href="https://market.android.com/details?id=com.rampantmonk3y.p0ng">Android Market</a></p>
+
+
+
+<p>Pong was one of the first video games and quickly became popular in arcades around the world. In Pong players attempt to prevent a ball from entering their goal by moving a paddle up and down with a dial. The first player to score ten points was declared the winner.</p>
+
+
+
+<p>My version, P0ng, made a few changes to the basic format. To move the paddle up and down, a user slides their finger on the left half of the screen. The settings menu provides options to increase the difficulty not available in the original; AI speed, Ball Speed, and Number of balls.</p>
+
+<img src="/media/ss-800-3-0-320x192.png" alt="" title="ss-800-3-0" width="320" height="192" class="aligncenter size-medium wp-image-431" />
+
+
+
+<p>The source code is available at <a href="https://github.com/kc271828/P0ng">GitHub</a> and is released under the <a href="http://www.gnu.org/copyleft/gpl.html">GPL v3.0</a> license.</p>
diff --git a/website/content/posts/2011/10/upgrading-macbook-pro-memory.html b/website/content/posts/2011/10/upgrading-macbook-pro-memory.html
new file mode 100644
index 0000000..2e1f854
--- /dev/null
+++ b/website/content/posts/2011/10/upgrading-macbook-pro-memory.html
@@ -0,0 +1,51 @@
++++
+title = "Upgrading MacBook Pro Memory"
+type = "Article"
+date = "2011-10-05"
+tags = [ "apple","hardware"," OS X" ]
+slug = "upgrading-macbook-pro-memory"
++++
+
+<p>Upgrading the system memory is the cheapest and simplest improvement for any computer. In this post I will describe the process of installing new memory in a MacBook Pro. For $36 - $164 discount over Apple - I was able to extend the usefulness of my machine.</p>
+
+
+
+<img src="/media/DSC03119-320x179.jpg" alt="" title="Bottom Panel" width="320" height="179" class="aligncenter" />
+
+
+
+<p>The first step is to buy RAM that is compatible with your system - 13" MacBook Pro 2011 in this case. Finding the correct memory is simple. Go to <a href="http://amazon.com">amazon.com</a> and search for "macbook pro ram". Most of these products are completely compatible and the reviews will provide additional information. I chose the Corsair 8 GB DDR3 kit (CMSO8GX3M2A1333C9) based on my past purchases from Corsair.</p>
+
+
+
+<img src="/media/DSC03098-320x179.jpg" alt="" title="Corsair 8 GB DDR3 Laptop Memory Kit" width="320" height="179" class="aligncenter" />
+
+
+
+<p>A #00 phillips head screwdriver is needed to remove the bottom panel from the MacBook Pro. There are nine screws, three long and six short. Some of the screws are inserted at an angle. To avoid stripping these screws use the driver at the same angle as the screw.</p>
+
+ <img src="/media/DSC03106-320x179.jpg" alt="" title="MacBook Pro Screws" width="320" height="179" class="aligncenter" />
+
+
+
+<p>Once the machine is exposed locate the memory currently installed. It should look similar to the new set. Each stick of memory is held in place with a retention clip. Pulling both sides of the clip away from the RAM will release it. Once free the RAM will rotate slightly to allow easier removal.</p>
+
+
+
+<img src="/media/DSC03151-320x179.jpg" alt="" title="Old Ram" width="320" height="179" class="aligncenter" />
+
+
+
+<p>Repeat the same procedure for the second stick. Now it is time to insert the new memory. This process is the reverse of removing the memory; slide memory into slot, rotate downwards, ensure that the clip is properly attached to the new stick.</p>
+
+
+
+<img src="/media/DSC03170-320x179.jpg" alt="" title="New Ram" width="320" height="179" class="aligncenter" />
+
+
+
+<p>Now that the new memory is installed it is time to close the laptop and test out the upgrade.</p>
+
+
+
+<img src="/media/beforeAndAfter-276x300.png" alt="" title="beforeAndAfter" width="276" height="300" class="aligncenter" />
diff --git a/website/content/posts/2011/11/levenshtein-distance.html b/website/content/posts/2011/11/levenshtein-distance.html
new file mode 100644
index 0000000..b7cc451
--- /dev/null
+++ b/website/content/posts/2011/11/levenshtein-distance.html
@@ -0,0 +1,83 @@
++++
+title = "Levenshtein distance"
+type = "Article"
+date = "2011-11-21"
+tags = [ "C++","programming" ]
+slug = "levenshtein-distance"
++++
+
+<p>The Levenshtein distance is a measure of the number of changes required to get one string from another. The possiblities are insertion, deletion, and replacement. Below we calculate the distance between the last names of two of the NFL's longest players, Roethlisberger and Hhoushmandzadeh.</p>
+
+<p>Both names contain 14 letters, thus the Levenshtein distance must be between 0 and 14. That makes fifteen possiblities for the correct answer. Let's see how many function calls it takes with this recursive implementation to determine the answer.</p>
+
+
+
+<code><span class="keyword">#include</span>&lt;iostream&gt;
+
+<span class="keyword">#include</span>&lt;cstring&gt;
+
+
+
+<span class="keyword">using</span> <span class="keyword">namespace</span> std;
+
+
+
+<span class="keyword">typedef</span> <span class="keyword">unsigned</span> <span class="type">long</span> <span class="type">long</span> <span class="type">int</span> <span class="type">u64</span>;
+
+<span class="type">u64</span> <span class="var">nFc</span>=0;
+
+
+
+<span class="type">u64</span> lev(<span class="type">char</span> *<span class="var">s</span>, <span class="type">char</span> *<span class="var">t)</span>{
+
+ <span class="var">nFc</span>++;
+
+ <span class="keyword">if</span>(!*<span class="var">s</span>) <span class="keyword">return</span> strlen(<span class="var">t</span>);
+
+ <span class="keyword">if</span>(!*<span class="var">t</span>) <span class="keyword">return</span> strlen(<span class="var">s</span>);
+
+ <span class="type">u64</span> <span class="var">min</span>=1+lev(<span class="var">s</span>+1,<span class="var">t</span>);
+
+ <span class="type">u64</span> <span class="var">c</span> = lev(<span class="var">s</span>,<span class="var">t</span>+1);
+
+ <span class="keyword">if</span>(<span class="var">min</span>&gt;<span class="var">c</span>) <span class="var">min</span>=<span class="var">c</span>;
+
+ <span class="type">u64</span> <span class="var">d</span>=(*<span class="var">s</span>!=*<span class="var">t</span>);
+
+ <span class="var">c</span>=<span class="var">d</span>+lev(<span class="var">s</span>+1,<span class="var">t</span>+1);
+
+ <span class="keyword">if</span>(<span class="var">min</span>&gt;<span class="var">c</span>) <span class="var">min</span>=<span class="var">c</span>;
+
+ <span class="keyword">return</span> <span class="var">min</span>;
+
+}
+
+
+
+<span class="keyword">int</span> main(){
+
+ cout &lt;&lt; lev(<span class="const">"roethlisberger"</span>,<span class="const">"houshmandzadeh"</span>) &lt;&lt; endl;
+
+ cout &lt;&lt; <span class="var">nFc</span> &lt;&lt; endl;
+
+
+
+ <span class="keyword">return</span> 0;
+
+}
+
+</code>
+
+
+
+
+
+<p>11 character changes between "roethlisberger" and "houshmandzadeh".</p>
+
+
+
+<p>This implementation only took 11,885,772,379 calls and 92 seconds to determine the correct answer. Amazing. Now if we were to build a table of all possible changes, it would be a 15 by 15 matrix. 255 possible manipulations. This would take approximately 255 function calls to generate or .000002% of the recursive implementation. Total time to run: .0000195 seconds. Not even enough to register with the Unix time command.</p>
+
+
+
+<p>The Levenshtein Distance problem is a classic example of dynamic programming. For a more detailed analysis checkout <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">Wikipedia</a>.</p>
diff --git a/website/content/posts/2011/11/moom-window-management-in-os-x.html b/website/content/posts/2011/11/moom-window-management-in-os-x.html
new file mode 100644
index 0000000..ca543db
--- /dev/null
+++ b/website/content/posts/2011/11/moom-window-management-in-os-x.html
@@ -0,0 +1,21 @@
++++
+title = "Moom - Window Management in OS X"
+type = "Article"
+date = "2011-11-06"
+tags = [ "OS X","UX" ]
+slug = "moom-window-management-in-os-x"
++++
+
+<img src="/media/grid.png" class="aligncenter" alt="" title="moom-grid" width="320" height="192" />
+
+
+
+<p>One of the most frustrating things switching from Windows to Mac is window management. Traditionally in OS X windows can only be resized by dragging the lower right corner. With the release of Lion, OS X gained the ability to resize from any window edge. But this still pales in comparison to Windows 7.</p>
+
+
+
+<p>Windows 7 provides Aero Snap which allows users to quickly resize windows. Drag the window to the right side of the screen and Snap automatically resizes the window to take up the right half of the screen. Similarly for the left side, drag left and cover the left half of the screen. Snap will also resize a window to the full screen height.</p>
+
+
+
+<p>Searching for similar functionality, I found <a href="http://manytricks.com/moom/">Moom</a>, developed by Many Tricks. Once installed, hover over the zoom button and an overlay appears with some options for arranging displays. At the top there is a list of shortcuts; full screen, left, right, top, and bottom. These are handy when moving files or writing a document. Below the shortcuts is a grid. Click and drag a group of boxes in the grid to resize the window. These few features just scratch the surface of the power of Moom.</p>
diff --git a/website/content/posts/2011/12/css-star.html b/website/content/posts/2011/12/css-star.html
new file mode 100644
index 0000000..9c57c77
--- /dev/null
+++ b/website/content/posts/2011/12/css-star.html
@@ -0,0 +1,226 @@
++++
+title = "CSS Star"
+type = "Article"
+date = "2011-12-14"
+tags = [ "CSS","CSS 3" ]
+slug = "css-star"
++++
+
+<p>Making unconventional shapes with CSS is nothing new. <a href="http://css-tricks.com/examples/ShapesOfCSS/">CSS-Tricks</a> has an entire page of interesting shapes from the infinity symbol to a yin-yang. Steve Dennis even <a href="http://www.subcide.com/articles/pure-css-twitter-fail-whale/">recreated</a> the infamous Twitter fail whale without images. In this post I will explain how to create a five pointed star using only one div and some CSS trickery.</p>
+
+
+
+<p>First we need our basic building block - an isosceles triangle. The idea here is to start with a div with height and width zero and let the borders define the angles. See <a href="http://stackoverflow.com/questions/7073484/how-does-this-css-triangle-shape-work">Stack Overflow: How does this CSS triangle shape work?</a> for a detailed explanation of this phenomena.</p>
+
+
+
+<p>Let's take a closer look at a star. There are many ways to break the star up into triangles. However, there is only one way to divide it using three identical triangles.</p>
+
+
+
+<img src="/media/starDecomposition.png" class="aligncenter"/>
+
+
+
+<p>Here is the code for the first triangle</p>
+
+<pre><code>#triangle1{
+
+ <span class="keyword">margin-top:</span> 50<span class="type">px</span>;
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+}
+
+</code></pre>
+
+
+
+<p>Since all three triangles are identical, except for the rotation, we can use CSS transforms to do the rotation. All that is left is to calculate the number of <span class="type">deg</span>rees each triangle should be rotated. Start by drawing a circle around the star so that the star only touches the circle at the points. Since we have 5 points equally spaced on the circle there are 72 <span class="type">deg</span>rees (360/5) for between each point. This is the number we are looking for. One triangle will be rotated 72 <span class="type">deg</span>rees and the other -72 <span class="type">deg</span>rees.</p>
+
+
+
+<pre><code>#triangle2{
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">left:</span> -50<span class="type">px</span>;
+
+ <span class="keyword">top:</span> -66<span class="type">px</span>;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">-webkit-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-moz-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-ms-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-o-transform:</span> rotate(72<span class="type">deg</span>);
+
+}
+
+
+#triangle3{
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">left:</span> -50<span class="type">px</span>;
+
+ <span class="keyword">top:</span> -33<span class="type">px</span>;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">-webkit-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-moz-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-ms-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-o-transform:</span> rotate(-72<span class="type">deg</span>);
+
+}
+
+</code></pre>
+
+
+
+<p>Awesome, we have a star. But there is one thing left. At the beginning I promised that only one div would be required and we used three. Enter, <a href="http://css-tricks.com/5762-pseudo-class-selectors/">pseudo class selectors</a>. Specifically, we will use <emph>:before</emph> and <emph>:after</emph>. Below is the final code.</p>
+
+
+
+<pre><code>#star{
+
+ <span class="keyword">margin-top:</span> 50<span class="type">px</span>;
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">z-index:</span> 11;
+
+}
+
+#star:before{
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">left:</span> -50<span class="type">px</span>;
+
+ <span class="keyword">top:</span> -33<span class="type">px</span>;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">-webkit-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-moz-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-ms-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">-o-transform:</span> rotate(-72<span class="type">deg</span>);
+
+ <span class="keyword">content:</span> '';
+
+}
+
+#star:after{
+
+ <span class="keyword">position:</span> relative;
+
+ <span class="keyword">left:</span> -50<span class="type">px</span>;
+
+ <span class="keyword">top:</span> -66<span class="type">px</span>;
+
+ <span class="keyword">display:</span> block;
+
+ <span class="keyword">color:</span> #FFD700;
+
+ <span class="keyword">width:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">height:</span> 0<span class="type">px</span>;
+
+ <span class="keyword">border-right:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">border-top:</span> 33<span class="type">px</span> solid #FFD700;
+
+ <span class="keyword">border-left:</span> 50<span class="type">px</span> solid transparent;
+
+ <span class="keyword">-webkit-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-moz-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-ms-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">-o-transform:</span> rotate(72<span class="type">deg</span>);
+
+ <span class="keyword">content:</span> '';
+
+}
+
+</code></pre>
+
+
+
+<p>Now that you have seen how to combine shapes the possibilities are endless.</p>
diff --git a/website/content/posts/2012/01/dynamic-levenshtein.html b/website/content/posts/2012/01/dynamic-levenshtein.html
new file mode 100644
index 0000000..75ffebc
--- /dev/null
+++ b/website/content/posts/2012/01/dynamic-levenshtein.html
@@ -0,0 +1,99 @@
++++
+title = "Dynamic Levenshtein"
+type = "Article"
+date = "2012-01-08"
+tags = [ "C++","programming" ]
+slug = "dynamic-levenshtein"
++++
+
+<p>Previously, I had looked at calculating the <a href="http://rampantmonkey.com/posts/2011/11/levenshtein-distance">Levenshtein distance</a> between two strings. In that post I did some hand waving and claimed that the dynamic implementation will not register with the time command. Well I decided to test that claim and here is the proof.</p>
+
+
+
+<code><span class="keyword">#include</span> &lt;iostream&gt;
+
+<span class="keyword">#include</span> &lt;string&gt;
+
+
+
+<span class="keyword">using</span> <span class="keyword">namespace</span> std;
+
+
+
+<span class="type">int</span> minimum(<span class="type">int</span> <span class="var">d</span>, <span class="type">int</span> <span class="var">i</span>, <span class="type">int</span> <span class="var">s</span>);
+
+
+
+<span class="type">int</span> main(){
+
+ <span class="type">string</span> <span class="var">s</span>, <span class="var">t</span>;
+
+
+
+ cin &gt;&gt; <span class="var">s</span> &gt;&gt; <span class="var">t</span>;
+
+ <span class="type">int</span> <span class="var">sl</span> = <span class="var">s</span>.length()+1;
+
+ <span class="type">int</span> <span class="var">tl</span> = <span class="var">t</span>.length()+1;
+
+ <span class="type">int</span>* <span class="var">previous</span> = new <span class="type">int</span>[<span class="var">sl</span>];
+
+ <span class="type">int</span>* <span class="var">current</span> = new <span class="type">int</span>[<span class="var">sl</span>];
+
+
+
+ <span class="comment">//initialize current</span>
+
+ <span class="keyword">for</span>(<span class="type">int</span> <span class="var">j</span>=0; <span class="var">j</span>&lt;<span class="var">sl</span>; ++<span class="var">j</span>) *(<span class="var">current</span>+<span class="var">j</span>) = <span class="var">j</span>;
+
+
+
+ <span class="keyword">for</span>(<span class="type">int</span> <span class="var">j</span>=1; <span class="var">j</span>&lt;<span class="var">tl</span>; ++<span class="var">j</span>){
+
+ <span class="comment">//Swap current and previous</span>
+
+ <span class="type">int</span>* <span class="var">tmp</span> = <span class="var">previous</span>;
+
+ <span class="var">previous</span> = <span class="var">current</span>;
+
+ <span class="var">current</span> = <span class="var">tmp</span>;
+
+
+
+ *(<span class="var">current</span>) = <span class="var">j</span>;
+
+ <span class="keyword">for</span>(<span class="type">int</span> <span class="var">k</span>=1; <span class="var">k</span>&lt;<span class="var">sl</span>; ++<span class="var">k</span>){
+
+ <span class="keyword">if</span>(<span class="var">s</span>.at(<span class="var">k</span>-1) == <span class="var">t</span>.at(<span class="var">j</span>-1)) *(<span class="var">current</span>+<span class="var">k</span>) = *(<span class="var">previous</span>+<span class="var">k</span>-1);
+
+ <span class="keyword">else</span>{
+
+ *(<span class="var">current</span>+<span class="var">k</span>) = minimum(*(<span class="var">previous</span>+<span class="var">k</span>),*(<span class="var">current</span>+<span class="var">k</span>-1),*(<span class="var">previous</span>+<span class="var">k</span>-1))+1;
+
+ }
+
+ }
+
+ }
+
+ cout &lt;&lt; *(<span class="var">current</span>+<span class="var">sl</span>-1) &lt;&lt; endl;
+
+ <span class="keyword">return</span> 0;
+
+}
+
+
+
+<span class="type">int</span> minimum(<span class="type">int</span> <span class="var">d</span>, <span class="type">int</span> <span class="var">i</span>, <span class="type">int</span> <span class="var">s</span>){
+
+ <span class="type">int</span> <span class="var">min</span> = <span class="var">d</span>;
+
+ <span class="keyword">if</span>(<span class="var">i</span> &lt; <span class="var">min</span>) <span class="var">min</span> = <span class="var">i</span>;
+
+ <span class="keyword">if</span>(<span class="var">s</span> &lt; <span class="var">min</span>) <span class="var">min</span> = <span class="var">s</span>;
+
+ <span class="keyword">return</span> <span class="var">min</span>;
+
+}
+
+</code>
diff --git a/website/content/posts/2012/04/typographic-refresh.html b/website/content/posts/2012/04/typographic-refresh.html
new file mode 100644
index 0000000..b7a7b3e
--- /dev/null
+++ b/website/content/posts/2012/04/typographic-refresh.html
@@ -0,0 +1,31 @@
++++
+title = "Typographic Refresh"
+type = "Article"
+date = "2012-04-10"
+tags = [ "CSS" ]
+slug = "typographic-refresh"
++++
+
+<p>Recently I have been reading many books and websites about design. During this study I decided that it was time to redesign Rampant Monkey. The main source of frustration was the font selection. The old version was found long ago in a tutorial.</p>
+
+<code><span class="keyword">font</span>: 85%/130% arial, helvetica, sans-serif;
+</code>
+
+<p>This choice provided a readable font, but not unique or interesting. The main goal was to find a complimentary pair of fonts; one serif and one sans-serif. These fonts should also be freely (as in both beer and freedom) available. This search lead me to <a href="http://www.theleagueofmoveabletype.com/">The League of Movable Type</a></p>
+
+<p>Currently, The League of Movable Type consists of fifteen hand-picked open source fonts. After an extensive survey (read: I showed a few combinations to my wife), I selected <a href="http://www.theleagueofmoveabletype.com/league-gothic">League Gothic</a> as my sans-serif and <a href="http://www.theleagueofmoveabletype.com/junction">Junction</a> as the serif font.</p>
+
+<p>Now that the fonts have been selected it is time to implement. Fortunately one of the goals for The League is to provide @font-face compatible versions of each typeface.</p>
+
+<code><span class="type">@font-face</span> {
+ <span class="keyword">font-family</span>: junction;
+ <span class="keyword">src</span>: url(<span class="const">'Junction-webfont.ttf'</span>);
+}
+
+<span class="type">@font-face</span> {
+ <span class="keyword">font-family</span>: league_gothic;
+ <span class="keyword">src</span>: url(<span class="const">'League_Gothic-webfont.ttf'</span>);
+}
+</code>
+
+<p>Two simple statements later the website is updated and ready to go.</p>
diff --git a/website/content/posts/2012/07/flac-to-mp3.html b/website/content/posts/2012/07/flac-to-mp3.html
new file mode 100644
index 0000000..21e87a8
--- /dev/null
+++ b/website/content/posts/2012/07/flac-to-mp3.html
@@ -0,0 +1,11 @@
++++
+title = "Convert FLAC to MP3"
+type = "Article"
+date = "2012-07-07"
+tags = [ "Bash","one liner" ]
+slug = "flac-to-mp3"
++++
+
+<code>
+ find *.flac -exec bash -c 'flac -cd "{}" | lame -h - "{}.mp3"' \;
+</code>
diff --git a/website/content/posts/2012/07/flaky-wifi-solution.html b/website/content/posts/2012/07/flaky-wifi-solution.html
new file mode 100644
index 0000000..bf4ce41
--- /dev/null
+++ b/website/content/posts/2012/07/flaky-wifi-solution.html
@@ -0,0 +1,19 @@
++++
+title = "Flaky Wi-Fi Solution"
+type = "Article"
+tags = [ "hardware","diy"," first world problem" ]
+date = "2012-07-31"
+slug = "flaky-wifi-solution"
++++
+
+<p>Boxee Box, combined with the file server, has been faithfully playing tv shows and movies for over a year. In our new apartment the wireless router is two walls and a floor away from the tv and Boxee causing intermittent connection issues. The obvious answer is to not use Wi-Fi.</p>
+
+<p> Running an ethernet cable from the office to the tv is challenging due to doors and a puppy. There is another option -- use the air duct.</p>
+
+<img src="/media/living-room-vent.jpg" class="aligncenter" />
+
+<p>Our apartment is conveniently laid out. The vent in the office is adjacent to the router and the vent in the living room is less than two feet away (through the duct).</p>
+
+<img src="/media/office-vent.jpg" class="alignright" />
+
+<p>The problem is solved for now. I might have to revisit this option when the snow arrives and the heater is turned on.</p>
diff --git a/website/content/posts/2012/07/passwords-and-sourceforge.html b/website/content/posts/2012/07/passwords-and-sourceforge.html
new file mode 100644
index 0000000..d11e3a8
--- /dev/null
+++ b/website/content/posts/2012/07/passwords-and-sourceforge.html
@@ -0,0 +1,23 @@
++++
+title = "Passwords and SourceForge"
+type = "Article"
+date = "2012-07-10"
+tags = [ "development" ]
+slug = "passwords-and-sourceforge"
++++
+
+<p>One of the <a href="http://sourceforge.net/projects/protomol/">projects</a> that I am contributing to as part of my research is hosted on SourceForge. I found a bug, fixed it, and created a patch. Everything was ready to commit to the Subversion repository.</p>
+
+<code>git svn dcommit --username=caseyrobinson
+
+Committing to https://protomol.svn.sourceforge.net/svnroot/protomol ...
+Authentication realm: &lt;https://protomol.svn.sourceforge.net:443&gt; SourceForge Subversion area
+Password for 'caseyrobinson':
+Authorization failed: MKACTIVITY of '/svnroot/protomol/!svn/act/9e685c30-a6bd-43d6-9541-d1351ef14e3c': authorization failed: Could not authenticate to server: rejected Basic challenge (https://protomol.svn.sourceforge.net) at /usr/libexec/git-core/git-svn line 4891
+</code>
+
+<p>When I saw this error I became quite confused and frustrated. I checked my password. That wasn't it. My project privileges were correct as well. I asked the other contributors which led to numerous possibilities and hours of testing. All were plausible suggestions, however none worked out.</p>
+
+<p>It turns out that my password was using characters, single and double quotes, that satisfied the website but SVN doesn't accept. There is even a <a href="https://sourceforge.net/apps/trac/sourceforge/ticket/17694">support ticket</a> from 17 months ago where it is apparent that this issue is known. SourceForge should at least update their registration form to warn that certain characters will cause problems with some services.</p>
+
+<p>Lesson: <emph>Password policies cause more problems than they solve</emph>.</p>
diff --git a/website/content/posts/2012/07/subspace-sampling-control-run.html b/website/content/posts/2012/07/subspace-sampling-control-run.html
new file mode 100644
index 0000000..05ecb25
--- /dev/null
+++ b/website/content/posts/2012/07/subspace-sampling-control-run.html
@@ -0,0 +1,14 @@
++++
+title = "Subspace Sampling Control Run"
+type = "Article"
+tags = [ "String Method","research" ]
+date = "2012-07-30"
+slug = "subspace-sampling-control-run"
++++
+
+<video controls="controls" autoplay="autoplay">
+ <source src="/media/control_full_1080p.mp4" type="video/mp4" />
+ Your browser does not support the video tag and the MP4 container.
+</video>
+
+<p>The control run does not use any form of restraint for updating points. Despite this, the string evolves towards the correct location. Good news for the method. If only there was a way to avoid the points collapsing...</p>
diff --git a/website/content/posts/2012/07/the-oatmeal-on-religion.html b/website/content/posts/2012/07/the-oatmeal-on-religion.html
new file mode 100644
index 0000000..951dd6b
--- /dev/null
+++ b/website/content/posts/2012/07/the-oatmeal-on-religion.html
@@ -0,0 +1,15 @@
++++
+title = "The Oatmeal on Religion"
+type = "Link"
+external = "http://theoatmeal.com/comics/religion"
+date = "2012-07-24"
+slug = "the-oatmeal-on-religion"
++++
+
+<p>From <a href="http://theoatmeal.com/comics/religion">yesterday's comic</a>,</p>
+
+<blockquote><p>Would you kill for your religion? Would you hurt, hinder, or condemn in the name of your God? Yes? Then you probably suck at your religion.</p>
+
+<p>Does your religion inspire you to help people? Does it make you happier? Yes? EXCELLENT! Carry on with you religion! (Just keep it to you self.)</p></blockquote>
+
+<p>Couldn't have said it better myself</p>
diff --git a/website/content/posts/2012/07/useful-tutorial-for-using-git-with-svn-repositories.html b/website/content/posts/2012/07/useful-tutorial-for-using-git-with-svn-repositories.html
new file mode 100644
index 0000000..1baaac8
--- /dev/null
+++ b/website/content/posts/2012/07/useful-tutorial-for-using-git-with-svn-repositories.html
@@ -0,0 +1,10 @@
++++
+title = "Useful Tutorial for Using Git with SVN Repositories"
+type = "Link"
+external = "http://viget.com/extend/effectively-using-git-with-subversion"
+tags = [ "development","git" ]
+date = "2012-07-18"
+slug = "useful-tutorial-for-using-git-with-svn-repositories"
++++
+
+<p><a href="http://viget.com/extend/effectively-using-git-with-subversion">Extremely helpful tutorial</a> for working on projects still stuck on using stone-age version control systems.</p>
diff --git a/website/content/posts/2012/08/add-ssh-key-to-authorized-keys.html b/website/content/posts/2012/08/add-ssh-key-to-authorized-keys.html
new file mode 100644
index 0000000..a2f1a0d
--- /dev/null
+++ b/website/content/posts/2012/08/add-ssh-key-to-authorized-keys.html
@@ -0,0 +1,13 @@
++++
+title = "Add SSH Key to Authorized Keys"
+type = "article"
+tags = [ "one liner","ssh" ]
+date = "2012-08-07"
+slug = "add-ssh-key-to-authorized-keys"
++++
+
+<p>This great trick pushes your public key to the server in one step</p>
+
+<code>cat ~/.ssh/id_rsa.pub | ssh root@example.com 'cat - >> ~/.ssh/authorized_keys'</code>
+
+<p>*Note: You will need to enter the password the first time.</p>
diff --git a/website/content/posts/2012/08/electronic-spin-resonance.html b/website/content/posts/2012/08/electronic-spin-resonance.html
new file mode 100644
index 0000000..95ad388
--- /dev/null
+++ b/website/content/posts/2012/08/electronic-spin-resonance.html
@@ -0,0 +1,58 @@
++++
+title = "Electronic Spin Resonance"
+type = "Article"
+tags = [ "Physics" ]
+date = "2012-08-13"
+slug = "electronic-spin-resonance"
++++
+
+<h3>Abstract</h3>
+<p>This lab seeks to find the g-factor of DPPH, which should be near the Lande g-factor for the electron (2.0023). This is done by placing a sample of DPPH into a magnetic field and exposing it to microwaves. It was found that the Lande g-factor of the sample was 2.00823 &plusmn; 0.00024.</p>
+
+<h3>Introduction</h3>
+<p>The g-factor was first described by Alfred Lande in 1921. This was part of his explanation of the Zeeman effect. It is a term in the energy level expressions of an atom in a weak magnetic field.</p>
+
+<h3>Theoretical Background Info</h3>
+<p>The electron has a quantum spin number, s = &frac12; and magnetic moment, ms = + &frac12; and ms = -&frac12;. When placed in the presence of an external magnetic field, B, the magnetic moments align themselves either parallel or antiparallel to the applied field. This is known as the Zeeman effect. The two alignments have a difference in energy given by, &Delta;E = g&mu;_bB, where g is the electron’s Lande g-factor and &mu;_b is the Bohr magneton. This equation implies a direct proportionality between the energy difference and the applied magnetic field.</p>
+<p>This proportionality allows for a wide range of electromagnetic radiation to be used, given the corresponding field. A microwave was chosen for this experimental setup. A higher frequency leads to a larger the energy splitting which results in smaller error in detecting a spin flipping.</p>
+<p>An unpaired electron can shift between the two energy levels by absorption or emission of a photon of frequency &nu; = g&mu;_bB/h, where h is Plank's constant. For this reason a chemical with one unpaired electron. DPPH fits this requirement and therefore is chosen for this experiment.</p>
+
+<img src="/media/dpph-chemical-structure.png" class="aligncenter" />
+
+<p>Due to the Maxwell-Boltzmann distribution there are more electrons in the lower energy state than the higher one initially. Therefore when bombarded with microwaves there is a net absorbance. In order to find the maximum of this plot the first derivative is taken. Below is a plot showing the absorbance curve as well as the first derivative.</p>
+
+<img src="/media/absorbance-curve.png" class="aligncenter" />
+
+
+<h3>Experimental Method</h3>
+<p>This experimental setup consists of a microwave system, a sample of DPPH, Helmholtz coils, oscilloscope, audio amplifier, gauss meter, lock-in amplifier, and computer data acquisition system.</p>
+<img src="/media/microwave-schematic.png" class="aligncenter" />
+<p>The source of microwaves is a 100 mW Gunn diode. After the waves are emitted by the diode they pass through a switch, then into a ferrite attenuator. This attenuator serves to decouple the source from the rest of the experimental setup.</p>
+<p>The frequency meters and tuning stubs are used to tune the wave frequency so that it will resonate in the waveguide.</p>
+<p>The crystal detector attached to the magic tee is used to measure the relative power of the waves rather than the absolute power. </p>
+<p>The attenuators are used to change the power of the passing wave without affecting the frequency. This effect can be used to amplify the signal or, as is the case with the ferrite attenuator, decouple parts of the setup.</p>
+<p>The resonator cavity is used to amplify the ESR signal. This will only work if the microwave frequency is properly tuned to result in resonance inside of the cavity.</p>
+<p>The DPPH sample is placed into the resonator cavity between the Helmholtz coils and is the subject of study in this experiment.</p>
+<p>The Helmholtz coils are used to generate an approximately spatially constant magnetic field. There are three parts to the Helmholtz coils used in this experiment, constant, ramping coils, and alternating. The constant coils are used to set the magnetic field to within 30 G of the calculated field. The ramping coils are used to sweep the field which results in a more precise tuning of the magnetic field. The alternating coils are connected to the lock-in amplifier and set to alternate at around 200 Hz. This alternating field allows sweeping of the range in-between steps of the ramping coils. This technique results in a finer sweep of the magnetic field and smaller error. </p>
+<p>The gauss meter is used to measure the magnetic field. The measurement given by the gauss meter is highly affected by the orientation of the probe. This results in a large amount of uncertainty.</p>
+<img src="/media/magic-tee-schematic.png" class="aligncenter" />
+<p>The magic tee is used to divide the signal from the source between the reference arm and the sample. One would expect that the signal would be divided between B, C, and D, but due to polarization differences the signal from A does not enter D. The signal read at the crystal detector is the difference between the reference arm and the sample arm. Therefore once the signals are balanced a null output is read at D.</p>
+<p>Lock-in amplifier is used to reduce the noise in the signal. This is achieved because the lock-in amplifier acts as a narrow-bandpass filter with the ability to change the filtering frequency. The filtering frequency was set to 200 Hz for this experiment.</p>
+
+<h3>Experimental results</h3>
+<img src="/media/esr-plot.png" class="aligncenter" />
+<table>
+ <tr><td></td><td>B (kG)</td><td>g-factor</td></tr>
+ <tr><td>1</td><td>3385.52</td><td>2.00787</td></tr>
+ <tr><td>2</td><td>3384.53</td><td>2.00846</td></tr>
+ <tr><td>3</td><td>3384.55</td><td>2.00845</td></tr>
+ <tr><td>4</td><td>3385.095</td><td>2.0081</td></tr>
+ <tr><td>&mu;</td><td>3384.924</td><td>2.00823</td></tr>
+ <tr><td>&sigma;</td><td>0.41218</td><td>0.00024</td></tr>
+</table>
+
+<h3>Uncertainty Evaluation</h3>
+<p>The largest source of error in this experiment is the gauss meter and more specifically the Hall probe. The measured magnetic field is highly dependent on the orientation of the probe. If the probe is not exactly perpendicular to the magnetic field the reading is inaccurate. To counteract this problem another gauss meter was used to calibrate the field measurement.</p>
+
+<h3>Discussion and Conclusion</h3>
+<p>This experiment showed that the Landé g-factor for the DPPH sample is close to the g-factor for a free electron. The result confirms the theoretical prediction based on molecular structure. This lab also explained the importance and proper operation of a lock-in amplifier as well as a Gauss meter.</p>
diff --git a/website/content/posts/2012/08/git-resources.html b/website/content/posts/2012/08/git-resources.html
new file mode 100644
index 0000000..104df3d
--- /dev/null
+++ b/website/content/posts/2012/08/git-resources.html
@@ -0,0 +1,20 @@
++++
+title = "Git Resources"
+type = "Article"
+tags = [ "git","programming" ]
+description = "Ever growing list of references collected while learning and using git."
+date = "2012-08-27"
+slug = "git-resources"
++++
+
+<p>Git is an amazing version control system. This is an ever growing list of the references I have collected while learning git.</p>
+
+<ul>
+ <li><a herf="http://git-scm.com/book">Pro Git</a></li>
+ <li><a href="http://marklodato.github.com/visual-git-guide/index-en.html">Visual Git Reference</a></li>
+ <li><a href="http://scottr.org/presentations/git-in-5-minutes/">Git in 5 Minutes</a></li>
+ <li><a href="http://ftp.newartisans.com/pub/git.from.bottom.up.pdf">Git from the Bottom Up</a></li>
+ <li><a href="https://vimeo.com/35778382">Randal Schwartz on Git</a></li>
+ <li><a href="http://www.youtube.com/watch?v=4XpnKHJAok8">Linus discusses Git at Google</a></li>
+ <li><a href="http://nvie.com/posts/a-successful-git-branching-model/">A Successful Git Branching Model</a></li>
+</ul>
diff --git a/website/content/posts/2012/08/love-the-boring-bits.html b/website/content/posts/2012/08/love-the-boring-bits.html
new file mode 100644
index 0000000..d35496d
--- /dev/null
+++ b/website/content/posts/2012/08/love-the-boring-bits.html
@@ -0,0 +1,13 @@
++++
+title = "Love the Boring Bits"
+type = "Link"
+tags = [ "CSS","Web Design" ]
+external = "http://www.alistapart.com/articles/love-the-boring-bits-of-css/"
+description = "All of the features mentioned in this post simplify the job of a designer. I look forward to a future when these selectors and elements are implemented sans browser specific prefixes"
+date = "2012-08-16"
+slug = "love-the-boring-bits"
++++
+
+<blockquote>The best thing about all the new features in this article is that they solve real-world problems, from the small but annoying repetition of selectors to the new and ongoing challenges of building high-performance responsive sites. In fact, I can imagine using every single one of these features on a regular basis.</blockquote>
+
+<p>All of the features mentioned in this post simplify the job of a designer. I look forward to a future when these selectors and elements are implemented sans browser specific prefixes.</p>
diff --git a/website/content/posts/2012/08/operating-systems-intro.html b/website/content/posts/2012/08/operating-systems-intro.html
new file mode 100644
index 0000000..1e11ad5
--- /dev/null
+++ b/website/content/posts/2012/08/operating-systems-intro.html
@@ -0,0 +1,10 @@
++++
+title = "Operating Systems Intro"
+type = "Article"
+tags = [ "os f12" ]
+description = "Lots of papers will be read and <a href=\"http://rampantmonkey.com/tags/os\">summarized here</a> throughout the semester."
+date = "2012-08-22"
+slug = "operating-systems-intro"
++++
+
+<p>During my first semester at Notre Dame I will be taking Graduate Operating Systems. The main goal of this course is to improve my writing skills. To further this goal I will be reading research papers covering operating systems from the 1960's into present day. Each paper will be <a href="http://rampantmonkey.com/tags/os">summarized in a few paragraphs here</a> as the semester progresses</p>
diff --git a/website/content/posts/2012/08/set-time-zone-in-ubuntu.html b/website/content/posts/2012/08/set-time-zone-in-ubuntu.html
new file mode 100644
index 0000000..a74d516
--- /dev/null
+++ b/website/content/posts/2012/08/set-time-zone-in-ubuntu.html
@@ -0,0 +1,9 @@
++++
+title = "Set Time Zone in Ubuntu"
+tags = [ "one liner","ubuntu" ]
+type = "article"
+date = "2012-08-05"
+slug = "set-time-zone-in-ubuntu"
++++
+
+<code>sudo ln -sf /usr/share/zoneinfo/America/South_Bend /etc/localtime</code>
diff --git a/website/content/posts/2012/09/amazon-s3-cors.html b/website/content/posts/2012/09/amazon-s3-cors.html
new file mode 100644
index 0000000..514346f
--- /dev/null
+++ b/website/content/posts/2012/09/amazon-s3-cors.html
@@ -0,0 +1,15 @@
++++
+title = "Amazon Finally Adds CORS to S3"
+type = "Link"
+tags = [ "Amazon","web design" ]
+description = "Until this morning hosting static files on S3 required proxies. Now we can take advantage of S3 for fonts and JavaScript."
+external = "http://aws.typepad.com/aws/2012/08/amazon-s3-cross-origin-resource-sharing.html"
+date = "2012-09-01"
+slug = "amazon-s3-cors"
++++
+
+<p>This morning I was woken up two hours before my alarm by this message from Amazon.</p>
+<blockquote>You can use CORS support to build web applications that use JavaScript and HTML5 to interact directly with resources in Amazon S3 without the need for a proxy server. You can implement HTML5 drag and drop uploads to Amazon S3, show upload progress, or update content directly from your web applications. External web pages, style sheets, and HTML5 applications hosted in different domains can now reference assets such as web fonts and images stored in an S3 bucket, enabling you to share these assets across multiple web sites.</blockquote>
+<p>This long awaited feature is finally here!</p>
+
+<p>The most frustrating part about re-designing this website was deciding how to serve static files, especially fonts. In the past I stored the files on the server. Since the fonts are not going to change for a long time it makes sense to host them on S3 to take advantage of caching and cheap storage. Firefox and IE prevent many cross site files from loading, specifically JavaScript and fonts. Until this morning hosting static files on S3 required setting up a proxy, at which point hosting directly on the server makes more sense for small sites. Now, I can have the best of both worlds.</p>
diff --git a/website/content/posts/2012/09/maximum-flux-transition-paths.html b/website/content/posts/2012/09/maximum-flux-transition-paths.html
new file mode 100644
index 0000000..10fd4a0
--- /dev/null
+++ b/website/content/posts/2012/09/maximum-flux-transition-paths.html
@@ -0,0 +1,16 @@
++++
+title = "Maximum Flux Transition Paths"
+tags = [ "os f12","string method" ]
+type = "Article"
+description = "Taking a look at a novel method - Maximum Flux Transition Paths - in transition path theory."
+date = "2012-09-17"
+slug = "maximum-flux-transition-paths"
++++
+
+<p>This week we will be taking a look at a recent paper in transition path theory by Bob Skeel - <emph>Maximum Flux Transition Paths of Conformational Change</emph> [doi: <a href="http://dx.doi.org/10.1021/ct900689m">10.1021/ct900689m</a>]. This paper introduces a novel method to compute the transition pathway. A theoretical argument and prototype implemenation are presented to justify the importance of this new approach.</p>
+
+<p>Three uncontrolled approximations are used to make the maximum flux transition path computationaly feasible. First, Brownian dynamics accurately describes the movements in the collective variable space. Second, Most paths lie in a tube where isocommittors are planar. Finally, trajectories are parallel to path on average. All of these assumptions are reasonable, but may be downfalls for the method when examining larger molecules.</p>
+
+<p>Bob Skeel provides two interesting test cases which demonstrate the power of his method. First is a contrived example included as an example of an extreme case which most methods can not handle. It is also convienent since once can compute the answer by hand (or at least with Mathematica). The next example is a small, but important molecule - alanine dipeptide. His tests show that other methods produce errors when a minima is introduced between the start and end state. MFTP, however, successfully avoids these errors.</p>
+
+<p>The use of a contrived model to demonstrate a certain feature of the method is one idea from this paper which I will include in my future research.</p>
diff --git a/website/content/posts/2012/09/portable-programming.html b/website/content/posts/2012/09/portable-programming.html
new file mode 100644
index 0000000..3cbd2c8
--- /dev/null
+++ b/website/content/posts/2012/09/portable-programming.html
@@ -0,0 +1,16 @@
++++
+title = "Portable Programming"
+type = "Article"
+tags = [ "os f12" ]
+description = "Integrated development environments for mobile operating systems might appear to be a marketing gimick, but they are vital to the future of the platform."
+date = "2012-09-27"
+slug = "portable-programming"
++++
+
+<p>A few weeks ago a representative from Microsoft came to Notre Dame to demonstrate a few projects that Microsoft has been researching. One of these projects was programming mobile applications directly on a phone. This ability might appear to be a marketing gimick, but it is important for the future of the platform.</p>
+
+<p>The thought of programming on my phone is absurd. The tiny screen can only show a few lines of source code. The virtual keyboard is prone to errors and correcting typos is painful. And you can forget about easily switching between a website for reference and the IDE/text editor. Despite all of these reasons developing the tools for programming into/on top of mobile OSes will be of increasing importance.</p>
+
+<p>Develop software on larger, more capable platforms then push to smaller, more restricted device has been around for years as a strategy of programming. One specific example would be the video game console world. The model works for consoles because they are a targeted device, not meant to be a general purpose machine. Phones and tablets are designed to replace personal computers. Apple even refers to it as "<emph>The Post PC Era</emph>". This statement is comical since the devices are useless without applications developed on PCs.</p>
+
+<p>In order to fully embrace the movement away from traditional computers a full featured development environment must exist for mobile operating systems.</p>
diff --git a/website/content/posts/2012/09/school.html b/website/content/posts/2012/09/school.html
new file mode 100644
index 0000000..ac7b0e9
--- /dev/null
+++ b/website/content/posts/2012/09/school.html
@@ -0,0 +1,11 @@
++++
+title = "School"
+type = "Link"
+external = "http://www.savagechickens.com/2012/09/school-day.html"
+description = "So, what did you learn at school today?"
+tags = [ "Comics" ]
+date = "2012-09-05"
+slug = "school"
++++
+
+<p><a href="http://www.savagechickens.com/2012/09/school-day.html">Sad, but true.</a></p>
diff --git a/website/content/posts/2012/09/stanford-education-experiment.html b/website/content/posts/2012/09/stanford-education-experiment.html
new file mode 100644
index 0000000..6a8b32e
--- /dev/null
+++ b/website/content/posts/2012/09/stanford-education-experiment.html
@@ -0,0 +1,13 @@
++++
+title = "The Stanford Education Experiment"
+type = "Link"
+external = "http://www.wired.com/wiredscience/2012/03/ff_aiclass/all/"
+tags = [ "os f12","education" ]
+date = "2012-09-13"
+description = "Opinions on the online computer science course taught by two Stanford Professors"
+slug = "stanford-education-experiment"
++++
+
+<p>In the Fall of 2012, Two Stanford professors began their quest to change the face of higher education. Sebastian Thrun and Peter Norvig developed an online version of thier famous <emph>Introduction to AI</emph> course and opened enrollment to the public. Anyone with internet access was eligible. Many people siezed the opportunity - over 160,000 signed up for the course. The average grade for the course was 83%. Up from 60% in previous years when the course was offered in the traditional manner. Both professors see this experiment as a success and look to expanding the model for future courses.</p>
+
+<p>What can we take away from this experiment? Obviously the creators think that it is the greatest thing since sliced bread, but is this really the case? I feel that online education is a vast improvement over the traditional model. It provides students with freedom to work when, where, and how fast they choose. While this may be a problem for some students, I would argue that they are not prepared for higher education regardless of the setup.</p>
diff --git a/website/content/posts/2012/09/study-of-rare-events.html b/website/content/posts/2012/09/study-of-rare-events.html
new file mode 100644
index 0000000..c8620f0
--- /dev/null
+++ b/website/content/posts/2012/09/study-of-rare-events.html
@@ -0,0 +1,18 @@
++++
+title = "String method for the study of rare events"
+type = "Article"
+tags = [ "string method","os f12" ]
+description = "Eric Vanden-Eijnden proposes a method for studying rare events with strings. This paper provides the basis for much of the recent research in the field."
+date = "2012-09-24"
+slug = "study-of-rare-events"
++++
+
+<p>This week we will take a look at a modern interpretation of the study of rare event pathways. Previously we saw that transitions representing rare events can be <a href="http://rampantmonkey.com/2012/09/transition-state-method">defined in terms of a path</a> across the free energy plane of the system. Wigner's method is only useful with small systems and correspondingly small degrees of freedom. Weinan E, Weiqing Ren, and Eric Vanden-Eijnden proposed a method for expanding this theory into larger systems with many degrees of freedom in their 2002 paper <emph>String method for the study of rare events</emph> [ doi:<a href="http://dx.doi.org/10.1103/PhysRevB.66.052301">10.1103/PhysRevB.66.052301</a>].</p>
+
+<p>The string method begins by connecting two metastable states of interest with a line in configuration space. The configuration space is the minimum subset of the free energy space which still describes the transition (finding the coordinates for large systems is still an active area of research). The initial string is then iteratively evolved, at n discrete points, according to the underlying physics of the system. At each iteration the arclength of the string is computed and the string is re-parameterized to enable efficient sampling of the configuration space. The computation is stopped once the total movement of the string is below a specified threshold.</p>
+
+<p>By reducing the number of variables necessary to represent the transition the string method allows for efficient computation of the transition pathway. The paper presents two test cases which demostrate the effectiveness of the method. While these test systems are simple the show important facts about the method and allow for analytical solutions to be the basis of comparison.</p>
+
+<p>One way to improve the paper would have been to show a contour plot of the energy landscape with the string overlaid. A detailed plot would provide a clear picture of the mechanics of the method.</p>
+
+<p>"Characterization of a Dynamic String Method for the Construction of Transition Pathways in Molecular Reacions" [doi: <a href="http://dx.doi.org/10.1021/jp212611k">10.1021/jp212611k</a>] was published on May 22, 2012 and builds on the string method. Hummer's paper looks interesting because it takes a dynamic approach to sampling the configuration space and updating the string.</p>
diff --git a/website/content/posts/2012/09/transition-state-method.html b/website/content/posts/2012/09/transition-state-method.html
new file mode 100644
index 0000000..86e439b
--- /dev/null
+++ b/website/content/posts/2012/09/transition-state-method.html
@@ -0,0 +1,20 @@
++++
+title = "Transition State Method"
+type = "Article"
+tags = [ "os f12","physics"," string method" ]
+description = "Taking a look into one of the classic papers in chemical transition theory."
+date = "2012-09-10"
+slug = "transition-state-method"
++++
+
+<p>This semester I will be taking a tour of the important papers relating to finding trajectories of rare events. This week we will start from the beginning with <a href="http://en.wikipedia.org/wiki/Eugene_Wigner">Eugene Wigner's</a> seminal paper <emph>The Transition State Method</emph>[doi: <a href="http://dx.doi.org/10.1039/TF9383400029">10.1039/TF9383400029]</a>. Transactions of the Faraday Society originally published this paper in January 1938. I will begin with an overview of his theory, then I will discuss the structure and possible improvements.</p>
+
+<p>The transition state method is the first in a long series of theories using physics to explain chemical reactions. Wigner outlines a three part process for describing reactions &ndash; construct the energy surface, solve the rate of elementary reactions, consider the co-operation of multiple elementary reactions. This paper focuses solely on the middle step. Evans and Polanyi [doi: <a href="http://dx.doi.org/10.1039/TF9353100875">10.1039/TF9353100875</a>] developed a basic theory for constructing the energy surface based on theoretical models and experimental data. Wigner used their results as an example model for his theory.</p>
+
+ <p>Wigner's theory is based on three assumptions which are presented in great detail in his paper. The first is the adibatic assumption &ndash; the movements of the nuclei are slow relative to the electrons. Second, he assumes that the nuclei's motion under the given potential can be adequately described by classical mechanics. Third, the activation surface forms a saddle point near which all reactive trajectories pass. The first two are widely accepted, while the third was controversial. It turns out this assumption was correct and has been used many times since. This is the major advance provided in <emph>The Transition State Method</emph></p>
+
+<p>Wigner begins by framing the current state of the art and where his theory fits. He then goes on to outline his work. These two sections make up the first half. The rest of the paper is spent arguing the valididty of his assumptions. This is a common structure for papers in the field.</p>
+
+<p>Due to its age, I was expecing this paper to be a challenge read. I was wrong. I attribute the paper's approachability to the fact that chemistry was an established field at the time of publication. Despite being well written there are still a few opportunities for improvement. Adding more experimental data would provide justification for the assumptions made. As it turns out this was impossible at the time due to limitations in labratory technologies. </p>
+
+<p><emph>The Transition State Method</emph> began one of the largest research areas in theoretical chemistry.</p>
diff --git a/website/content/posts/2012/09/user-friendliness.html b/website/content/posts/2012/09/user-friendliness.html
new file mode 100644
index 0000000..7ea0da9
--- /dev/null
+++ b/website/content/posts/2012/09/user-friendliness.html
@@ -0,0 +1,13 @@
++++
+title = "User-Friendliness on Windows and Linux"
+type = "Link"
+external = "http://feathe.rs/20120901378"
+tags = [ "os","linux"," windows" ]
+description = "Linux offers a very different sort of hospitality. It's as though you are staying at a house with a fully-equipped professional kitchen, chemical lab, metal- and wood-shop, and firearm collection."
+date = "2012-09-01"
+slug = "user-friendliness"
++++
+
+<blockquote>Linux offers a very different sort of hospitality. It's as though you are staying at a house with a fully-equipped professional kitchen, chemical lab, metal- and wood-shop, and firearm collection, and your host simply left a note welcoming you and encouraging you to read up on whatever you choose to use, because some of it could hurt you badly, and other things are broken in ways that are not obvious.</blockquote>
+
+<p>This <a href="http://feathe.rs/20120901378">hilarious post by Jason Fruit</a> compares the user-friendliness of Windows and Linux to a gracious host welcoming you into his home. I appreciated his description of Linux, more specifically the statement about reading up on everything. While entertaining the description of Windows was gracious and overlooked or understated many of Windows flaws. It is definitely worth the time to read Jason's witty post.</p>
diff --git a/website/content/posts/2012/09/what-every-computer-science-major-should-know.html b/website/content/posts/2012/09/what-every-computer-science-major-should-know.html
new file mode 100644
index 0000000..f3008e7
--- /dev/null
+++ b/website/content/posts/2012/09/what-every-computer-science-major-should-know.html
@@ -0,0 +1,22 @@
++++
+title = "What every computer science major should know"
+type = "Article"
+tags = [ "os f12","computer science"," linux"," unix" ]
+description = "Vast swaths of programs targeted to one specific task is a powerful approach to computing. And one with which many students are never acquainted."
+date = "2012-09-03"
+slug = "what-every-computer-science-major-should-know"
++++
+
+<blockquote>
+<p>Computer scientists should be comfortable with and practiced in the Unix philosophy of computing.</p>
+<p>The Unix philosophy (as opposed to Unix itself) is one that emphasizes linguistic abstraction and composition in order to effect computation.</p>
+<p>In practice, this means becoming comfortable with the notion of command-line computing, text-file configuration and IDE-less software development.</p>
+</blockquote>
+
+<p><a href="http://matt.might.net/articles/what-cs-majors-should-know/">Matt hit the nail on the head</a> with his points on the Unix Philosophy. It is imperative for every computer science student to be well versed in the Unix philosophy. Emphasis on the <emph>philosophy</emph>. Vast swaths of programs targeted to one specific task is a powerful approach to computing. And one with which many students are never acquainted.</p>
+
+<p>For computer scientists and programmers, learning Unix shows a deep understanding of the entire development process. When I took 'Introduction to Programming' we spent the first month learning Visual Studio 2005. This allowed everyone in the class to type their code (mostly copied from the textbook or the internet), push a magical key sequence (ctrl-F5), and see the results. A better approach would have been to use Unix as an IDE.</p>
+
+<p>Tom Ryder provides an <a href="http://blog.sanctum.geek.nz/series/unix-as-ide/">excellent argument</a> detailing the advantages of this approach. I would suggest that everyone grok this series. Someone should probably develop a course around this idea.</p>
+
+<p>After finishing my Bachelor's degree I fully embraced the Unix Philosophy and vowed to <a href="http://rampantmonkey.com/2011/09/goodbye-windows">eliminate Windows</a> from my life. While this was extreme (and possibly not the best approach for everyone) I have never looked back.</p>
diff --git a/website/content/posts/2012/09/wireless-data-caps.html b/website/content/posts/2012/09/wireless-data-caps.html
new file mode 100644
index 0000000..2309460
--- /dev/null
+++ b/website/content/posts/2012/09/wireless-data-caps.html
@@ -0,0 +1,16 @@
++++
+title = "On Wireless Data Caps"
+type = "Article"
+tags = [ "os f12","networking" ]
+description = "Data caps are fair, but restricting type of usage is rediculous."
+date = "2012-09-20"
+slug = "wireless-data-caps"
++++
+
+<p>AT&amp;T introduced a limit (i.e. data cap) to the bandwidth for wireless subscribers in early 2009. The justification was that they need to limit usage in order to handle the flood of new data customers. The skeptic would also point out that it allows AT&amp;T to charge overage fees.</p>
+
+<p>In theory data caps are fair &mdash; users pay for the amount of data that they use. It does require predicting your usage but there are many options for handling prediction errors. AT&T allows users to backdate features on their account, including the data plan, which goes a long way towards removing the forecasting burden. Providing users with simple and accurate tools for monitoring usage is essential to consumer happiness.</p>
+
+<p>The implementation of data caps contain a few pecularities. AT&amp;T places restrictions on the type of traffic which is allowed on the network. In particular, FaceTime is forbidden and tethering requires an additional fee. While this made sense under an unlimited plan, there is no reason other than greed to continue these practices if each user is paying for a certain amount of data.</p>
+
+<p>Data caps provide an opening for smaller telecom companies to differentiate themselves in the market, which is ultimately a good thing. So I have no problem with data caps, but do not tell me how to enjoy the few bits I paid for.</p>
diff --git a/website/content/posts/2012/10/dynamic-string-method.html b/website/content/posts/2012/10/dynamic-string-method.html
new file mode 100644
index 0000000..18f2591
--- /dev/null
+++ b/website/content/posts/2012/10/dynamic-string-method.html
@@ -0,0 +1,16 @@
++++
+title = "Characterization of a Dynamic String Method"
+tags = [ "os f12","string method" ]
+type = "Article"
+description = "Margaret E. Johnson and Gerhard Hummer provide an overview of the various implementations of the string method."
+date = "2012-10-02"
+slug = "dynamic-string-method"
++++
+
+<p>In <emph>Characterization of a Dynamic String Method for the Construction of Transition Pathways in Molecular Reactions</emph> [doi: <a href="http://dx.doi.org/10.1021/jp212611k">10.1021/jp212611k</a>] Margaret E. Johnson and Gerhard Hummer provide an overview of the various implementations of the string method. The authors also discuss the common theoretical framework.</p>
+
+<p>One feature of the paper that will be useful is the structure. First a overview of the string method and past implementations and advances is provided. Next a theoretical framework is developed; from the physics of diffusion to the definition of the pathway. Once the framework is established the authors move onto the dynamics of the reaction pathway. A few paragraphs are spent discussing the committor function (the probability of reaching state B before state A). Lastly, some issues with implementation are discussed.</P>
+
+<p>Another presentation method I will emulate is the authors' presentation of figures. All of the explaination necessary to understand the figure is located directly below each plot. This removes the need to hunt through the paper in search of pointers to the figure.</p>
+
+<p>One improvement I would make to the paper is to include empirical evidence as a baseline for comparison of the various methods.</p>
diff --git a/website/content/posts/2012/10/iteratively.html b/website/content/posts/2012/10/iteratively.html
new file mode 100644
index 0000000..77ad865
--- /dev/null
+++ b/website/content/posts/2012/10/iteratively.html
@@ -0,0 +1,14 @@
++++
+title = "Iteratively"
+type = "article"
+description = "definition of iteratively"
+tags = [ "terminology" ]
+date = "2012-10-06"
+slug = "iteratively"
++++
+
+<p><emph>Iteratively</emph> (adv): repetition of a process aiming to approach a desired goal.</p>
+
+<p>Use it in a sentence. As we itertively learned <a href="http://en.wikipedia.org/wiki/Agricola_(board_game)">Agricola</a> the game became more exciting.</p>
+
+<p>See: <a href="http://dictionary.reference.com/browse/iteration">iteration</a></p>
diff --git a/website/content/posts/2012/10/link_prediction.html b/website/content/posts/2012/10/link_prediction.html
new file mode 100644
index 0000000..35e3edd
--- /dev/null
+++ b/website/content/posts/2012/10/link_prediction.html
@@ -0,0 +1,12 @@
++++
+title = "Link Prediction"
+type = "Article"
+tags = [ "terminology" ]
+description = "Overview of the term \"link prediction\""
+date = "2012-10-22"
+slug = "link_prediction"
++++
+
+<p><emph>Link Prediction</emph> (n): Concept in machine learning which attempts to estimate the likelihood of the existence of a connection (link) between two nodes, based on observed links and the attributes of nodes.</p>
+
+<p>Link prediction is a hot topic in data mining. Many algorithms exist, all of which are tailored to a specific type of graph.</p>
diff --git a/website/content/posts/2012/10/motion-input.html b/website/content/posts/2012/10/motion-input.html
new file mode 100644
index 0000000..01a53dc
--- /dev/null
+++ b/website/content/posts/2012/10/motion-input.html
@@ -0,0 +1,14 @@
++++
+title = "Motion Input"
+type = "Article"
+tags = [ "os f12" ]
+description = "A look at motion input for computers."
+date = "2012-10-04"
+slug = "motion-input"
++++
+
+<p>When I think of motion controls the first examples that comes to mind are <a href="http://www.youtube.com/watch?v=F_O5PHdHA8U">Minority Report</a> and <a href="http://www.youtube.com/watch?v=wKyQhriOrD0&feature=relmfu">Iron Man</a>. Both of these movies use holographic displays manipulated by hand movements. Hollywood is attempting to portray the future of computing with these interfaces. Are they correct?</p>
+
+<p>Motion input allows direct manipulation of on screen elements. As opposed to the abstraction created with current technology; keyboards, mice, touchpads. Many people are working on motion control. Microsoft is treating motion as a first order input device with Windows 8. In 2006, Jeff Han, a research scientist at NYU, invented a "<a href="http://www.youtube.com/watch?v=5JcSu7h-I40">Minority Report Style Interface</a>. And the Kinect has inspired many to explore new UI paradigms to handle motion interfaces.</p>
+
+<p>However, there is one intrinsic issue with all of these methods. They require larger movements to utilize when compared to keyboards and mice. This will cause fatigue and reduce the amount of time possible to use a computer. If motion devices can provide enough benefit to overcome this issue then they will take over. Otherwise we will be using keyboards and mice until the end of time.</p>
diff --git a/website/content/posts/2012/10/normal-mode-partitioning.html b/website/content/posts/2012/10/normal-mode-partitioning.html
new file mode 100644
index 0000000..4f329a4
--- /dev/null
+++ b/website/content/posts/2012/10/normal-mode-partitioning.html
@@ -0,0 +1,12 @@
++++
+title = "Normal Mode Partitioning"
+type = "Article"
+tags = [ "os f12" ]
+description = "Review of \"Normal Mode Partitioning of Langevin Dynamics for Biomolecules\"."
+date = "2012-10-30"
+slug = "normal-mode-partitioning"
++++
+
+<p>In 2008, a few researchers (my advisors among them) published their work detailing a normal mode integrator based on Langevin dynamics. With <a href="http://en.wikipedia.org/wiki/Normal_mode">Normal mode</a> analysis it is possible to study the vibrational characteristics of a system. Normal modes can be found in many disciplines ranging from civil engineering to quantum mechanics. In biophysics it is possible to break the movements of a molecule into two sets of frequencies - slow, and fast - and the frequency used to define the split is arbitrary. The authors applied this concept to biomolecules and developed an integrator (function that updates positions of atoms based on physics). Next, the authors measured the performance of the integrator by varying the number of modes propagated. This idea is of particular interest to <a href="http://rampantmonkey.com/tags/os-f12">Operating Systems</a> since we will be following a similar pattern with our <a href="http://rampantmonkey.com/posts/2012/10/project_proposal_video">final project</a>.</p>
+
+<p>One improvement I would make to the paper is to explore the idea of describing the movements of a biomolecule by the slowest frequencies. How does this affect other simulations? Will the reduction in computation time result in less accurate results? Is it possible to determine an accurate estimate of the number of modes to propagate based on the characteristics of the system in question?</p>
diff --git a/website/content/posts/2012/10/paravirtualization.html b/website/content/posts/2012/10/paravirtualization.html
new file mode 100644
index 0000000..58cc560
--- /dev/null
+++ b/website/content/posts/2012/10/paravirtualization.html
@@ -0,0 +1,14 @@
++++
+title = "Paravirtualization"
+type = "Article"
+tags = [ "terminology" ]
+description = "(n): Technique used in virtualization which presents an abstracted software interface to the vm."
+date = "2012-10-02"
+slug = "paravirtualization"
++++
+
+<p><emph>Paravirtualization</emph> (n): Technique used in virtualization which presents an abstracted software interface representing the underlying hardware to virtual machines</p>
+
+<p>This technique is useful for removing some of the complexities in dealing with hardware that are unimportant to the guest os. For example, the type of storage system (hard disk, raid, ssd, etc.) is not important and can make the VM more complicated</p>
+
+<p>See: <a href="http://en.wikipedia.org/wiki/Paravirtualization">Wikipedia: Paravirtualization</a></p>
diff --git a/website/content/posts/2012/10/project_proposal_video.html b/website/content/posts/2012/10/project_proposal_video.html
new file mode 100644
index 0000000..403ee8f
--- /dev/null
+++ b/website/content/posts/2012/10/project_proposal_video.html
@@ -0,0 +1,20 @@
++++
+title = "Project Proposal Video"
+type = "Article"
+tags = [ "os f12" ]
+description = "Behind the scenes of creating a video slideshow."
+date = "2012-10-22"
+slug = "project_proposal_video"
++++
+
+<p>This semester in operating systems we are working in teams to build, analyze, and improve a system. My group has chosen to work with <a href="http://rampantmonkey.com/2012/10/link_prediction.html">link prediction</a> and <a href="http://hadoop.apache.org">Hadoop</a>. Tomorrow is the deadline for our proposal. I have embedded the video version below.</p>
+
+<iframe width="853" height="480" src="http://www.youtube-nocookie.com/embed/-wNqB6tSCy8?rel=0" frameborder="0" allowfullscreen></iframe>
+
+<p>Now that you have seen the video I would like to explain some of the techniques I used to create it.</p>
+
+<p>Since all three of us have a background in science and engineering we are familar with <a href="http://www.latex-project.org">LaTeX</a>. <a href="http://en.wikipedia.org/wiki/Beamer_(LaTeX)">Beamer</a> is an excellent class for creating slideshows with LaTeX. Beamer includes many different style templates and customization options. Best of all, it is open source so customization is guranteed. Of course, all of the plain text was edited with <a href="http://www.vim.org">VIM</a> and shared with <a href="http://gitlabhq.com">gitlab</a>
+
+<p>Apple's <a href="http://www.apple.com/ilife/">iLife</a> was used to record, edit, and encode the audio as well as the video. This was my first time using either GarageBand or iMovie. Both programs were unexpectedly powerful, yet simple to use.</p>
+
+<p>Overall, this was a plesant experience and I look forward to exploring some geekier options. (<a href="http://ffmpeg.org">ffmpeg</a>, <a href="http://aws.amazon.com/s3/">s3</a>, <a href="http://bartaz.github.com/impress.js">impress.js</a>, ...).</p>
diff --git a/website/content/posts/2012/11/GPU-molecular-dynamics.md b/website/content/posts/2012/11/GPU-molecular-dynamics.md
new file mode 100644
index 0000000..d7429a8
--- /dev/null
+++ b/website/content/posts/2012/11/GPU-molecular-dynamics.md
@@ -0,0 +1,18 @@
++++
+title = "GPU Molecular Dynamics"
+type = "Article"
+tags = [ "os f12" ]
+description = "Taking a look at a paper which discusses the challenges of implementing molecular dynamics on graphics cards."
+date = "2012-11-13"
+slug = "GPU-molecular-dynamics"
++++
+
+This week's assignment is to review one of the papers that our classmates chose earlier in the semester. I have chosen to take a look at <emph>General Purpose Molecular Dynamics Simulations Fully Implemented on Graphics Processing Units</emph> [doi: [10.1016/j.jcp.2008.01.047](http://dx.doi.org/10.1016/j.jcp.2008.01.047). Yong Hwan Kim originally chose to discuss this paper for the [fourth weekly assignment](http://ykimsysif.blogspot.com/2012/10/paper-blog-4.html) on October 1st.
+
+Parallelizing molecular dynamics is trivial since the force calculations are independant for each atom and type of force. The challenge is in passing data. This is where the gpu can come in. Large amounts of short floating point operations are the perfect candidate for GPU processing.
+
+Previously the authors had tried to implement parallelized versions on clusters. They found that the communication overhead dominated the performance for large systems. The authors show that the gpu implementation running on one card can equal the throughput of a small to medium sized cluster.
+
+One challenge with the GPU implementation is determining the correct size for the processing chuncks. The smallest processing unit requires 32 threads, each executing the same instruction sequence. Another challenge is memory access. Since the GPU has a much smaller amount of memory than the system itself, access latency can dominate the simulation's performance.
+
+This paper was originally published in May 2008. In the past 4.5 years many new technologies and software platforms have become available. It would be interesting to see if the relative performance of GPUs and CPUs has decreased, improved, or remained the same.
diff --git a/website/content/posts/2012/11/advanced-git-aliases.md b/website/content/posts/2012/11/advanced-git-aliases.md
new file mode 100644
index 0000000..4794fc5
--- /dev/null
+++ b/website/content/posts/2012/11/advanced-git-aliases.md
@@ -0,0 +1,15 @@
++++
+title = "Advanced Git Aliases"
+type = "Link"
+external = "http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/"
+tags = [ "git" ]
+description = "Collection of git aliases that save time and make the command line git interface more pleasant."
+date = "2012-11-23"
+slug = "advanced-git-aliases"
++++
+
+> Shorten and beautify your log command because you will use it a lot. I have a ton of list(ls) and inspection commands that I use constantly. I recommend you experiment with the examples below and come up with your own variation.
+
+Tons of great advice to get you started tweaking your `.gitconfig` file. Definitely an amusing way to get through a boring meeting or class.
+
+Check out my [dot files repository](https://github.com/rampantmonkey/dot_files) to see what I have come up with instead of wasting time at *weekly group meetings*.
diff --git a/website/content/posts/2012/11/app-store-casino.md b/website/content/posts/2012/11/app-store-casino.md
new file mode 100644
index 0000000..026cd43
--- /dev/null
+++ b/website/content/posts/2012/11/app-store-casino.md
@@ -0,0 +1,21 @@
++++
+title = "The App Store is a Casino"
+type = "Link"
+external = "http://www.fastcompany.com/1792313/striking-it-rich-app-store-developers-its-more-casino-gold-mine"
+tags = [ "os f12","Apple" ]
+description = "For users buying an app is akin to pulling the lever on a slot machine with one key difference: repeatable experiences."
+date = "2012-11-29"
+slug = "app-store-casino"
++++
+
+For users buying an app is akin to pulling the lever on a slot machine with one key difference: repeatable experiences.
+
+[<img src="/media/iphone-slot-machine.jpg" class="aligncenter" />](http://www.vegasnews.com/25558/jackpot-slots-converts-iphone-to-slot-machine-with-handle.html)
+
+In a casino multiple people sit at a machine and will have vastly different experiences. One casino-goer will need a [wheelbarrow](http://rampantmonkey.com/2012/11/question-to-ask-a-contractor) to take home their haul as they watch coins tumble to the floor after lining up three 7's. While another will spend their weekend cashing in their life savings and dumping an endless stream of quarters into the machine only to receive the occasional "free" drink. This is not the case with Apple's App Store.
+
+When two customers download the same app from the App Store they will have the exact same experience (unless Apple starts [corrupting binaries](http://www.marco.org/2012/07/04/app-store-corrupt-binaries) again). Customers benefit from this since they are able to read other users' opinions about any given app before purchasing. Determining the legitimacy of the of the reviews is an entirely different topic.
+
+Let's stretch the metaphor a little further to include the experiences of developers publishing apps in the App Store. Imagine a casino where the slot machines are not owned by the casino itself, but by the individuals who designed said machine. The slot machines will have widely varying characteristics: some will have 12 handles, some will require a connection to the "cloud", and others will let you innundate your friends with your "unlucky" weekend. The only thing they have in common is that the casino owner gets 30 percent of every machine's profits. There are no exceptions to this rule. Even Nakatomi Trading Corp. will not receive a discount.
+
+So in a sense this is fair, those who make the most popular apps get the most business. But the real winner is not the customers or the developers it is the casino owner.
diff --git a/website/content/posts/2012/11/byod.html b/website/content/posts/2012/11/byod.html
new file mode 100644
index 0000000..dd6fe13
--- /dev/null
+++ b/website/content/posts/2012/11/byod.html
@@ -0,0 +1,16 @@
++++
+title = "Bring your on Device"
+tags = [ "os f12" ]
+type = "artiCle"
+description = "BYOD provides many benefits and challenges for IT."
+date = "2012-11-01"
+slug = "byod"
++++
+
+<p>Bring your own device (BYOD) is a business concept in which employees provide their own smart phone, tablet, computer, etc. It has become a popular trend in the past decade and introduces many new issues in IT.</p>
+
+<p>The most important, and challenging, issue with BYOD is security. Since the company has no control over the device and the users will be accessing private data there is a large potential for loss. One method for combating this challenge is to require encryption and remote wiping capabilities.</p>
+
+<p>BYOD has many benefits for both the company and the employees. The business can save money since they do not have to purchase the devices. The employees are happier since they get to use the devices that they choose. The employees also take better care of the technology since they have a greater sense of ownership.</p>
+
+<p>BYOD also creates a market for management software. There are already many startups tackling this issue, but none provide a complete solution. It will be an interesting field to watch for the next decade.</p>
diff --git a/website/content/posts/2012/11/classic-nintendo-games-are-np-hard.md b/website/content/posts/2012/11/classic-nintendo-games-are-np-hard.md
new file mode 100644
index 0000000..d2fbead
--- /dev/null
+++ b/website/content/posts/2012/11/classic-nintendo-games-are-np-hard.md
@@ -0,0 +1,30 @@
++++
+title = "Classic Nintendo Games are NP-Hard"
+type = "Article"
+tags = [ "os f12","algorithms"," nintendo" ]
+description = "Exploration of computational complexity of some of my favorite childhood video games."
+date = "2012-11-20"
+slug = "classic-nintendo-games-are-np-hard"
++++
+
+In computational complexity theory [NP-hard](http://en.wikipedia.org/wiki/NP-hard) is the category which contains decision problems that cannot be solved by a computer in finite time. Since it is impossible to solve without guessing (or breaking relativity), these type of problems form the foundation for excellent game mechanics. It turns out that many of the games I grew up playing fall into the NP-hard category. In March 2012, Greg Aloupis, Erik D. Demaine, and Alan Guo [published proofs for five of these games](http://arxiv.org/abs/1203.1895): [Mario](http://en.wikipedia.org/wiki/Super_Mario_(series)), [Donkey Kong](http://en.wikipedia.org/wiki/Donkey_Kong), [Legend of Zelda](http://en.wikipedia.org/wiki/The_Legend_of_Zelda_(video_game)), [Metroid](http://en.wikipedia.org/wiki/Metroid_(video_game)), and [Pok&eacute;mon](http://en.wikipedia.org/wiki/Pokémon_(video_game_series)).
+
+Proving that a problem is NP-hard boils down to showing that it is isomorphic to another, already proven, NP-hard problem. The first problem to be proven NP-hard was [satisfiability](http://en.wikipedia.org/wiki/Boolean_satisfiability_problem), so most proofs involve developing a mechanisim (or series of mechanisms) which form the isomporphism from the current problem into satisfiability. This is the method used in <emph>Classic Nintendo Games</emph>.
+
+All of these games consist of exploring a map or level defined by various types of objects with which the player may interact. Most of the games also include items and battles, but these systems are not discussed in the paper.
+
+To prove the NP-hardness of classic Nintendo games, the authors developed a framework which uses five gadgets to map level exploration into 3-SAT. After they prove that the framework is valid they proceed to show each of the five gadgets for each of the games. If you are interested in the details for each game check out the paper (no subscription required!). Let's take a look at the framework used.
+
+<img class="aligncenter" src="/media/nintendo-framework.jpg" />
+
+- <emph>Start</emph> trivial, but necessary to define the beginning of the map.
+- <emph>End</emph> usually trivial, but can be more complicated if the player is required to be in a certain state.
+- <emph>Variable</emph> requires player to choose one of two paths, thereby closing the other.
+- <emph>Clause and Check</emph> only allow passage if all variables leading to this gadget are set correctly
+- <emph>Crossover</emph> allow traversal between two crossing paths without leakage into the other
+
+The clause &amp; check and variable gadgets directly correspond to the variables and statments from 3-SAT. The start, end, and crossover gadgets serve as the bridge between platform games and satisfiability. Now all that is left is to show that each of the gadgets exist for a given game.
+
+This paper is an excellent example of computational complexity proofs. It clearly walks through the required steps and provides a general framework for showing other games are also NP-hard. The tie-in to Nintendo games is brilliant and provides an excellent starting point for reading the paper.
+
+One negative of the paper is the repetitiveness. To improve the quality of the paper, I would have appreciated an exploration of a different part of the game (e.g. the battle system in Pok&eacute;mon).
diff --git a/website/content/posts/2012/11/conferences-or-journals.html b/website/content/posts/2012/11/conferences-or-journals.html
new file mode 100644
index 0000000..69718eb
--- /dev/null
+++ b/website/content/posts/2012/11/conferences-or-journals.html
@@ -0,0 +1,16 @@
++++
+title = "Conferences or Journals"
+type = "Article"
+tags = [ "os f12" ]
+description = "Publications are important for a career in scientific research. Both conferences and journals have a place in this process."
+date = "2012-11-08"
+slug = "conferences-or-journals"
++++
+
+<p>Publication venues for science and engineering can be divided into two broad categories - conferences and journals. Both provide opportunites to share research with pros and cons.</p>
+
+<p>Conferences have many advantages over journals. The bar for entry is lower which encourages earlier versions of research. And, in turn, more disucssion about topics of interest. Another bonus is the opportunity to travel to attend the conference and network with other researchers in the field. The downside is that conferences are not held with as much regard as journals in most topics.</p>
+
+<p>Journals are better preserved and archived. Articles published in highly selective journals dramatically boost the quality of a cv or grant application. However, publishing an article in a journal is a long and grueling process designed to weed out all but the best papers. This difficulty deters many people from journals.</p>
+
+<p>It is necessary to publish in both conferences and journals since they provide vastly different experiences. Don't focus on one or the other completely.</p>
diff --git a/website/content/posts/2012/11/question-to-ask-a-contractor.md b/website/content/posts/2012/11/question-to-ask-a-contractor.md
new file mode 100644
index 0000000..9447660
--- /dev/null
+++ b/website/content/posts/2012/11/question-to-ask-a-contractor.md
@@ -0,0 +1,18 @@
++++
+title = "Question to Ask a Contractor"
+type = "Article"
+tags = [ "life" ]
+description = "One simple question can weed out many potential candidates."
+date = "2012-11-21"
+slug = "question-to-ask-a-contractor"
++++
+
+<emph>How would you transport an empty wheelbarrow in a pickup truck?</emph>
+
+If the answer does not contain the phrase "upside down" don't hire him. He doesn't know how to problem solve. And is that really someone who you would like to work on your home?
+
+This morning on our way to work my wife and I were driving behind a pickup truck. The pickup was plastered with signage for a local contractor and had an empty wheelbarrow thrown in the bed. While we were making a left turn at 15 MPH we watched as the wheelbarrow went tumbling across the intersection. Fortunately no one was hurt. But it did bring up an interesting point: <emph>Shouldn't a contractor know how to safetly transport tools of his trade?</emph>
+
+One solution would have been to tie the wheelbarrow down. But a better solution would have been to turn the wheelbarrow upside down. This would have avoided any unwanted movement and required the same (if not less) effort than right side up.
+
+This idea can be generalized to any profession and is something I look forward to investigating further.
diff --git a/website/content/posts/2012/11/research-without-walls.md b/website/content/posts/2012/11/research-without-walls.md
new file mode 100644
index 0000000..96dd408
--- /dev/null
+++ b/website/content/posts/2012/11/research-without-walls.md
@@ -0,0 +1,19 @@
++++
+title = "Research Without Walls"
+type = "Link"
+external = "http://www.researchwithoutwalls.org"
+tags = [ "os f12" ]
+description = "Closed journals lock away knowledge and only provide access to those willing to pay. This is unethical and needs to stop."
+date = "2012-11-15"
+slug = "research-without-walls"
++++
+
+Before the Internet, the only efficient method for sharing scientific knowledge was paper publications. Submit a paper to a journal. The journal reviews, edits, and prints the best submissions. Researchers then pay for a paper copy of the journal. This model makes sense in a world where stacks of paper must be shipped around the globe.
+
+Now, many years after the invention of the Internet we are still stuck with the old publication model. Sure, it is possible to get a pdf instead of paper. With the exception of delivery method, the entire process remains unchanged. This is not acceptable.
+
+Technology has a history of removing middle men (see: USPS, Cable TV, Music Industry) who are unable or unwilling to adapt. This will be the same case with scientific journals.
+
+Some concerns have been raised that many of the supportors of Research Without Walls are Google and Microsoft employees. This potentially raises conflicts of interest due to the companies' search engine efforts. These concerns are unfounded. The concept of research without walls is solid in its own right.
+
+I have [signed](http://www.researchwithoutwalls.org/537) the pledge. The next step is to avoid submitting to closed journals in the first place.
diff --git a/website/content/posts/2012/11/walking-on-potential-energy-surfaces.html b/website/content/posts/2012/11/walking-on-potential-energy-surfaces.html
new file mode 100644
index 0000000..7b37771
--- /dev/null
+++ b/website/content/posts/2012/11/walking-on-potential-energy-surfaces.html
@@ -0,0 +1,16 @@
++++
+title = "Walking on Potential Energy Surfaces"
+type = "Article"
+tags = [ "os f12" ]
+description = "Find stationary points in energy surfaces based on knowledge of local gradients and curvatures."
+date = "2012-11-06"
+slug = "walking-on-potential-energy-surfaces"
++++
+
+<p>One of the most common operations in computational chemistry is finding stationary points in energy surfaces based on local gradients and curvatures. In 1989, a group of researchers published a paper describing a computationaly efficent algorithm for exploring energy surfaces [doi: <a href="http://dx.doi.org/10.1063/1.458435">10.1063/1.458435</a>]. The most important thing to remember with walking on surfaces is that we only have local information about the energy surface. Therefore every calculation and step must take place within a set distance of the initial location. One trick employed to reduce required computation is the local quadratic approximation.</p>
+
+<p>Another variable to consider is the step size. A short step size will require more iterations to cover the same distance as a longer step, but will be more accurate. Long step sizes tend to overshoot the target location. While this makes sense, some mathematical justification would improve the quality of the paper.</p>
+
+<p>To conclude the paper the authors provide an example application. They implement their algorithm and show that it matches the experimental results conducted in a chemistry lab. This step is important to show the feasibility of their method.</p>
+
+<p>This paper is cited in most transition path papers, including Eric Vanden-Eijnden's paper <a href="http://rampantmonkey.com/2012/09/study-of-rare-events">String Method for the Study of Rare Events</a>. <emph>Walking on Potential Energy Surfaces</emph> is a seminal work in the field of transition path theory and, more broadly, computational chemistry.</p>
diff --git a/website/content/posts/2012/12/bbedit-10-5.md b/website/content/posts/2012/12/bbedit-10-5.md
new file mode 100644
index 0000000..907ef9a
--- /dev/null
+++ b/website/content/posts/2012/12/bbedit-10-5.md
@@ -0,0 +1,17 @@
++++
+title = "BBEdit. Now with Retina."
+type = "Link"
+tags = [ "bbedit","vim" ]
+description = "Retina support finally arrives."
+external = "http://www.macworld.com/article/2018459/bbedit-10-5-adds-retina-display-support-navigation-improvements-and-more.html#lsrc.twt_macworld"
+date = "2012-12-04"
+slug = "bbedit-10-5"
++++
+
+Bare Bones Software released BBEdit 10.5 today. The headlining feature is retina support. Retina capable macs began shipping at WWDC in June. Many of the tools I use on a daily basis were updated within two weeks. Except for one: BBEdit.
+
+Originally I was disappointed with the lack of an update. The transition to retina should not have been a surprise to any developer, let alone one who has been in the Mac space as long as Bare Bones. The 6 month delay in releasing this version was disappointing since BBEdit was my go-to editor.
+
+But I have moved on to the greener pastures of vim. I don't regret this change and am actually glad that Bare Bones forced my hand.
+
+That said, if you are looking for a powerful, full featured editor that doesn't require lots of customization search no more BBEdit is the answer.
diff --git a/website/content/posts/2012/12/carmine-contraption-v0-0-6.md b/website/content/posts/2012/12/carmine-contraption-v0-0-6.md
new file mode 100644
index 0000000..348a1ca
--- /dev/null
+++ b/website/content/posts/2012/12/carmine-contraption-v0-0-6.md
@@ -0,0 +1,21 @@
++++
+title = "Carmine Contraption Version 0.0.6 Released"
+tags = [ "ruby","web design"," carmine contraption" ]
+type = "Article"
+description = "Discussion of features and installation of the first stable release of Carmine Contraption"
+date = "2012-12-04"
+slug = "carmine-contraption-v0-0-6"
++++
+
+Carmine Contraption is my first long-term Ruby project. It is a static blogging engine designed to use git for data transportation and storage. For a more detailed description check out the [Readme](https://github.com/rampantmonkey/carmine_contraption/blob/master/Readme.md).
+
+Version 0.0.6 brings features designed to reduce friction when using Carmine Contraption. Here are some of the highlights.
+- Configuration file to specify often used variables like *source* and *destination*
+- A [Rakefile](http://rake.rubyforge.org) was added to automatically run tests and build gems
+- [Pathname](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html) and [ERB](http://ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html) to begin taking advantage of the [Standard Library](http://www.ruby-doc.org/stdlib-1.9.3/).
+
+There are two methods to install and use carmine contraption.
+1. Source Distribution via [GitHub](https://github.com/rampantmonkey/carmine_contraption)
+2. RubyGems: `gem install CarmineContraption` or visit [RubyGems website](https://rubygems.org/gems/CarmineContraption).
+
+If you find any bugs or have feature suggestions [submit an issue](https://github.com/rampantmonkey/carmine_contraption/issues/new) on GitHub).
diff --git a/website/content/posts/2012/12/lego-jedi-starfighter-time-lapse.md b/website/content/posts/2012/12/lego-jedi-starfighter-time-lapse.md
new file mode 100644
index 0000000..a2fa81f
--- /dev/null
+++ b/website/content/posts/2012/12/lego-jedi-starfighter-time-lapse.md
@@ -0,0 +1,10 @@
++++
+title = "LEGO Jedi Starfighter Construction Time-lapse"
+type = "Article"
+tags = [ "LEGO","time-lapse" ]
+description = "Time-lapse video of one of my Christmas presents."
+date = "2012-12-28"
+slug = "lego-jedi-starfighter-time-lapse"
++++
+
+<iframe width="960" height="720" src="https://www.youtube-nocookie.com/embed/OHcvSKjD3pc?rel=0" frameborder="0" allowfullscreen></iframe>
diff --git a/website/content/posts/2012/12/retrospective-2012-edition.html b/website/content/posts/2012/12/retrospective-2012-edition.html
new file mode 100644
index 0000000..1ccc690
--- /dev/null
+++ b/website/content/posts/2012/12/retrospective-2012-edition.html
@@ -0,0 +1,71 @@
++++
+title = "Retrospective 2102 Edition"
+type = "Article"
+tags = [ "Editorial" ]
+description = "A look back on the year that was."
+date = "2012-12-31"
+slug = "retrospective-2012-edition"
++++
+
+<p>2012 was a big year. Lots of things happened and I learned many things. My hope is that this post will serve as an inspiration for 2013 and beyond.</p>
+
+<h3>Programming</h3>
+
+<p>For Christmas 2011 I recieved a copy of <a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks">Seven Languages in Seven Weeks</a>. The book provides (as evidenced by the title) an overview/introduction to seven different programming languages. I made it through the book, but it was not an easy feat. I will be the first to admit that I did not fully understand the book. The final three languages - <a href="http://www.erlang.org">Erlang</a>, <a href="http://clojure.com">Clojure</a>, and <a href="http://www.haskell.org/haskellwiki/Haskell">Haskell</a> - were brutal for someone with little theoretical experience with programming languages. I learned a lot and plan to revisit Seven Languages over the summer once I finish Algorithms and Compilers. But as far as 2012 is concerned, the most important aspect of Seven Languages was my introduction to the beauty of <a href="http://www.ruby-lang.org/en/">Ruby</a>. I ended up spending the rest of 2012 learning Ruby. Here is my 2012 Ruby reading list.</p>
+
+<ul>
+<li><a href="http://pragprog.com/book/rails4/agile-web-development-with-rails">Agile Web Development with Rails</a></li>
+<li><a href="http://pragprog.com/book/dccar/build-awesome-command-line-applications-in-ruby">Build Awesome Command-Line Applications in Ruby</a></li>
+<li><a href="http://designpatternsinruby.com">Design Patterns in Ruby</a></li>
+<li><a href="http://www.amazon.com/gp/product/B004MMEJ36">Eloquent Ruby</a></li>
+<li><a href="http://pragprog.com/book/ager/exceptional-ruby">Exceptional Ruby: Master the Art of Handling Failure in Ruby</a></li>
+<li><a href="http://www.humblelittlerubybook.com">Humble Little Ruby Book</a></li>
+<li><a href="http://pragprog.com/book/ltp2/learn-to-program">Learn to Program</a></li>
+<li><a href="http://pragprog.com/book/ppmetr/metaprogramming-ruby">Metaprogramming Ruby: Program Like the Ruby Pros</a></li>
+<li><a href="http://mislav.uniqpath.com/poignant-guide/book/">Poignant Guide</a></li>
+<li><a href="http://www.amazon.com/gp/product/B0096BYG7C">Practical Object-Oriented Design in Ruby: An Agile Primer</a></li>
+<li><a href="http://pragprog.com/book/ruby3/programming-ruby-1-9">Programming Ruby 1.9</a></li>
+<li><a href="http://blog.rubybestpractices.com/posts/gregory/022-rbp-now-open.html">Ruby Best Practices</a></li>
+<li><a href="http://ruby.railstutorial.org">Ruby on Rails Tutorial: Learn Rails by Example</a></li>
+<li><a href="http://patshaughnessy.net/ruby-under-a-microscope">Ruby Under a Microscope</a></li>
+<li><a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks">Seven Languages in Seven Weeks</a></li>
+<li><a href="http://www.amazon.com/Well-Grounded-Rubyist-David-Black/dp/1933988657">The Well Grounded Rubyist</a></li>
+</ul>
+
+<p>All of these books provided insight into programming in Ruby and I plan to re-visit the advanced titles as I continue to explore Ruby in 2013.</p>
+
+<p>The most interesting project I created while reading through these books is my static blog engine - <a href="https://github.com/rampantmonkey/carmine_contraption">Carmine Contraption</a> - which powers this site.</p>
+
+<h3>Photography</h3>
+
+<p>Photography became my new hobby in 2012. For my birthday Rose bought me a DSLR with two lenses (<a href="http://www.nikonusa.com/en/Nikon-Products/Product/Digital-SLR-Cameras/25478/D5100.html">Nikon D5100</a> with <a href="http://www.nikonusa.com/en/Nikon-Products/Product/Camera-Lenses/2176/AF-S-DX-NIKKOR-18-55mm-f%252F3.5-5.6G-VR.html">AF-S DX NIKKOR 18-55mm f/3.5-5.6G VR</a> and <a href="http://www.nikonusa.com/en/Nikon-Products/Product/Camera-Lenses/2183/AF-S-DX-NIKKOR-35mm-f%252F1.8G.html">AF-S DX NIKKOR 35mm f/1.8G</a> in case you were wondering). I have taken 3,465 photos since my birthday. Most of them were out of focus or over exposed, but I had a few good ones and have managed to reduce the frequency of unusable photos with practice. I look forward to exploring more aspects of photography (snow and flowers are the first two that come to mind).</p>
+
+<h3>Technology</h3>
+
+<p>In 2012, I decided to begin migrating my workflows to the command line. GUI's became too unreliable, slow to upgrade, and difficult to customize. This pilgrimage began over the summer when Apple released a new laptop (<a href="http://www.apple.com/pr/library/2012/06/11Apple-Introduces-All-New-MacBook-Pro-with-Retina-Display.html">15" MBP with Retina Display</a>). The new display required developers to rewrite their existing applications, otherwise they would look horrendous. My previously favorite editor failed to upgrade in time for me. I switched to <a href="http://www.vim.org">vim</a> and haven't looked back. I also switched from bash to <a href="http://zsh.sourceforge.net">zsh</a> and began using <a href="http://tmux.sourceforge.net">tmux</a> to manage multiple applications.</p>
+
+<p>The biggest change in my computing experience was realizing that I could change the function of keyboard keys. I knew that it was possible from my gaming days, but applying that idea to text editing was new to me. The most useful change was remapping capslock. I mean, what a useless key. It is one of the largest keys and performs a frivilous task (only usable in YouTube comments). It is almost begging to be changed. Steve Losh pointed out one potential use of capslock on his <a href="http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#controlescape">blog</a>. He proposed that capslock be remapped to control AND escape. I know that it sounds crazy, but read his post and you will see the light.</p>
+
+<h3>Entertainment</h3>
+
+<p>I found many new TV shows that are excellent. Most of them are shows that have ended and I missed, which I tend to prefer. The highlights are <a href="http://en.wikipedia.org/wiki/24_(TV_series">24</a>), <a href="http://en.wikipedia.org/wiki/Battlestar_Galactica_(2004_TV_series">Battle Star Galactica (2004)</a>), <a href="http://en.wikipedia.org/wiki/The_league">The League</a>, and <a href="http://en.wikipedia.org/wiki/Top_chef">Top Chef</a>. 2012 also brought the end of two favorites: House and Chuck. House is the first series that I watched from the beginning and ended with good ratings, which provides a new perspective to television. 2012 even had two superb seasons of Survivor - <a href="http://en.wikipedia.org/wiki/Survivor:_One_World">One World</a> and <a href="http://en.wikipedia.org/wiki/Survivor:_Philippines">Philippines</a>.</p>
+
+<p>Throughout the past year I have realized that video games have lost almost all presence in my life. Instead of Mario Kart we play board games and watch tv; and instead of playing TF2 or Guild Wars I write code. Not sure why this happened, but I found it to be an interesting observation.</p>
+
+<p>One form of entertainment that has not lost prominence is podcasts. I still listen to six or seven each week. This may reduce in 2013 due to the cancellation of two of the best - <a href="http://5by5.tv/hypercritical">Hypercritical</a> and <a href="http://5by5.tv/buildanalyze">Build &amp; Analyze</a> (still worth listening to the back catalog). But new podcasts continue to find their way onto my iPhone.</p>
+
+<h3>Personal</h3>
+
+<p>On a more personal level, 2012 was a year which contained many changes. In January I began my final semester at YSU with two classes and working on my thesis. In February I was flown out to South Bend for an admissions interview with the graduate school at Notre Dame. Apparently they liked my answers because I was admited to the program with a full stipend. May marked the end of my Master's degree with a successful defense of my thesis and passing my finals.</p>
+
+<p>On June 1st my wife and I packed up our first apartment and drove seven hours to our new home in South Bend. This was a first for both of us. We had both lived in Pennsylvania for our entire lives. At the end of June we adopted our puppy, Radley. He has provided many learning experiences and is the perfect addition to our family. Throughout the summer I worked as a research assistant on campus and made some new friends. We also explored the local attractions. I even managed to lose my wedding ring in Lake Michigan. Both sets of parents also made a trip out to see us over the summer. They are happy for us, but miss having us fifteen minutes away.</p>
+
+<p>On August 14th Rose and I celebrated our second anniversary by assembling a portable grill and cooking steaks. At the end of August I began my first semester of classes at Notre Dame. I had one class - <a href="http://rampantmonkey.com/tags/os-f12">Operating Systems</a> - and research. Both went surprisingly well and were excellent experiences. In September Rose started her new job as a therapist working with children suffering with autisim. Every day I am impressed by her patience and willingness to help others.</p>
+
+<p>October brought both of our birthdays. Mine was first and my parents came out to celebrate. They gave me a new game - Agricola - which has provided many weekends ofentertainment. For Rose's birthday traveled by train to Chicago. It was a long day full of walking and excitement. I even managed to take a few <a href="http://rampantmonkey.com/photos/chicago-2012">photos</a>.</p>
+
+<p>2012 was the first year we had our own Thanksgiving. Rose cooked the turkey breast and pumpkin pie while I made the sides and Radley cleaned up the floor . It was crazy, but everything was tasty. I look forward to doing it again next year.</p>
+
+<p>In December I completed my first semester at Notre Dame with a 4.0 GPA (first time ever. I guess it helps to only take one class.). We also made our first trip back to PA despite the snow. Radley loved the car ride and made many new friends (five dogs at the in-law's for Christmas!).</p>
+
+<p>I think that just about does it for my year. Can't wait to see what next year brings. Happy New Year!</p>
diff --git a/website/content/posts/2013/01/explicit-vs-implicit.md b/website/content/posts/2013/01/explicit-vs-implicit.md
new file mode 100644
index 0000000..012ad26
--- /dev/null
+++ b/website/content/posts/2013/01/explicit-vs-implicit.md
@@ -0,0 +1,28 @@
++++
+title = "Explicit vs Implicit"
+type = "Article"
+tags = [ "Development","programming"," ruby"," carmine contraption" ]
+description = "Use <b>explicit</b> dependencies whenever possible. It will save many future headaches."
+date = "2013-01-15"
+slug = "explicit-vs-implicit"
++++
+
+When first introducing Markdown support in [Carmine Contraption](https://github.com/rampantmonkey/carmine_contraption) I reached for what was familiar. In this case that was the [perl script](http://daringfireball.net/projects/markdown/) written by John Gruber. To use this script from Carmine Contraption I had to wrap a system call in a method.
+
+ def self.translate_markdown content
+ `echo "#{content}" | bin/markdown.pl`
+ end
+
+Sure, this implementation worked, but there were many problems. It was slow, ugly, and bloated the size of the git repository. All of those reasons provided pain, but not enough to take time to fix it. After all, it still was able to produce the formatted content. At least until I upgraded the version of Ubuntu running on my VPS. After a few hours of debugging I found that my path was unknowingly modified. Long story short, I finally found enough motivation to remove the code smell.
+
+Turns out that there is an excelent Markdown parsing library for Ruby. Even GitHub uses it. Ten minutes after finding [Redcarpet](https://github.com/vmg/redcarpet) my code was transformed to this.
+
+
+ require 'redcarpet'
+
+ def translate_markdown content
+ md = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
+ md.render(content)
+ end
+
+The main issue here is <b>explicit</b> vs <b>implicit</b> dependencies. The original version of this method had two implicit dependencies: correct version of perl and correct path variable. The new version has one explicit dependency: Redcarpet. The implicit dependencies are ninjas, lurking in the shadows waiting to pounce at the most inopportune time. Where as the explicit dependencies can be controlled easily by modifying the Gemfile.
diff --git a/website/content/posts/2013/01/some-small-refactorings-in-ruby.md b/website/content/posts/2013/01/some-small-refactorings-in-ruby.md
new file mode 100644
index 0000000..478030f
--- /dev/null
+++ b/website/content/posts/2013/01/some-small-refactorings-in-ruby.md
@@ -0,0 +1,23 @@
++++
+title = "Some Small Refactorings in Ruby"
+type = "link"
+date = "2013-01-16"
+tags = [ "ruby","refactor"," programming" ]
+external = "http://caiustheory.com/some-small-refactorings-in-ruby"
+description = "Changing multiple eequality comparisons from imperative form to declaritive form and four other simple refactorings."
+slug = "some-small-refactorings-in-ruby"
++++
+
+<p>Casius Durling published an <a href="http://caiustheory.com/some-small-refactorings-in-ruby">insightful post</a> describing five simple refactorings to improve the readability of Ruby code. I found &#39;Multiple equality comparisons&#39; the most exciting.</p>
+
+<p>It starts with a common expression simillar to this one.</p>
+
+<pre><code>foo == &quot;bar&quot; || foo == &quot;baz&quot; || foo == :sed || foo == 5
+</code></pre>
+
+<p>And after the refactoring it now looks like this.</p>
+
+<pre><code>[&quot;bar&quot;, &quot;baz&quot;, :sed, 5].include? foo
+</code></pre>
+
+<p>19 less characters to type and it is now declarative instead of imperative. Another bonus is the increased ease of change. Now there is only one copy of <code>foo</code>.</p>
diff --git a/website/content/posts/2013/02/nazi-algorithms.md b/website/content/posts/2013/02/nazi-algorithms.md
new file mode 100644
index 0000000..4327832
--- /dev/null
+++ b/website/content/posts/2013/02/nazi-algorithms.md
@@ -0,0 +1,13 @@
++++
+title = "Nazi Algorithms"
+type = "Link"
+external = "http://corner.mimuw.edu.pl/?p=354"
+tags = [ "algorithms" ]
+description = "A project by computer science students designed to promote the study of algorithms."
+date = "2013-02-24"
+slug = "nazi-algorithms"
++++
+
+<p><img src="/media/nazi-algorithms-screenshot.png" alt="screen shot"></p>
+
+<p>This video provides a new perspective on the importance of algorithms. Go <a href="http://corner.mimuw.edu.pl/?p=354">watch it</a>.</p>
diff --git a/website/content/posts/2013/04/pokemon-exception-handling.md b/website/content/posts/2013/04/pokemon-exception-handling.md
new file mode 100644
index 0000000..fe3086c
--- /dev/null
+++ b/website/content/posts/2013/04/pokemon-exception-handling.md
@@ -0,0 +1,18 @@
++++
+title = "Pokémon Exception Handling"
+type = "Article"
+tags = [ "terminology" ]
+description = "(n): Colloquialism describing exception handlers that \"Catch 'em all\"."
+date = "2013-04-09"
+slug = "pokemon-exception-handling"
++++
+
+<p><em>Pokémon Exception Handling</em> (n): Colloquialism for describing the intent or function of an exception handler which catches every type of exception</p>
+
+<p><img src="/media/pokemon-blue.jpg" alt="Pokémon Blue"></p>
+
+<p><a href="http://en.wikipedia.org/wiki/Pok%C3%A9mon">Pokémon</a> was a popular videogame, TV show, and card game during my childhood. The main goal was to catch, train, and battle &#39;pocket monsters&#39;. The slogan is &quot;Gotta Catch &#39;em All&quot; because the main character, Ash, was on a mission to catch every single Pokémon in existence.</p>
+
+<p>A common idiom in programming languages is throwing an exception when an error occurs and catching it at a different point. Best practice is to catch a limited subset of the exceptions to be explicit in handling the error. However, there is at least one point at which the brute force, catch every exception, is useful. At program exit catching every unhandled exception, logging the error, and producing a useful debug message improves the user friendliness of a program.</p>
+
+<p>(Photo Courtesy of <a href="http://allycatastrophe.deviantart.com/art/Pokemon-Blue-196624187">allycatastrophe</a>)</p>
diff --git a/website/content/posts/2013/08/ruby-warrior.md b/website/content/posts/2013/08/ruby-warrior.md
new file mode 100644
index 0000000..7a6ffa3
--- /dev/null
+++ b/website/content/posts/2013/08/ruby-warrior.md
@@ -0,0 +1,187 @@
++++
+title = "Ruby Warrior"
+type = "article"
+tags = [ "ruby" ]
+description = "Ruby Warrior provides a playground for learning Ruby at any level."
+date = "2013-08-23"
+slug = "ruby-warrior"
++++
+
+<p><a href="https://github.com/ryanb/ruby-warrior">Ruby Warrior</a> is a fascinating game in which the player writes a program to navigate their warrior through a tower to rescue the fair maiden, Ruby.
+As you progress through the tower each level becomes more complex.
+To compensate for the increased difficulty your warrior gains abilities like looking around the room, ranged attacks, and even walking backwards.</p>
+
+<p>As a player of the game you are given an empty Ruby class, <code>Player</code>, which informs Ruby Warrior of you next action.
+Ruby Warrior runs in a loop which terminates upon reaching the stairs to the next level or death.
+Each iteration of the loop calls the <code>play_turn</code> method in your <code>Player</code> class which chooses an action to perform based on the current state of the world.</p>
+
+<p>My solutions are available on <a href="https://github.com/rampantmonkey/ruby-warrior-solutions">GitHub</a>.
+I decided to employ a <a href="http://en.wikipedia.org/wiki/Finite-state_machine">state machine</a> as the core of my decision making.
+Unfortunately, I did not explicitly use a state machine so the code is convoluted.
+Each transition in the state machine returns the next action as a symbol, e.g. <code>:walk!</code>.
+This symbol is then sent to the warrior to finish the turn.</p>
+
+<p>As I progressed through the tower I found that it was useful to introduce transitions which did not end the turn.
+One example is retreat.
+If the warrior is about to die the top priority is finding a safe place to heal.
+This goal is captured in a retreat state with transitions specifically designed to hide and heal.
+To include non-turn-ending transitions, I modified the <code>play_turn</code> method to continually pick an action until one of the turn enders is selected.</p>
+
+<p>Crafting the state machine was mostly trial and error.
+A whiteboard is also helpful at this stage.
+The most useful action is feel.
+Feeling every direction on every turn provides the most information about the warrior&#39;s surroundings which allows for a more accurate choice of the next action.</p>
+
+<p>If artificial intelligence is not your cup of tea you can always abuse Ruby&#39;s dynamic nature to cheat.
+I came up with a six line method which breezes through both towers, albeit with a score of D.
+In order to check for completion of a level, Ruby Warrior compares the warrior&#39;s position with the stair&#39;s position.
+So hacking boils down to teleporting the warrior to the stairs or relocating the stairs to the warrior.
+The code for both is nearly identical.
+I chose stair relocation only because it is more ridiculous than teleportation, at least in the context of a video game.</p>
+
+<p>It turns out that Ruby Warrior provides your <code>Player</code> with the entire state of the world.
+The state is hidden within the <code>warrior</code> object.
+<code>inspect</code>, <code>methods</code>, and <code>instance_variables</code> allowed me to quickly narrow down exactly the location for the state of the world.
+The <code>feel</code> method contains a <code>@floor</code> instance variable which is a reference to, not a copy of, the state of the world.</p>
+
+<p>The reference part is important.
+This means that any updates to <code>@floor</code> are stored and used for computing the state for the next turn.
+My hack exploits this design and replaces the stairs&#39; location with the warrior&#39;s current location.
+And on the next turn the completion condition is met.</p>
+
+<p>There is one caveat.
+On the first level your warrior does not know <code>:feel</code>.
+Fortunately the solution in the first level is simple: always choose <code>walk!</code>.
+So I first check if <code>feel</code> is defined and then take the appropriate action.</p>
+
+<pre><code>def play_turn warrior
+ if warrior.methods.include? :feel
+ warrior_position = warrior.feel.instance_eval(&quot;@floor.units.detect{|el| el.is_a? RubyWarrior::Units::Warrior}&quot;).position
+ warrior.feel.instance_eval(&quot;@floor&quot;).instance_eval(&quot;@stairs_location = [#{warrior_position.instance_eval(&quot;@x&quot;)}, #{warrior_position.instance_eval(&quot;@y&quot;)}]&quot;)
+ else
+ warrior.walk!
+ end
+end
+</code></pre>
+
+<p>Just for fun, here is the output of the hack in epic mode.</p>
+
+<pre><code>Welcome to Ruby Warrior
+Starting Level 1
+- turn 1 -
+--------
+|@ &gt;|
+--------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 14
+Clear Bonus: 3
+Level Grade: S
+Total Score: 17
+Starting Level 2
+- turn 1 -
+--------
+|@ s &gt;|
+--------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 19
+Level Grade: C
+Total Score: 17 + 19 = 36
+Starting Level 3
+- turn 1 -
+---------
+|@ s ss s&gt;|
+---------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 34
+Level Grade: F
+Total Score: 36 + 34 = 70
+Starting Level 4
+- turn 1 -
+-------
+|@ Sa S&gt;|
+-------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 44
+Level Grade: F
+Total Score: 70 + 44 = 114
+Starting Level 5
+- turn 1 -
+-------
+|@ CaaSC|
+-------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 44
+Level Grade: F
+Total Score: 114 + 44 = 158
+Starting Level 6
+- turn 1 -
+--------
+|C @ S aa|
+--------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 54
+Level Grade: F
+Total Score: 158 + 54 = 212
+Starting Level 7
+- turn 1 -
+------
+|&gt;a S @|
+------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 29
+Level Grade: F
+Total Score: 212 + 29 = 241
+Starting Level 8
+- turn 1 -
+------
+|@ Cww&gt;|
+------
+rampantmonkey does nothing
+Success! You have found the stairs.
+Level Score: 0
+Time Bonus: 19
+Level Grade: F
+Total Score: 241 + 19 = 260
+Starting Level 9
+- turn 1 -
+-----------
+|&gt;Ca @ S wC|
+-----------
+rampantmonkey does nothing
+Archer shoots forward and hits rampantmonkey
+rampantmonkey takes 3 damage, 17 health power left
+CONGRATULATIONS! You have climbed to the top of the tower and rescued the fair maiden Ruby.
+Level Score: 0
+Time Bonus: 39
+Level Grade: F
+Total Score: 260 + 39 = 299
+Your average grade for this tower is: D
+
+Level 1: S
+Level 2: C
+Level 3: F
+Level 4: F
+Level 5: F
+Level 6: F
+Level 7: F
+Level 8: F
+Level 9: F
+
+To practice a level, use the -l option:
+
+rubywarrior -l 3
+</code></pre>
diff --git a/website/content/posts/2013/10/first-publication.md b/website/content/posts/2013/10/first-publication.md
new file mode 100644
index 0000000..ec9d6ad
--- /dev/null
+++ b/website/content/posts/2013/10/first-publication.md
@@ -0,0 +1,17 @@
++++
+title = "First Publication"
+type = "article"
+tags = [ "publication","conference" ]
+description = "A link to and a quick note about my first published paper."
+date = "2013-10-09"
+slug = "first-publication"
++++
+
+<p>For the past nine months I have been working in the <a href="http://www3.nd.edu/%7Eccl/%22">Cooperative Computing Lab</a> at The University of Notre Dame.
+Our group produces software to assist other researchers develop distributed workflows and applications.
+My first project was to create portable workflow pacakges from existing scientific workflows.</p>
+
+<p>The main techniques I used were static analysis and tree traversal.
+Once the entire tree of dependencies was uncovered, the linker creates a package containing all of the dependencies.</p>
+
+<p>For more details check out <a href="http://www.nd.edu/%7Eccl/research/papers/automated-packaging-works13.pdf">the paper</a> or <a href="https://github.com/cooperative-computing-lab/cctools/tree/master/makeflow_linker">the source code</a>.</p>
diff --git a/website/content/posts/2013/11/giggle-test.md b/website/content/posts/2013/11/giggle-test.md
new file mode 100644
index 0000000..52aa15c
--- /dev/null
+++ b/website/content/posts/2013/11/giggle-test.md
@@ -0,0 +1,13 @@
++++
+title = "Giggle Test"
+type = "article"
+tags = [ "terminology" ]
+description = "Method for judging the viability of an estimate, usually in a social context."
+date = "2013-11-17"
+slug = "giggle-test"
++++
+
+<p><emph>giggle test</emph> (n): variation of the sniff test; used for deciding the viability of an estimate.
+When considering a value it passes the <emph>giggle test</emph> if you can say it with a straight face, i.e. without giggling.</p>
+
+<p>For example, when suggesting a value during salary negotiation it would be wise to choose one which passes the giggle test.</p>
diff --git a/website/content/posts/2013/11/tool-sharpening.md b/website/content/posts/2013/11/tool-sharpening.md
new file mode 100644
index 0000000..d34f044
--- /dev/null
+++ b/website/content/posts/2013/11/tool-sharpening.md
@@ -0,0 +1,110 @@
++++
+title = "Tool Sharpening"
+type = "article"
+tags = [ "development","unix" ]
+description = "Sharp tools make for light work."
+date = "2013-11-20"
+slug = "tool-sharpening"
++++
+
+<p>Let&#39;s begin with a goal: determine the commands which you type most frequently.
+To solve this problem we will <a href="http://rampantmonkey.com/posts/2012/10/iteratively">iteratively</a> interact with the terminal.</p>
+
+<h3>1: Locate the data</h3>
+
+<pre><code>history 1
+</code></pre>
+
+<h3>2: Extract relevant data</h3>
+
+<pre><code>awk &#39;{print $2}&#39; | awk &#39;BEGIN {FS=&quot;|&quot;} {print $1}&#39;
+</code></pre>
+
+<h3>3: Count occurrences</h3>
+
+<pre><code>sort | uniq -c
+</code></pre>
+
+<h3>4: Format Output</h3>
+
+<pre><code>sort -r | head -n 10
+</code></pre>
+
+<h2>Result</h2>
+
+<pre><code>$ history 1 |
+ awk &#39;{print $2}&#39; |
+ awk &#39;BEGIN {FS=&quot;|&quot;} {print $1}&#39; |
+ sort |
+ uniq -c |
+ sort -r |
+ head -n 10
+
+2132 g
+ 774 ls
+ 721 fg
+ 312 cd
+ 288 cat
+ 216 make
+ 177 rm
+ 150 vim
+ 114 rackup
+ 110 p
+ 107 man
+ 101 pass
+ 72 twa
+ 72 mv
+ 65 twd
+ 62 twn
+ 62 mkdir
+ 62 brew
+ 61 ssh
+ 61 ll
+</code></pre>
+
+<p>Above is the output of the history pipeline on my machine.
+Two general observations are a direct consequence of my <a href="http://src.rampantmonkey.com/dot_files/">dot files</a>.
+Most commands are four letters or less and many commands are custom aliases.
+One oddity is the disproportionate frequency of <code>g</code>.
+<code>g</code> is my alias for <code>git</code>.
+The pipeline discussed above lumps all git commands together under one count due to the first <code>awk</code> command.
+I have a slight variation of this pipeline which only looks at <code>git</code> subcommands.</p>
+
+<h2>Characterizing the process</h2>
+
+<p>In every iteration there are three basic steps: deciding what you want the computer to do, telling the computer what to do, and waiting for the computer to finish the task.
+Of these three steps thinking is the most challenging to shorten, so I&#39;ll leave that as an exercise for the reader.
+Improving execution time is also difficult.
+However, execution is a minuscule portion of the total time for an iteration.
+Thinking and execution also represent the time where work is being done.
+While instructing the computer is complete waste; both your brain and CPU are idle during this stage.
+Therefore I will focus on reducing the time spent instructing the computer.</p>
+
+<p>The solution is to reduce the number of keys typed for each instruction.
+This has two effects which both shrink the instructing time.
+First, each key press takes time.
+Time to physically move a finger to the key and time to press the key.
+The number of key presses is directly proportional to the instructing time, thus by removing keys the time shrinks.
+Second, each key press is a chance for error.
+An erroneous key press will at best cause a syntax error, causing you to backtrack and try again.
+More wasted time.</p>
+
+<h2>Implementing a Solution</h2>
+
+<p>Now that you are convinced that removing key presses is the correct approach, the logical question is &quot;How?&quot;.
+The answer is simple, aliases.
+All of my favorite tools (<code>zsh</code>, <code>git</code>, <code>vim</code>, <code>mutt</code>, and <code>tmux</code>) support custom aliases.</p>
+
+<p>For example, I have <a href="http://src.rampantmonkey.com/dot_files/commit/?id=029e747410a51d37bc0bd48ff18b8844280a80b3">aliased</a> the history parsing pipeline to <code>h</code>.</p>
+
+<h2>Conclusion</h2>
+
+<p>This example shows how to reduce the friction when using the terminal.
+When I think of this process my mind immediately jumps to the image of an ax head casting sparks across a dark room while being sharpened (hence the title of this post).
+While I framed this discussion in the context of terminal programs, I use this approach for everything including GUIs and social interactions.</p>
+
+<h2>P.S. A brief note about programming style</h2>
+
+<p>The primary goal of source code is to communicate ideas, algorithms, and workflows with other developers and secondarily with the computer.
+Language is ambiguous; a problem which is exacerbated use of shortcuts and abbreviations.
+By combining these two facts it is obvious that my argument for customization and aliases <emph>does not apply to programming languages</emph>.</p>
diff --git a/website/content/posts/2013/12/fingerprint-scanner.md b/website/content/posts/2013/12/fingerprint-scanner.md
new file mode 100644
index 0000000..2a8b54e
--- /dev/null
+++ b/website/content/posts/2013/12/fingerprint-scanner.md
@@ -0,0 +1,41 @@
++++
+title = "Fingerprint Scanner"
+type = "article"
+tags = [ "iPhone","Apple"," security" ]
+description = "Ranting about my frustrations with the iPhone 5S fingerprint scanner."
+date = "2013-12-17"
+slug = "fingerprint-scanner"
++++
+
+<p><img src="/media/fingerprint_components.png" alt="components of fingerprint scanner">
+Earlier this year Apple released a new iPhone, the 5S.
+Aside from iOS 7, 64 bit processor, and better camera Apple added a new feature designed to improve security, the fingerprint scanner.
+I purchased this phone on launch weekend to replace my aging Android (it still had a sliding keyboard).</p>
+
+<p>The goal of the fingerprint scanner is to reduce the annoyance of passcode entry while still providing some level of security to the device.
+In order to meet this goal it has to reliably detect my fingerprints and reject everyone else&#39;s.
+While the fingerprint scanner uses a high resolution of 500 ppi, matching is a statistical process and there will be false positives (someone else&#39;s fingerprint is valid) and false negatives (my prints don&#39;t match).
+False positives are detrimental to security since they grant access to the device to unauthorized users.
+False negatives annoy users by requiring another attempt or passcode entry (which the entire fingerprint process was trying to avoid).
+If there are enough false negatives users will disable the feature.</p>
+
+<p>The use of fingerprints has many unintended consequences.
+You leave thousands of fingerprints around every day.
+So while fingerprints may prevent your friends from tweeting &quot;poop&quot; while you aren&#39;t looking it reduces the overall security of a passcode by providing a readily available method for sufficiently motivated people to bypass the passcode.
+Fingerprints also have legal implications.
+Unlike passwords, fingerprints are not protected under the fifth amendment.
+If either of these reasons bother you don&#39;t use the fingerprint scanner.</p>
+
+<p>Now that we have the theoretical discussion out of the way let&#39;s discuss my experience.</p>
+
+<p>Adding fingerprints was simple: just keep tapping the home button until the on-screen fingerprint&#39;s ridges turn completely red.
+<img src="/media/register_finger.png" alt="adding a fingerprint"></p>
+
+<p>For the first week the fingerprint scanner was fantastic.
+Only once was I told to retry and even then it was due to user error (I had attempted to use an unregistered finger).
+As I became more comfortable with the phone I began to grab the phone in increasingly strange orientations.
+Turns out that the fingerprint scanner is useless unless your finger is within an extremely small deviation of the angle used for saving the print initially.
+This caused much frustration until I characterized the problem, at which point I promptly removed my fingerprints.
+The fingerprint scanner is a noble idea but the lack of flexibility undermines potential.</p>
+
+<p>The fingerprint scanner does however bring one feature which all users will appreciate: a sturdier home button.</p>
diff --git a/website/content/posts/2014/01/2014-reading-list.md b/website/content/posts/2014/01/2014-reading-list.md
new file mode 100644
index 0000000..fa12d21
--- /dev/null
+++ b/website/content/posts/2014/01/2014-reading-list.md
@@ -0,0 +1,51 @@
++++
+title = "2014 Reading List"
+type = "article"
+tags = [ "Editorial","Books" ]
+description = "A collection of books that I am striving to read in 2014."
+date = "2014-01-15"
+slug = "2014-reading-list"
++++
+
+<p>Over the past year I have purchased many books and collected suggestions for books to read.
+I leafed through each one and decided which ones are most interesting to read next.
+Once I compiled the list of books the challenge is deciding which one to read first.
+That is where this post comes in.</p>
+
+<p>The goal is to create a directed graph of books to read.
+I started by enumerating the books using the <a href="http://www.graphviz.org/content/dot-language">dot language</a>.
+Once all of the books were entered I began connecting the obvious dependencies.
+For instance, it would be useful to have a basic understanding of Erlang before attempting to develop web servers with Erlang.
+Hence, <em>Learn You Some Erlang</em> comes before <em>Building Web Applications with Erlang</em>.</p>
+
+<p>After the obvious relationships were explored I had a bunch of groups with minimal relationship between them.
+Choosing the order for reading these groups was more arbitrary and mostly based on my impression of each book from the brief time I spent initially evaluating it.
+With some time tinkering I observed that there were three general categories of books: Erlang and scalable web applications, object oriented design and Ruby, and communication with Asperger&#39;s.
+I decided to leave each group separate and pick which category to explore when I was ready to read the next book.</p>
+
+<p>I am going to start with <em>Learn You Some Erlang</em> because I had already worked through half of it over Christmas break.
+Here is the graph I constructed to determine the order of reading.
+I plan to periodically update the image with my progress.
+There is an alphabetized list of the books with links after the image.</p>
+
+<img src="/media/reading_list.png" />
+
+<ul>
+<li><a href="http://www.jkp.com/catalogue/book/9781849059435">Asperger&#39;s Syndrome Workplace Survival Guide</a></li>
+<li><a href="http://shop.oreilly.com/product/0636920021452.do">Building Web Applications with Erlang</a></li>
+<li><a href="http://en.wikipedia.org/wiki/Design_Patterns_%28book%29">Design Patterns</a></li>
+<li><a href="http://www.springer.com/computer/theoretical+computer+science/book/978-3-642-38122-5">Distributed Algorithms for Message Passing Systems</a></li>
+<li><a href="http://www.amazon.com/Distributed-Algorithms-Nancy-Lynch/dp/0080504701">Distributed Algorithms</a></li>
+<li><a href="http://www.growing-object-oriented-software.com/">Growing Object-Oriented Software</a></li>
+<li><a href="http://learnyousomeerlang.com/">Learn You Some Erlang for Great Good</a></li>
+<li><a href="http://objectsonrails.com/">Objects on Rails</a></li>
+<li><a href="http://www.amazon.com/Writing-Well-30th-Anniversary-Edition/dp/0060891548">On Writing Well</a></li>
+<li><a href="http://pragprog.com/book/dnvim/practical-vim">Practical Vim</a></li>
+<li><a href="http://pragprog.com/book/jaerlang2/programming-erlang">Programming Erlang</a></li>
+<li><a href="http://www.nostarch.com/rum">Ruby Under a Microscope</a></li>
+<li><a href="http://pragprog.com/book/pb7con/seven-concurrency-models-in-seven-weeks">Seven Concurrency Models in Seven Weeks</a></li>
+<li><a href="http://pragprog.com/book/rwdata/seven-databases-in-seven-weeks">Seven Databases in Seven Weeks</a></li>
+<li><a href="http://www.jkp.com/catalogue/book/9781849059213">The Complete Guide to Getting a Job for People with Asperger&#39;s Syndrome</a></li>
+<li><a href="http://pragprog.com/book/hwcuc/the-cucumber-book">The Cucumber Book</a></li>
+<li><a href="http://www.amazon.com/UML-Distilled-Standard-Modeling-Language/dp/0321193687">UML Distilled</a></li>
+</ul>
diff --git a/website/content/posts/2014/01/of-orcs-and-software-craftsmanship.md b/website/content/posts/2014/01/of-orcs-and-software-craftsmanship.md
new file mode 100644
index 0000000..a6f00b1
--- /dev/null
+++ b/website/content/posts/2014/01/of-orcs-and-software-craftsmanship.md
@@ -0,0 +1,25 @@
++++
+title = "Of Orcs and Software Craftsmanship"
+type = "link"
+tags = [ "craftsmanship","development" ]
+description = "Taming the beast that is XML with XPath."
+date = "2014-01-27"
+external = "http://odetocode.com/blogs/scott/archive/2014/01/27/of-orcs-and-software-craftsmanship.aspx"
+slug = "of-orcs-and-software-craftsmanship"
++++
+
+<blockquote>
+<p>Except, the real XML isn’t like the XML listed here.</p>
+
+<p>XML OrcsThe XML listed here is like an orc in an animated Disney movie. It has a funny pink nose and buck teeth making it look more vulnerable than dangerous.</p>
+
+<p>The real XML is like an orc in a movie derived from a J.R.R Tolkien novel. It is ugly, angry, and nearly incomprehensible when communicating. Its creator is a Standards Committee committed to enslaving humans, elves, software developers, and dwarves. It is also just one orc in an army of repugnant orcs that cover a small continent.</p>
+</blockquote>
+
+<p><a href="http://odetocode.com/blogs/scott/archive/2014/01/27/of-orcs-and-software-craftsmanship.aspx">This post</a> provides a humorous look at XML parsing and demonstrates the power that comes with approaching problems as a <a href="http://en.wikipedia.org/wiki/Software_craftsmanship">craftsman</a>.</p>
+
+<blockquote>
+<p>These are the types of error messages that make debugging a software like debugging a 2 month old baby.</p>
+</blockquote>
+
+<p>Unsurprisingly, Ruby has an even friendlier tool for XML parsing - <a href="http://nokogiri.org/">nokogiri</a>.</p>
diff --git a/website/content/posts/2014/02/css-parallax.md b/website/content/posts/2014/02/css-parallax.md
new file mode 100644
index 0000000..b42922e
--- /dev/null
+++ b/website/content/posts/2014/02/css-parallax.md
@@ -0,0 +1,122 @@
++++
+title = "CSS Parallax"
+type = "article"
+tags = [ "CSS","Web Design" ]
+description = "Mimicking parallax on web sites with CSS."
+date = "2014-02-24"
+slug = "css-parallax"
++++
+
+<p>In order to create a more compelling product, many companies are looking for ways to make their user interfaces more natural.
+Depth makes interfaces feel more realistic by mimicking the physics of their analog counterpart.
+Apple recently <a href="http://www.wired.com/wiredscience/2013/09/parallax-and-the-ios-7-wallpaper/">added this technique</a> in iOS 7.
+When a user tilts their phone while looking at the home screen the app icons move relative to the background, creating the illusion that they are floating above the background.</p>
+
+<p>Parallax is the phenomenon whereby objects appear to have different relative positions when observed from different view points.
+Consider the following diagram.</p>
+
+<p><img src="/media/parallax_diagram.png" alt="parallax diagram"></p>
+
+<p>When observing the scene from viewpoint 1 it appears that the atomic object logo is in front of the white box.
+And when the observer moves to viewpoint 2 it appears that the logo is now in front of the red box.</p>
+
+<p>There are many consequences of parallax.
+I was first introduced to the concept of parallax in a physics class when discussing experimental validation.
+Parallax is a common source of error in measurement and alignment.
+For instance, when measuring the length of an object you must look straight at the ruler, otherwise the object may appear to be longer or shorter than it actually is.</p>
+
+<p>Parallax affects nearby objects greater than distant objects.
+The relationship with distance is one component of <a href="http://en.wikipedia.org/wiki/Stereoscopy">depth perception</a>.
+Therefore we can create the illusion of depth by moving objects which are closer to the observer faster than those further away.</p>
+
+<p>We can achieve the parallax effect on web pages with CSS.
+As an example we will use three <code>div</code>s layered on top of each other, similar to a diorama.
+Each <code>div</code> will have a background image - corresponding to the layers in the scene.</p>
+
+<p>Two key CSS properties are required for parallax: <a href="http://www.w3.org/TR/CSS2/colors.html#propdef-background-position"><code>background-position</code></a> and <a href="http://www.w3.org/TR/CSS2/colors.html#propdef-background-repeat"><code>background-repeat</code></a>.</p>
+
+<p><img src="/media/background_position.png" alt="background-position example"></p>
+
+<p><code>background-position</code> defines the starting point for the background image.
+We want the starting position to be relative to the width of the container, thus we will use <code>%</code> as the unit for <code>background-position</code>.
+The value chosen corresponds to the distance from the left of the container as shown in the previous figure.</p>
+
+<p><img src="/media/background_repeat.png" alt="background-repeat example"></p>
+
+<p><code>background-repeat</code> defines the direction in which the image will be tiled.
+Two options for this property are <code>repeat-x</code> and <code>repeat-y</code>.
+<code>repeat-y</code> tiles the image vertically, while <code>repeat-x</code> tiles horizontally.
+We will use <code>repeat-x</code> so that the image fills the entire container without stretching regardless of the width.</p>
+
+<h2>Demo</h2>
+
+<p>Imagine a new surf shack opening up at Anchor Bay.
+As part of their preparations for opening day this summer they have hired you to design their website.
+To inspire potential customers you have decided to add parallax waves in the header.
+When the window is resized the waves will shift.
+Below is the source code and example of the prototype.
+A modifiable version of this demo is available on <a href="http://jsfiddle.net/spWvb/">JSFiddle</a></p>
+
+<iframe srcdoc="<div style=&quot;width:100%; height:200px; background:#E4F7FE;&quot;> <div style=&quot;position: fixed; left:0; width: 100%; height: 200px; background-repeat: repeat-x; background-position: 90%; background-image: url(data:image/png;base64,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);&quot;></div> <div style=&quot;position: fixed; left:0; width:100%; height: 200px; background-repeat: repeat-x; background-position:60%; background-image: url(data:image/png;base64,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);&quot;></div> <div style=&quot;position: fixed; left:0; width:100%; height: 200px; background-repeat: repeat-x; background-position:40%; background-image: url(data:image/png;base64,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);&quot;></div> </div>" width="100%" style="border:none; background-color:#E4F7FE" scrolling="no" height="200px"></iframe>
+
+<pre><code>&lt;!doctype html&gt;
+&lt;html&gt;
+ &lt;head&gt;
+ &lt;style&gt;
+ body {
+ background: #E4F7FE;
+ }
+ .wave {
+ position: fixed;
+ left: 0;
+ width: 100%;
+ height: 200px;
+ background-repeat: repeat-x;
+ }
+ .back {
+ background-image: url(data:image/png;base64,iVBORw0K...);
+ background-position: 90%;
+ }
+ .middle {
+ background-image: url(data:image/png;base64,iVBOR/wD...);
+ background-position: 60%;
+ }
+ .front {
+ background-image: url(data:image/png;base64,iVBORw0K...);
+ background-position: 40%;
+ }
+ &lt;/style&gt;
+ &lt;/head&gt;
+ &lt;body&gt;
+ &lt;div class=&quot;wave back&quot;&gt;&lt;/div&gt;
+ &lt;div class=&quot;wave middle&quot;&gt;&lt;/div&gt;
+ &lt;div class=&quot;wave front&quot;&gt;&lt;/div&gt;
+ &lt;/body&gt;
+&lt;/html&gt;
+</code></pre>
+
+<h2>Customization</h2>
+
+<p>Now that you understand the basic mechanics there are many ways to customize the parallax.
+You can use negative percentages to create a larger range of motion.
+Negative percentages can also be used to select the layer of the scene which is the focus.</p>
+
+<p>Another customization aspect is the triggering mechanism.
+The example uses window resizing to drive the change.
+You can use scrolling as the trigger - use <code>repeat-y</code> instead of <code>repeat-x</code>.
+You can also use JavaScript to dynamically resize the container
+As the container is resizing the user will see the parallax.</p>
+
+<p>While this example attempts to mimic the behavior of physical objects, the implementation is not bound by the laws of physics.
+Therefore the techniques demonstrated can be stretched for interesting visual effects.
+For inspiration take a look at the following links.</p>
+
+<ul>
+<li><a href="http://silverbackapp.com/">http://silverbackapp.com</a></li>
+<li><a href="http://css-tricks.com/parallax-background-css3/">http://css-tricks.com/parallax-background-css3/</a></li>
+<li><a href="http://www.arnoldclark.com/challenge/">http://www.arnoldclark.com/challenge/</a></li>
+</ul>
+
+<p>Whether designing a website or choosing a seat parallax is a valuable concept.</p>
+
+<iframe class="yt-frame" width="560" height="315" src="//www.youtube.com/embed/vvk_M75y2Cs" frameborder="0" allowfullscreen></iframe>
diff --git a/website/content/posts/2014/02/stack-exchange.md b/website/content/posts/2014/02/stack-exchange.md
new file mode 100644
index 0000000..4e359fd
--- /dev/null
+++ b/website/content/posts/2014/02/stack-exchange.md
@@ -0,0 +1,49 @@
++++
+title = "Stack Exchange"
+type = "article"
+tags = [ "editorial" ]
+description = "A discussion of my first truly satisfying experience with the Stack Exchange Network."
+date = "2014-02-07"
+slug = "stack-exchange"
++++
+
+<p><img src="/media/stack_exchange_logo.png" alt="stack exchange logo"></p>
+
+<p>Stack Exchange provides a plethora of question and answer websites each targeted at a specific domain.
+It originally started with three technology focused sites, <a href="http://stackoverflow.com/">Stack Overflow</a>, <a href="http://serverfault.com/">Server Fault</a>, and <a href="http://superuser.com/">Super User</a>.
+The network has since expanded to 114 different sites (as of February 2014).</p>
+
+<p><a href="http://stackoverflow.com/users/2643733/casey-robinson">I</a> have been a member of the network for over three years.
+My interest has grown and shrunk over the years.
+At first I was excited to answer questions and I had a few successes, but mostly duds.
+Then I transitioned to janitorial duty, flagging questions which should be removed.
+The reasons vary, usually duplicates, nonsensical, or wrong site.
+I faired much better here as every one of my flags was marked as helpful and the corresponding question was closed/migrated.
+Eventually I grew bored and focused on writing software.</p>
+
+<p>Throughout the development process I would consistently run across Stack Overflow answers in my searches.
+I would upvote the most helpful answers, but otherwise passively benefited from other&#39;s work.
+So far none of my experiences have deterred me from future participation, but they also have not motivated me to contribute more.</p>
+
+<p>On July 20th 2013 I <a href="http://unix.stackexchange.com/questions/83724/multi-function-capslock-without-x/111435?noredirect=1#comment176481_111435">asked a question</a> that would result in my first truly satisfying experience with Stack Exchange.
+I was installing <a href="https://www.archlinux.org/">arch linux</a> on an old netbook that as lying around the house.
+The goal was to use it for note taking and text editing.
+I decided to avoid X and GUIs since the limited use case and minimal performance led to poor experiences in the past.
+The problem was that I have been accustomed to custom key mappings, specifically with the caps lock key as discussed by <a href="http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#controlescape">Steve Losh</a>.</p>
+
+<p>After exploring the obvious solutions - console keymaps, loadkeys, showkey - I was stuck.
+I could change caps lock to either escape or control, but not both.
+I asked some of my coworkers and they also had no suggestions, so I went to Stack Exchange.
+Immediately the post was edited for grammar and tags.
+There were even some questions about my setup and to better understand my needs.
+But after two days the comments stopped with no answer in sight.
+So I gave up and just carried around my heavy Mac Book Pro</p>
+
+<p>Then, on January 27th <a href="http://unix.stackexchange.com/users/57734/hoosieree">another user</a> had the exact same problem and placed a bounty on my question.
+This activity spurred others to dig deeper for a solution, including writing a <a href="http://unix.stackexchange.com/users/57734/hoosieree">program - keymod</a> - to experiment with remappings.
+The keymod program is a fascinating solution - intercepting key press events and rewriting or forwarding to the kernel.
+But that is not the point.
+I downloaded and tested keymod.
+It solved my problem perfectly.</p>
+
+<p>So after six months I had a solution and my first satisfying experience with Stack Exchange.</p>
diff --git a/website/content/posts/2014/02/vim-macros.md b/website/content/posts/2014/02/vim-macros.md
new file mode 100644
index 0000000..8c322ff
--- /dev/null
+++ b/website/content/posts/2014/02/vim-macros.md
@@ -0,0 +1,88 @@
++++
+title = "Vim Macros"
+type = "article"
+tags = [ "vim" ]
+description = "Primer on vim macro recording, playback, and editing."
+date = "2014-02-27"
+slug = "vim-macros"
++++
+
+<p>Suppose that you would like to add anchors to a blog post which allow readers to link to specific sections.
+This is a tedious task and therefore a candidate for automation.
+However, automation would require defining a mapping between arbitrary header strings and urls; a task much simpler for the post author than a program.
+So the goal is to automate the easy things (moving around the document and inserting common characters).</p>
+
+<p><img alt="vim logo" src="/media/vimlogo.png" class="alignright"/>
+As an example we will look at one of my previous posts, <a href="/posts/2013/11/tool-sharpening.html">Tool Sharpening</a>.
+The raw content which I will be working with is available on <a href="http://src.rampantmonkey.com/rampantmonkey_content/tree/content/posts/2013/11/tool-sharpening.md">GitHub</a>.
+I plan to add an <code>id</code> attribute corresponding to the section title to each heading (<code>&lt;h1&gt;</code> - <code>&lt;h6&gt;</code>)tag in the post.
+After the tag is found and the common text is inserted we want to leave the cursor in the correct position to manually enter the desired link.</p>
+
+<p>For this task we are going to use my favorite text editor, <a href="http://www.vim.org/">vim</a>.
+Vim has many commands which make it a powerful text editor and macros specifically address the problem at hand.
+Macros provide a way to repeat a sequence of commands thus avoiding tedious editing tasks.
+The basic workflow for using macros has two steps: record and playback.</p>
+
+<h2>Record</h2>
+
+<p>To begin recording a macro press <code>qR</code> where <code>R</code> is a lowercase Latin character, or if you prefer regular expressions <code>[a-z]</code>.
+Once recording has started <em>every</em> keystroke is saved into the chosen register (<code>R</code>).
+To stop recording return to normal mode and press <code>q</code>.</p>
+
+<p>For this example we will use register <code>a</code>.
+Let&#39;s start with the simplest case, a single word title which is on line <code>31</code>.
+Move to line <code>31</code> (<code>31gg</code>) and make sure to be in normal mode.
+Begin the recording, <code>qa</code>.
+First step is to move to a common position - the start of the line - <code>0</code>.
+Next we want to insert the text <code>id=&quot;#&quot;</code> inside of the <code>h2</code> tag.
+So move to the first <code>&gt;</code> - <code>f&gt;</code>.
+Then enter insert mode (<code>i</code>), type the desired text (<code>id=&quot;#&quot;</code>), and return to normal mode (<code>ESC</code>).
+Finally we want to position the cursor in position to prepare for inserting the desired link (<code>T#</code>).
+Now we can finish recording by pressing <code>q</code>.</p>
+
+<h2>Playback</h2>
+
+<p>Now that you have recorded a macro it can be played back with <code>@R</code>.
+Vim will read through each character in the register and interpret it as if you typed it.</p>
+
+<h2>Editing</h2>
+
+<p>Up until now we have used macros without any visibility.
+Suppose that by playing the macro on a line where the header tag is not the first tag.
+Our macro would fail since it looks for the first <code>&gt;</code>.
+What we are really looking for is the first <code>&gt;</code> which ends a header tag.</p>
+
+<p>We know that the rest of the macro correctly edits the line.
+The only error is finding the initial starting point.
+Based on the techniques discussed so far the only option is to re-record the macro with our desired change.
+This works, but is inefficient and introduces the opportunity to make a different mistake.
+A better option would be to edit the macro directly.</p>
+
+<p>This will have three steps: paste, edit, and yank.</p>
+
+<p>In order to paste the contents of the register we can use <code>p</code>.
+The syntax in vim for accessing a register is <code>&quot;R</code>.
+So for our example we can use the following to paste the macro into the current buffer (<code>&quot;ap</code>).
+Let&#39;s see what our register contains - <code>0f&gt;i id=&quot;#&quot;^[T#</code>.</p>
+
+<p>It may look like hieroglyphics, but if you look closely those are the exact keys we pressed while recording the macro.
+Now that we have the register contents we can edit it with all the same commands as an ordinary file.
+It is just a string of characters after all.</p>
+
+<p>The edit is up to you.
+For our example we can insert <code>/&lt;h^M</code> in between <code>0</code> and <code>f</code>.</p>
+
+<p>Once the command is satisfactory we need to store it back into the register.
+<code>0&quot;Ry$</code></p>
+
+<p>Now we can retry the macro and verify that it now works as originally intended.</p>
+
+<h2>Commentary</h2>
+
+<p>Vim macros trigger the same circuits in my brain as metaprogramming.
+They also have the same costs and benefits - simple to inject functionality not originally designed but difficult to interpret and anticipate all of the consequences.
+While macros are not always the correct solution (see <code>:h filter</code> and a recent <a href="http://vimcasts.org/episodes/using-external-filter-commands-to-reformat-html/">vimcast</a>), they are often an effective tool.</p>
+
+<h2>More Information</h2>
+
+<p>For more information see <code>:help complex-repeat</code></p>
diff --git a/website/content/posts/2014/03/ffmpeg-clip-extraction.md b/website/content/posts/2014/03/ffmpeg-clip-extraction.md
new file mode 100644
index 0000000..424f650
--- /dev/null
+++ b/website/content/posts/2014/03/ffmpeg-clip-extraction.md
@@ -0,0 +1,19 @@
++++
+title = "FFmpeg Clip Extraction"
+type = "article"
+tags = [ "FFmpeg" ]
+description = "Simple command that I always forget."
+date = "2014-03-31"
+slug = "ffmpeg-clip-extraction"
++++
+
+<p><a href="http://www.ffmpeg.org/">FFmpeg</a> is my swiss army knife for video manipulation.
+Since there are so many options I find it difficult to remember the syntax.
+The most common function I use is extracting a clip.
+So here it is.</p>
+
+<pre><code>ffmpeg -i input.mp4 -ss [hh:mm:ss.x] -t [hh:mm::ss.x] -c copy output.mp4
+</code></pre>
+
+<p>The first time (<code>-ss</code>) is the start time and the second (<code>-t</code>) is the duration.
+Now I won&#39;t have to rely on Google or man pages.</p>
diff --git a/website/content/posts/2014/05/no-more-frameworks.md b/website/content/posts/2014/05/no-more-frameworks.md
new file mode 100644
index 0000000..0ea6f76
--- /dev/null
+++ b/website/content/posts/2014/05/no-more-frameworks.md
@@ -0,0 +1,15 @@
++++
+title = "No More Frameworks"
+type = "link"
+tags = [ "development" ]
+description = "Requiring complete buy-in inherently limits the successfulness of a framework."
+date = "2014-05-14"
+external = "http://bitworking.org/news/2014/05/zero_framework_manifesto"
+slug = "no-more-frameworks"
++++
+
+<blockquote>
+<p>A framework is like an iceberg, that 10% floating above the water doesn&#39;t look dangerous, it&#39;s the hidden 90% that will eventually get you. Actually it&#39;s even more apt than that, learning a framework is like mapping an iceberg, in order to use the framework you need to learn the whole thing, apply the effort of mapping out the entire thing, and in the long run the process is pointless because the iceberg is going to melt anyway.</p>
+</blockquote>
+
+<p>That quote perfectly sums up my feelings about frameworks. They require complete buy-in in order to reap the productivity benefits of said framework. Frameworks have a massive influence on program design, structure, and features. So much so that people confuse frameworks with languages e.g. Ruby and Rails.</p>
diff --git a/website/content/posts/2014/05/pokemon-capture-mechanics.md b/website/content/posts/2014/05/pokemon-capture-mechanics.md
new file mode 100644
index 0000000..9ac307f
--- /dev/null
+++ b/website/content/posts/2014/05/pokemon-capture-mechanics.md
@@ -0,0 +1,18 @@
++++
+title = "Pokemon Capture Mechanics"
+type = "link"
+tags = [ "Pokemon","algorithms" ]
+description = "Flow chart describing the capture algorithm for Pokémon Blue, Red, and Yellow."
+date = "2014-05-13"
+external = "http://www.dragonflycave.com/rbycapture.aspx"
+slug = "pokemon-capture-mechanics"
++++
+
+<p>Last year on her <a href="http://www.dragonflycave.com">website</a>, Hlín published an <a href="http://www.dragonflycave.com/rbycapture.aspx">article</a> exploring the algorithm behind capturing Pokemon in the <a href="http://bulbapedia.bulbagarden.net/wiki/Generation_I">first generation</a> of games. Later games have a vastly different capture algorithm based on a straightforward formula. This version is much more complex. So much so, that I had to create a flow chart to understand the process. This post is the result of my work.</p>
+
+<p>Here are the files:
+<a href="/media/pokemon-capture-algorithm-flow-chart.dot">dot</a>
+<a href="/media/pokemon-capture-algorithm-flow-chart.png">png</a>
+<a href="/media/pokemon-capture-algorithm-flow-chart.svg">svg</a></p>
+
+<p><img src="/media/pokemon-capture-algorithm-flow-chart-downsized.png" alt="capture algorithm flow chart"></p>
diff --git a/website/content/posts/2014/05/ruby-strtok.md b/website/content/posts/2014/05/ruby-strtok.md
new file mode 100644
index 0000000..1f8f497
--- /dev/null
+++ b/website/content/posts/2014/05/ruby-strtok.md
@@ -0,0 +1,54 @@
++++
+title = "Ruby strtok()"
+type = "article"
+tags = [ "ruby" ]
+description = "Imitating a common idiom from C in Ruby."
+date = "2014-05-04"
+slug = "ruby-strtok"
++++
+
+<p>When developing <a href="https://github.com/rampantmonkey/harmony">harmony</a> I needed to develop a method for splitting the CSS files into meaningful chunks.
+These &#39;meaningful&#39; chunks should be the sequence of characters which have semantic value in the CSS specification such as keywords (<code>em</code>, <code>border</code>), selectors(<code>div</code>, <code>p + p</code>), and property values(<code>bold</code>, <code>#773e1a</code>).</p>
+
+<p>C provides a function specifically crafted for this occasion - <code>strtok()</code>.
+<code>strtok()</code> is defined in the <a href="http://pubs.opengroup.org/onlinepubs/009695299/functions/strtok.html">ISO C</a> standard and available in may C based languages (<a href="http://en.cppreference.com/w/cpp/string/byte/strtok">C++</a>, <a href="http://www.php.net/manual/en/function.strtok.php">PHP</a>, and <a href="http://www.mathworks.com/help/matlab/ref/strtok.html">Matlab</a>).
+<code>strtok()</code> is a function which splits strings into tokens based on a set of delimeters.
+A string passed into <code>strtok()</code> is divided into an array of tokens which contain the characters in between one or more delimiters.
+Here is a simplified example (in C) of the tokenizer to demonstrate <code>strtok()</code>.</p>
+
+<pre><code>#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+
+#define DELIM &quot;{}:; &quot;
+
+int main (int argc, char **argv) {
+ char str_to_tokenize[] = &quot;p { font-size: 1.4em; font-weight: bold }&quot;;
+ char *str_ptr;
+
+ fprintf(stdout, &quot;Split \&quot;%s\&quot; into tokens:\n&quot;, str_to_tokenize);
+
+ str_ptr = strtok(str_to_tokenize, DELIM);
+ for(; str_ptr != NULL;) {
+ fprintf(stdout, &quot;%s\n&quot;, str_ptr);
+ str_ptr = strtok(NULL, DELIM);
+ }
+
+ return 0;
+}
+</code></pre>
+
+<p>Ruby does not provide an interface to <code>strtok()</code>.
+However, the <code>String#split</code> method can perform the same task with more flexibility.
+<code>split</code> takes one parameter, the delimiter which can be either a character or a regular expression.
+Below is the Ruby version of the same example.</p>
+
+<pre><code>DELIM = /[{}:;]+/
+str_to_tokenize = &quot;p { font-size: 1.4em; font-weight: bold }&quot;
+puts str_to_tokenize.split(DELIM)
+</code></pre>
+
+<p>Since we are using a regular expression to define the delimiter we can include additional functionality.
+For example, to simplify harmony&#39;s parser I opted to collect the delimiter that was found between each token.
+This tweak only required two additional characters <code>DELIM = /([{}:;]+)/</code>.</p>
+
+<p>By using regular expressions with <code>String#split</code> we can duplicate the behavior of <code>strtok()</code>.</p>
diff --git a/website/content/posts/2014/06/quit-school.md b/website/content/posts/2014/06/quit-school.md
new file mode 100644
index 0000000..a971cb1
--- /dev/null
+++ b/website/content/posts/2014/06/quit-school.md
@@ -0,0 +1,15 @@
++++
+title = "Quit School"
+type = "article"
+tags = [ "Life" ]
+description = "Leaving grad school to pursue software development career."
+date = "2014-06-11"
+slug = "quit-school"
++++
+
+
+<p>After eight years of college I have decided to quit school.
+I appreciate the opportunities and freedom of academic life but the time has come to begin my career.
+I will be living in <a href="http://en.wikipedia.org/wiki/Reston,_Virginia">Reston, VA</a> and working as a software developer writing the customer portal for <a href="https://www.witopia.net/">WiTopia Inc</a>.</p>
+
+<p>Now I guess I can start paying back my student loans.</p>
diff --git a/website/content/posts/2014/08/first-experience-with-salt.md b/website/content/posts/2014/08/first-experience-with-salt.md
new file mode 100644
index 0000000..8bbd41b
--- /dev/null
+++ b/website/content/posts/2014/08/first-experience-with-salt.md
@@ -0,0 +1,116 @@
++++
+title = "First Experience with Salt"
+type = "article"
+tags = [ "saltstack","cgit" ]
+description = "Using SaltStack to set up a git web server automatically."
+date = "2014-08-03"
+slug = "first-experience-with-salt"
++++
+
+
+<p>For all of my personal projects deployment is always a nightmare.
+I get wrapped up in building something exciting and I forget that it will need to run elsewhere.
+When I get to the point that I&#39;m ready to share my creation with the world I set aside a weekend for deployment.
+My deployment is always a tedious and error-prone slog.
+A vast majority of that time is untangling the mess I created last time.
+I have decided that it is time to find a better solution.</p>
+
+<p>This is a common problem and there are many solutions.
+The myriad of choices is also part of the reason I have waited so long to dive in.
+In the past I have investigated some solutions: custom bash scripts, <a href="https://github.com/opscode/chef">Chef</a>, and <a href="http://puppetlabs.com/">Puppet</a>.
+None of these solutions felt natural.
+The bash scripts simplified the archaeological portion of my deployments, but were still ad hoc and incomplete.
+Chef is difficult to get started with since the first step is &#39;install a server&#39; (or even worse, pay us for one.
+Puppet and Chef also offer enterprise editions which creates an uncomfortable (and often ambiguous) dichotomy in features, documentation, and community.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
+
+<p>The next tool on my list is <a href="http://www.saltstack.com/">Salt</a>.
+Salt has technical and social advantages over the previous tools.
+Chef and Puppet try to abstract away the distributed nature of the environment, similar effect to running commands over ssh.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup>
+Salt uses a master/minion<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup> paradigm and <a href="http://zeromq.org/">0mq</a> to handle communication asynchronously.
+The asynchronous message queue and processes running on each node allow for faster deploys without relying on hacks like <a href="https://code.google.com/p/parallel-ssh/">parallel-ssh</a>.
+Salt is also completely open source not just &#39;open core&#39;.
+This choice has helped grow the developer/user community and is a significant reason I am learning it.</p>
+
+<p>My first project with salt is to deploy a git server with a web interface.
+I have been running GitLab for 2 years.
+It works, but I do not need many of the features (users &amp; permissions, wiki, task management, ...) so I have been on the lookout for a new tool.<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup>
+After some experimentation on my local system I have decided to use <a href="http://git.zx2c4.com/cgit/">cgit</a><sup id="fnref5"><a href="#fn5" rel="footnote">5</a></sup> with <a href="http://nginx.org/">nginx</a> and <a href="https://www.archlinux.org/">Arch Linux</a>.</p>
+
+<p>Installing all of the necessary packages was simple enough thanks to Arch&#39;s excellent package manager <a href="https://www.archlinux.org/pacman/">pacman</a>.
+One additional package is necessary for this setup, fcgiwrapper, a bridge between nginx and cgit.
+Specifically the service that it provides to manage a socket that cgit and nginx use for communication.
+One problem, someone decided to name the service <code>fcgiwrapper.socket</code>.
+Why is this a problem?
+Salt uses <code>.</code> as a delimiter for locating functions in states.</p>
+
+<p>Here is the offending <a href="http://salt.readthedocs.org/en/latest/ref/states/">sls</a> file:</p>
+
+<pre><code>fcgiwrap:
+ pkg:
+ - installed
+ require:
+ - pkg: nginx
+ service:
+ - name: fcgiwrap.socket
+ - enable: True
+ - running: True
+</code></pre>
+
+<p>This is the error produced by running <code>salt \* state.highstate</code>:</p>
+
+<pre><code>srctest05:
+
+ Data failed to compile:
+ ----------
+ No function declared in state &quot;service&quot; in sls fcgiwrap
+</code></pre>
+
+<p>Solution: convince salt to eat up a period before hitting the service&#39;s name attribute.
+This solution works because Salt&#39;s parser only interprets the first period, passing the rest through unaltered.</p>
+
+<p>Here is the corrected file:</p>
+
+<pre><code>fcgiwrap:
+ pkg:
+ - installed
+ require:
+ - pkg: nginx
+ service.running:
+ - name: fcgiwrap.socket
+ - enable: True
+</code></pre>
+
+<p>After this tweak I am now able to repeatably and automatically deploy cgit to an Arch Linux machine.
+Thanks to retrospek in the <a href="http://webchat.freenode.net/?channels=salt">Salt IRC channel</a> for suggesting the fix.<sup id="fnref6"><a href="#fn6" rel="footnote">6</a></sup>
+I look forward to more explorations with salt and interactions with the <a href="http://www.saltstack.com/community/">community</a>.</p>
+
+<div class="footnotes">
+<hr>
+<ol>
+
+<li id="fn1">
+<p>Noah Kantrowitz elegantly explains the sentiment <a href="https://coderanger.net/chef-open-source/">https://coderanger.net/chef-open-source/</a>.&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn2">
+<p><a href="http://www.ansible.com/home">Ansible</a> has a similar, albeit improved, structure to Chef and Puppet.&nbsp;<a href="#fnref2" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn3">
+<p>a.k.a. master/slave for the less sensitive&nbsp;<a href="#fnref3" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn4">
+<p>I am also offended by their decision to switch to a split model (Consumer and Enterprise). The focus on providing enterprise features and partitioning the developer time has deteriorated the quality of the Consumer edition&#39;s documentation and limited external developer contributions. For evidence of the hypocrisy see the contrasting blog posts: <a href="https://about.gitlab.com/2012/10/22/gitlab-3-dot-0-released/">GitLab 3.0 Released</a> and <a href="https://about.gitlab.com/2013/07/22/announcing-gitlab-enterprise-edition/">Announcing GitLab Enterprise Edition</a>.&nbsp;<a href="#fnref4" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn5">
+<p>maintained by Jason Donenfeld, the developer of one of my favorite projects, <a href="http://www.passwordstore.org/">pass</a>.&nbsp;<a href="#fnref5" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn6">
+<p><a href="http://irclog.perlgeek.de/salt/2014-07-18">Salt IRC Log</a> 18 July 2014.&nbsp;<a href="#fnref6" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
diff --git a/website/content/posts/2014/09/coreos-now-available-on-digitalocean.md b/website/content/posts/2014/09/coreos-now-available-on-digitalocean.md
new file mode 100644
index 0000000..19d10e6
--- /dev/null
+++ b/website/content/posts/2014/09/coreos-now-available-on-digitalocean.md
@@ -0,0 +1,13 @@
++++
+title = "CoreOS Now Available On DigitalOcean"
+type = "link"
+tags = [ "coreos","digital ocean" ]
+description = "My new favorite operating system is now supported on my favorite VPS provider!"
+date = "2014-09-05"
+external = "https://www.digitalocean.com/company/blog/coreos-now-available-on-digitalocean/"
+slug = "coreos-now-available-on-digitalocean"
++++
+
+<p>For what seems like ages (the first mention in the forums was over a year ago) Digital Ocean has been working on supporting CoreOS. Today they <a href="https://www.digitalocean.com/company/blog/coreos-now-available-on-digitalocean/">announced</a> official support for the new operating system. I am excited to spend my weekend redeploying my servers!</p>
+
+<p>P.S. I guess this makes up for discontinuing Arch Linux support.</p>
diff --git a/website/content/posts/2014/09/dockerize-fantasy-reality.md b/website/content/posts/2014/09/dockerize-fantasy-reality.md
new file mode 100644
index 0000000..b19657e
--- /dev/null
+++ b/website/content/posts/2014/09/dockerize-fantasy-reality.md
@@ -0,0 +1,183 @@
++++
+title = "Dockerize Fantasy Reality"
+type = "article"
+tags = [ "fantasy reality","docker" ]
+description = "Crafting a generic deployment method for the many incarnations of Fantasy Reality."
+date = "2014-09-03"
+slug = "dockerize-fantasy-reality"
++++
+
+
+<p>For the past six years I have been tracking my family&#39;s predictions for reality tv.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>
+The first version was paper and pencil (with some phone calls and emails thrown in).
+Once my family decided that it was fun I decided to build <a href="http://fantasyreality.org">a website</a> to keep track.
+Fantasy Reality has been my playground for new technologies.
+I have written versions with <a href="http://src.rampantmonkey.com/frphp/">PHP</a>, <a href="http://src.rampantmonkey.com/frapi/">Node.js</a>, <a href="http://src.rampantmonkey.com/fantasy_reality_rails/">Rails</a>, and <a href="http://src.rampantmonkey.com/frapi-ruby/">Sinatra</a>.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup></p>
+
+<p>Since there is always a new technology stack deployments are a nightmare.
+I usually dedicate a weekend to futzing around with a VPS on Digital Ocean before the new tv season.
+This chaotic process works but is stressful and time consuming.
+So this fall, instead of creating a new version<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup>, I focused on deployment.</p>
+
+<p>The goal was to find a generic deployment method that support whatever programming language / technology stack I choose to use.
+I experimented with Chef and Salt<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup> before settling on <a href="https://docker.com/">Docker</a>.
+Docker was inspired by the shipping industry, where everything is packed into a standard size container.<sup id="fnref5"><a href="#fn5" rel="footnote">5</a></sup>
+The container is a elegant concept that provides a clear boundary separating responsibility.
+Inside the container an application can do whatever the developer wants.
+While from the outside all of the containers function the same and can be deployed, linked, and scheduled independently from their internal mechanics.</p>
+
+<h2>Architecture</h2>
+
+<p>Now that we got the introduction out of the way, let&#39;s take a look at the architecture for Fantasy Reality.</p>
+
+<p><img src="/media/fr_docker_arch.png" alt="Architecture Overview"></p>
+
+<p>I am using a VPS at Digital Ocean<sup id="fnref6"><a href="#fn6" rel="footnote">6</a></sup> as the base infrastructure.
+Since there are only a handful of users I am able to get away with a single 512 MB instance.
+Fantasy Reality uses three docker containers: a proxy, an application server, and a data container.</p>
+
+<h3>Proxy Server</h3>
+
+<p>The role of the Proxy server is to send traffic from the publicly accessible port 80 to an available application server.
+The proxy server also filters out malformed requests.
+Since the application server will be deployed with a random port the proxy server will also be responsible for dynamically generating configuration files and restarting itself when a new application server is deployed.</p>
+
+<p>Jason Wilder created an excellent tool <a href="https://registry.hub.docker.com/u/jwilder/nginx-proxy/">nginx-proxy</a> for this exact job and wrote a <a href="http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/">blog post</a> explaining how it works.
+tl;dr it listens to the docker api for new machines and spits out an nginx config with the proper upstream locations defined.
+This is the tool I am currently using for Fantasy Reality, but I left the diagram ambiguous just in case there is an unforeseen issue with nginx-proxy.</p>
+
+<h3>Application Server</h3>
+
+<p>The application server encapsulates ruby, rails, the fantasy reality code repository, and gems.
+This is a wonderful change from using RVM and gemsets.
+The built docker image is available on the <a href="https://registry.hub.docker.com/u/rampantmonkey/fantasyreality/">docker hub</a>.
+The <code>Dockerfile</code> used to generate the image is available on my <a href="http://src.rampantmonkey.com/fantasy_reality_rails/tree/Dockerfile">git repository</a> and a snapshot is included below.</p>
+
+<pre><code># DOCKER-VERSION 1.0.0
+
+FROM rampantmonkey/base-ubuntu:14.04
+MAINTAINER Casey Robinson &lt;casey@rampantmonkey.com&gt;
+
+RUN apt-get update -y
+RUN apt-get install -y -q build-essential sqlite3 libsqlite3-dev
+RUN apt-get install -y -q ruby2.0 ruby2.0-dev git nodejs
+RUN ln -fs /usr/bin/ruby2.0 /usr/bin/ruby
+RUN ln -fs /usr/bin/gem2.0 /usr/bin/gem
+
+RUN gem install bundler
+
+ENV RAILS_ENV production
+ENV RACK_ENV production
+
+ADD . /var/fr
+RUN cd /var/fr &amp;&amp; bundle install
+
+EXPOSE 9292
+
+WORKDIR /var/fr
+
+ENTRYPOINT [&quot;bundle&quot;, &quot;exec&quot;, &quot;rackup&quot;]
+</code></pre>
+
+<h3>Database Volume</h3>
+
+<p>The database volume is a container that encapsulates a directory tree and exposes it to other containers.
+This level of indirection allows the application server container to be portable and ignore backups and file system intricacies.
+One trick that I learned is how to backup and restore the database.
+The goal is to build a container that acts as a bridge between the database volume and the local file system.
+Create a new container with <code>--volumes-from</code> the database volume and a second volume, <code>-v /tmp/bridge:/bkup</code>, that maps to a local directory.
+Here are the scripts that I use for this process.<sup id="fnref7"><a href="#fn7" rel="footnote">7</a></sup></p>
+
+<pre><code>deploy@fantasyreality:~# cat backup.sh
+#!/bin/bash
+set -e
+name=&quot;$(date +%Y%m%d_%H%M%S).sqlite3&quot;
+docker run --volumes-from=frdata --volume=&quot;/tmp/bridge:/bkup&quot; --rm=true --tty=false rampantmonkey/base-ubuntu cp /var/db/production.sqlite3 /bkup/&quot;$name&quot;
+</code></pre>
+
+<!-- separate codeblocks -->
+
+<pre><code>deploy@fantasyreality:~# cat restore.sh
+#!/bin/bash
+set -e
+name=&quot;$1&quot;
+docker run --volumes-from=frdata --volume=&quot;/tmp/bridge:/bkup&quot; --rm=true --tty=false rampantmonkey/base-ubuntu cp &quot;/bkup/$1&quot; /var/db/production.sqlite3
+</code></pre>
+
+<h2>Startup</h2>
+
+<p>Now that we have all of the pieces we need a method for reliably starting all of the containers.
+The orchestration of docker containers is an unsolved problem with many attempts at solutions.
+Fortunately Fantasy Reality only requires one machine so we can use a simple bash script.</p>
+
+<pre><code>deploy@fantasyreality:~# cat spinup.sh
+#!/bin/bash
+set -e
+
+docker run --name=proxy --detach=true --publish=80:80 --volume=/var/run/docker.sock:/tmp/docker.sock --tty=false jwilder/nginx-proxy
+docker run --name=frdata --volume=/var/db --detach=true rampantmonkey/base-ubuntu true
+docker run --volumes-from=frdata --detach=true --env=VIRTUAL_HOST=fantasyreality.org --publish-all=true --tty=false rampantmonkey/fantasyreality
+</code></pre>
+
+<h2>Update</h2>
+
+<p>Docker containers are composed of read-only file system layers (<a href="http://docker.readthedocs.org/en/v0.5.3/terms/image/">images</a> in Docker parlance).
+Thus, to deploy an update we have to start a new container and destroy the old one.
+The following script does that for fantasy reality</p>
+
+<pre><code>deploy@fantasyreality:~# cat update.sh
+#!/bin/bash
+
+docker pull rampantmonkey/fantasyreality
+old_container_id=$(docker ps | grep 9292/tcp | head -n 1 | awk &#39;{print $1}&#39;)
+docker run --volumes-from=frdata --detach=true --env=VIRTUAL_HOST=fantasyreality.org --publish-all=true --tty=false rampantmonkey/fantasyreality
+docker stop &quot;$old_container_id&quot;
+docker rm &quot;$old_container_id&quot;
+</code></pre>
+
+<h2>Future improvements</h2>
+
+<p>This setup works better than anticipated.
+There are a few improvements I would like implement.</p>
+
+<ul>
+<li>automatic container orchestration (beyond my rudimentary shell scripts)</li>
+<li>backup database dump to different system</li>
+<li>stats (including resource usage) tracking</li>
+<li>log aggregation</li>
+</ul>
+
+<div class="footnotes">
+<hr>
+<ol>
+
+<li id="fn1">
+<p>Mostly The Amazing Race and Survivor.&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn2">
+<p>Rails is the current implementation, but be on the lookout for a golang implementation.&nbsp;<a href="#fnref2" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn3">
+<p>I did upgrade from Rails 3 to Rails 4.1 and add support for touch devices.&nbsp;<a href="#fnref3" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn4">
+<p>Chef is out, but I still am considering Salt for container orchestration (should be a whole other blog post).&nbsp;<a href="#fnref4" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn5">
+<p><a href="http://en.wikipedia.org/wiki/The_Box:_How_the_Shipping_Container_Made_the_World_Smaller_and_the_World_Economy_Bigger">The Box</a>&nbsp;<a href="#fnref5" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn6">
+<p>My <a href="https://www.digitalocean.com/?refcode=a29ccac6079a">referral link</a> for Digital Ocean if you are so inclined.&nbsp;<a href="#fnref6" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn7">
+<p>Since I am using sqlite the backup process is just a <code>cp</code>, but a similar approach could work with <code>pgdump</code> or <code>mysql_dump</code>.&nbsp;<a href="#fnref7" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
diff --git a/website/content/posts/2014/10/btrfs-and-hexdump.md b/website/content/posts/2014/10/btrfs-and-hexdump.md
new file mode 100644
index 0000000..39c19fe
--- /dev/null
+++ b/website/content/posts/2014/10/btrfs-and-hexdump.md
@@ -0,0 +1,42 @@
++++
+title = "btrfs and hexdump"
+type = "article"
+tags = [ "btrfs","backup" ]
+description = "Undoing fat-finger rm -rf with hexdump."
+date = "2014-10-01"
+slug = "btrfs-and-hexdump"
++++
+
+
+<p>Today I made a silly mistake.
+I hit tab-complete one too many times and accidentally removed a project instead of a symlink.
+This could have been disastrous but I have backups and remote copies of the code.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>
+Since I was confident with my backup strategy I decided to experiment.
+What if I use <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=hexdump">hexdump</a> to find my files?</p>
+
+<p>Now for an attempt at reverse engineering my thought process.</p>
+
+<pre><code>1. My home directory is stored on a btrfs volume.
+2. btrfs uses copy-on-write.
+3. Therefore my files should still be intact (even if I zeroed out the files).
+4. hexdump can present the raw contents of a file.
+5. Everything in linux is a file.
+6. Use hexdump to display contents of hard drive /dev/sda2
+</code></pre>
+
+<p>Conveniently <a href="https://btrfs.wiki.kernel.org">btrfs</a> stores the filename at the end of a file block (at least for small enough files).
+This made searching trivial, just search for the filename.
+A few rounds of copy and paste later, my project was back.</p>
+
+<p>While hexdump is not the ideal answer for data recovery it works.</p>
+
+<div class="footnotes">
+<hr>
+<ol>
+
+<li id="fn1">
+<p>distributed version control ftw!&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
diff --git a/website/content/posts/2014/10/how-is-competitive-programming-different-from-real-life-programming.md b/website/content/posts/2014/10/how-is-competitive-programming-different-from-real-life-programming.md
new file mode 100644
index 0000000..7fba518
--- /dev/null
+++ b/website/content/posts/2014/10/how-is-competitive-programming-different-from-real-life-programming.md
@@ -0,0 +1,17 @@
++++
+title = "How is competitive programming different from real-life programming?"
+type = "link"
+tags = [ "programming","development" ]
+description = "Metaphor to discuss the difference between programming in real-life and for a competition."
+date = "2014-10-23"
+external = "http://www.quora.com/How-is-competitive-programming-different-from-real-life-programming/answer/Anthony-Moh"
+slug = "how-is-competitive-programming-different-from-real-life-programming"
++++
+
+<blockquote>
+<p>Someone asks you to kill a mountain lion. Anyone but a programmer would be asking “WTF is a MOUNTAIN lion doing in a JUNGLE?!”, but that’s not what you have been trained to do as a programmer. You are here to solve problems, not to question them.</p>
+</blockquote>
+
+<p>In an answer on Quora, Anthony Moh constructs an absurd scenario to highlight the differences between competitive programming and real-life programming.
+The story also works for start-up programming vs established company programming.
+I&#39;ll leave it up to you to decide which is which.</p>
diff --git a/website/content/posts/2014/10/reverse-engineering-star-wars-yoda-stories.md b/website/content/posts/2014/10/reverse-engineering-star-wars-yoda-stories.md
new file mode 100644
index 0000000..c586ba3
--- /dev/null
+++ b/website/content/posts/2014/10/reverse-engineering-star-wars-yoda-stories.md
@@ -0,0 +1,22 @@
++++
+title = "Reverse Engineering Star Wars: Yoda Stories"
+type = "link"
+tags = [ "hacking" ]
+description = "Exploring an unknown data file in search of sprites."
+date = "2014-10-08"
+external = "http://www.zachtronics.com/yoda-stories/"
+slug = "reverse-engineering-star-wars-yoda-stories"
++++
+
+<blockquote>
+<p>Sweet Jesus, it&#39;s a color palette!</p>
+</blockquote>
+
+<p>One of the projects in my operating systems course was to implement a EXT2 file system.
+The file system can be viewed as a structured binary file similar to images, movies, or audio files.
+Video games also often store their data files in a structured binary format.</p>
+
+<p>In his post, Zach Barth explains his his exploration of the data format for a 90&#39;s Star Wars game.
+The ultimate goal is to extract the sprites for each in game object and replace them with modded images.</p>
+
+<p>This post brings back fond memories of building a game boy emulator and presents some basic techniques to discover patterns in data files.</p>
diff --git a/website/content/posts/2014/11/handmade-hero.md b/website/content/posts/2014/11/handmade-hero.md
new file mode 100644
index 0000000..800941e
--- /dev/null
+++ b/website/content/posts/2014/11/handmade-hero.md
@@ -0,0 +1,28 @@
++++
+title = "Handmade Hero"
+type = "article"
+tags = [ "Programming" ]
+description = "An awesome project for anyone interested in game programming or C in general."
+date = "2014-11-26"
+slug = "handmade-hero"
++++
+
+
+<p>Yesterday I stumbled across a project on twitter that fascinated me so I figured that I would share it here.
+<a href="http://handmadehero.org/">Handmade Hero</a> is a quest to build a video game from scratch completely live streamed.
+Building from scratch is how I like to do everything, especially learning.</p>
+
+<p>Handmade Hero <a href="http://www.twitch.tv/handmade_hero">streams live</a> every weekday at 8PM PST<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> and has an archive of all previous sessions on <a href="https://www.youtube.com/user/handmadeheroarchive">youtube</a>. Don&#39;t worry, the project started on 17 Nov 2014 so there are only a handful of episodes currently in the backlog.</p>
+
+<p>Go watch the <a href="https://www.youtube.com/watch?v=A2dxjOjWHxQ">trailer</a> and preorder the game for full access to the source code.</p>
+
+<div class="footnotes">
+<hr>
+<ol>
+
+<li id="fn1">
+<p>Pretty sure it means &#39;Whatever time zone Seattle is in&#39; not strictly PST, but I just quoted from the website.&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
diff --git a/website/content/posts/2014/12/one-time-passwords.md b/website/content/posts/2014/12/one-time-passwords.md
new file mode 100644
index 0000000..e23f973
--- /dev/null
+++ b/website/content/posts/2014/12/one-time-passwords.md
@@ -0,0 +1,106 @@
++++
+title = "One Time Passwords"
+type = "article"
+tags = [ "golang","security" ]
+description = "Releasing version one of my one time password generator"
+date = "2014-12-15"
+slug = "one-time-passwords"
++++
+
+
+<p><a href="http://en.wikipedia.org/wiki/Two_factor_authentication">Two factor authentication</a> has become commonplace amongst the multitude of web services I use on a daily basis.
+The goal of two factor authentication is to increase security by requiring two pieces of information to authorize yourself.
+First you use the traditional username/password combination to establish identity.
+Then you use a second, time sensitive code.
+This code is delivered by text message or generated by using an authenticator application.</p>
+
+<p>To amuse myself, and reduce my dependence on my phone, I decided to implement <a href="http://src.rampantmonkey.com/onetime/">my own one time password generator</a>.
+Of course it will be a command line application implemented in <a href="https://golang.org/">go</a>.
+Let&#39;s look at the most common application - <a href="https://github.com/google/google-authenticator">Google Authenticator</a> - for inspiration.
+This screenshot taken on my iPhone shows three accounts and their respective codes.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>
+Each account has a code and a countdown timer (shown as a circular progress meter).
+The goal: reproduce the same code and same timing for each account.
+<img src="/media/google_authenticator_screenshot.png" alt="google authenticator screenshot"></p>
+
+<p>The first step is to research the algorithm used.
+<a href="http://en.wikipedia.org/wiki/Google_Authenticator">Wikipedia</a> provides a brief overview and a link to the <a href="http://tools.ietf.org/html/rfc6238">RFC (#6238)</a>.
+The algorithm used is called Time OTP, or TOTP.
+TOTP takes one input, a secret string.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup>
+The secret string is then hashed<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup> with the current unix time<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup>.
+The output is then truncated, modded, and padded to return a 6 digit code.
+That covers the criteria for generating a single code.
+What about one for every site?</p>
+
+<p>Run the algorithm multiple times - once for each site.
+Done.
+Well, not quite.
+We want to display the time remaining for each code in place to avoid scrolling.
+The terminal provides a mechanism for this exact scenario - escape codes.</p>
+
+<p><a href="http://en.wikipedia.org/wiki/ANSI_escape_code">Terminal escape codes</a> are a string of characters, from stdout, that are interpreted by the terminal as behavior rather than displayed to the user.
+For example, coloring text can be done with terminal escape codes.
+<code>echo &quot;this is \x1b[0;32mgreen\x1b[0m text&quot;</code><sup id="fnref5"><a href="#fn5" rel="footnote">5</a></sup>
+Aside from color, and more relevant to this project, are the collection of escape codes for moving the cursor and clearing text.
+Two are of particular interest - move cursor up (<code>\0x1b[A</code>) and clear current line(<code>\0x1b[2k</code>).<sup id="fnref6"><a href="#fn6" rel="footnote">6</a></sup></p>
+
+<p>Every half second I clear the output and redraw<sup id="fnref7"><a href="#fn7" rel="footnote">7</a></sup>.
+After a draw the cursor sits at the beginning of the next line.
+To clear the output move the cursor up and clear the current line.
+Repeat <code>len(sites)</code> times.</p>
+
+<p>Since TOTP is time sensitive a token generator can be frustrating to debug.
+Essentially, the clocks have to be in sync on both the server side and the authenticator application side.
+Otherwise, the tokens would not match and login would fail.
+A handy tool for this (at least on linux) is <a href="http://www.ntp.org/">NTP</a><sup id="fnref8"><a href="#fn8" rel="footnote">8</a></sup>.
+In my case the clocks were out of sync by 40 seconds.
+This was the most frustrating part.
+Since the time difference was only slightly longer than the token lifetime I would occasionally see correct tokens further back in the output<sup id="fnref9"><a href="#fn9" rel="footnote">9</a></sup>.
+Long story short, time is hard.</p>
+
+<p>When I started this project I only expected to learn about a hash function.
+NTP, base32 encoding, and terminal escape codes are three tools that were previously mysterious but crucial to implementing onetime.
+Overall, I would call it a success.
+There are still many areas to explore in the future (profiling memory usage, cross platform testing, output to file instead of terminal, ...).</p>
+
+<div class="footnotes">
+<hr>
+<ol>
+
+<li id="fn1">
+<p>Don&#39;t worry, they are generated from old secrets. No security issue here.&nbsp;<a href="#fnref1" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn2">
+<p>The secret is encoded in base32. Some sites (looking at you Hover) decide to provide a key with an odd number of characters. be sure to pad it with &#39;=&#39;.&nbsp;<a href="#fnref2" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn3">
+<p>Google Authenticator uses <a href="https://www.ietf.org/rfc/rfc2104.txt">HMAC-SHA1</a>.&nbsp;<a href="#fnref3" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn4">
+<p>Well, the time is computed as number of 30 second periods since the Unix Epoch for UI. It would be hard to copy and paste if the code was valid for only one second.&nbsp;<a href="#fnref4" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn5">
+<p>Run it in a VT/100 compatible terminal.&nbsp;<a href="#fnref5" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn6">
+<p><code>\0x1b</code> is the hex literal for <code>ESC</code> (keycode 27).&nbsp;<a href="#fnref6" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn7">
+<p>Half second redraw time instead of second to reduce timing inaccuracies.&nbsp;<a href="#fnref7" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn8">
+<p>This protocol is on the implementation list.&nbsp;<a href="#fnref8" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn9">
+<p>This was ultimately the clue to fixing it.&nbsp;<a href="#fnref9" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
diff --git a/website/content/posts/2015/06/computing-fibonacci.md b/website/content/posts/2015/06/computing-fibonacci.md
new file mode 100644
index 0000000..5d67390
--- /dev/null
+++ b/website/content/posts/2015/06/computing-fibonacci.md
@@ -0,0 +1,139 @@
++++
+title = "Computing Fibonacci"
+tags = [ "algorithms", "programming", "golang" ]
+type = "article"
+description = "Comparison of various Fibonacci sequence algorithms"
+date = "2015-06-16"
+slug = "computing-fibonacci"
++++
+
+The [Fibonacci sequence](https://en.wikipedia.org/wiki/Fibonacci_number) is the sequence of integers where the next number is the sum of the previous two.
+While there are numerous examples in nature and many applications this post will focus on algorithms for computing any given number in the sequence.
+Determining the `nth` number in the Fibonacci sequence is a common exercise in computer science courses and interviews.
+
+The first method is a direct translation of the recurrence relation definition.
+
+ func recursive(n int) int {
+ switch n {
+ case 0:
+ return 0
+ case 1:
+ return 1
+ default:
+ return recursive(n-1) + recursive(n-2)
+ }
+ }
+
+The computational complexity of this method is `O(n^2)` which can be derived by counting the number of stack frames generated in an example run.
+Many of these function calls are repeated and therefore could benefit from [memoization](https://en.wikipedia.org/wiki/Memoization).
+
+ func memoize(n int) int {
+ cache := make(map[int] int)
+ cache[0] = 0
+ cache[1] = 1
+ return memoizeInternal(n, cache)
+ }
+
+ func memoizeInternal(n int, cache map[int] int) int {
+ if res, ok := cache[n]; ok {
+ return res
+ }
+
+ res := memoizeInternal(n-1, cache) + memoizeInternal(n-2, cache)
+ cache[n] = res
+ return res
+ }
+
+Memoization will reduce the complexity to `O(n)`, one addition per number in the sequence.
+For ever other stack frame we will return the cached answer.
+The memoized method will also need linear memory.
+The next approach can compute `F(n)` in linear time with constant memory.
+
+ func iterative(n int) int {
+ a := 0
+ b := 1
+ for i := 0; i < n; i++ {
+ a += b
+ a, b = b, a
+ }
+ return a
+ }
+
+By using a different form of the definition for the Fibonacci sequence, the result can be computed in `O(lg(n))` time.
+
+ n
+ | 1 1 | | F(n+1) F(n) |
+ | | = | |
+ | 1 0 | | F(n) F(n-1) |
+
+Taking advantage of the fact that the matrix is always 2x2 we can compute the answer without a fully generic implementation of [matrix chain multiplication](https://en.wikipedia.org/wiki/Matrix_chain_multiplication).
+
+ type matrix [][]int
+
+ func qmatrix(n int) int {
+ cache := make(map[int] matrix)
+ return qmatrixInternal(n, cache)
+ }
+
+ func qmatrixInternal(n int, cache map[int] matrix) int {
+ if n < 2 {
+ return n
+ }
+
+ var q matrix
+ q = append(q, []int{1,1})
+ q = append(q, []int{1,0})
+ fmt.Printf("%d %d\n%d %d\n", q[0][0], q[0][1], q[1][0], q[1][1])
+
+
+ var matricies []matrix
+ i := 0
+ for n > 0 {
+ exp := n & 0x1
+ n = n >> 1
+ pow := exp << uint(i)
+ i += 1
+ if exp != 0 {
+ matricies = append(matricies, matrixPowerOfTwo(q, pow, cache))
+ }
+ }
+
+ fmt.Println("%q\n", matricies)
+
+ for len(matricies) > 1 {
+ m1 := matricies[len(matricies)-1]
+ matricies = matricies[:len(matricies)-1]
+ m2 := matricies[len(matricies)-1]
+ matricies = matricies[:len(matricies)-1]
+ matricies = append(matricies, matrixMultiply(m1,m2))
+ }
+ return matricies[0][0][1]
+ }
+
+ func matrixMultiply(a, b matrix) matrix {
+ c11 := a[0][0]*b[0][0] + a[0][1]*b[1][0]
+ c12 := a[0][0]*b[0][1] + a[0][1]*b[1][1]
+ c21 := a[1][0]*b[0][0] + a[1][1]*b[1][0]
+ c22 := a[1][0]*b[0][1] + a[1][1]*b[1][1]
+ var c matrix
+ c = append(c, []int{c11, c12})
+ c = append(c, []int{c21, c22})
+ return c
+ }
+
+ func matrixPowerOfTwo(m matrix, p int, cache map[int] matrix) matrix {
+ if p == 1 {
+ return m
+ }
+ if val, ok := cache[p]; ok {
+ return val
+ }
+
+ k := matrixPowerOfTwo(m, p/2, cache)
+ res := matrixMultiply(k,k)
+ cache[p] = res
+ return res
+ }
+
+
+All of the code samples in this post can be found at [src.rampantmonkey.com/fibgo](http://src.rampantmonkey.com/fibgo).
diff --git a/website/content/posts/2015/06/gpg-transition.md b/website/content/posts/2015/06/gpg-transition.md
new file mode 100644
index 0000000..88b7467
--- /dev/null
+++ b/website/content/posts/2015/06/gpg-transition.md
@@ -0,0 +1,79 @@
++++
+title = "GPG Transition Statement"
+tags = [ "security", "linux" ]
+type = "article"
+description = "Notice of GPG key migration."
+date = "2015-06-14"
+slug = "gpg-transition"
++++
+
+(Inspired by [http://viccuad.me/blog/GPG-transition-statement/](http://viccuad.me/blog/GPG-transition-statement/) and [https://www.dennogumi.org/2015/06/gpg-transition-statement/](https://www.dennogumi.org/2015/06/gpg-transition-statement/))
+
+The exact same text can be found at [this location](http://rampantmonkey.com/gpg/gpg-transition-statement-2015-06.txt).
+
+```
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+Sun 14 Jun 2015
+
+For a number of reasons, I've recently set up a new OpenPGP key, and will be transitioning away from my old one.
+
+The old key will continue to be valid for some time, but I prefer all future correspondence to come to the new one. I would also like this new key to be re-integrated into the web of trust. This message is signed by both keys to certify the transition.
+
+The old key was:
+
+pub rsa4096/41DE81A9 2013-07-03
+ Key fingerprint = 42E4 3543 BBC6 AC9B D99D 6E10 92A7 599A 41DE 81A9
+
+And the new key is:
+
+pub rsa4096/D119CD2B 2015-06-14 [expires: 2016-06-13]
+ Key fingerprint = 35BC BE03 CA63 87B5 2349 5EE0 BAD7 5204 D119 CD2B
+
+To fetch the full key you can get it with:
+
+ wget -q -O- http://rampantmonkey.com/gpg/caseyrobinson.public.gpg-key | gpg --import -
+
+Or, to fetch my new key from a public key servery, you can simply do:
+
+ gpg --keyserver pgp.mit.edu --recv-key D119CD2B
+
+If you already know my old key, you can now verify that the new key is signed by the old one:
+
+ gpg --check-sigs D119CD2B
+
+If you don't already know my old key, or you just want to be double extra paranoid, you can check the fingerprint against the one above:
+
+ gpg --fingerprint D119CD2B
+
+If you are satisfied that you've got the right key, and the UIDs match what you expect, I'd appreciate it if you would sign my key:
+
+ gpg --sign-key D119CD2B
+
+Lastly, if you could upload these signatures, I would appreciate it. You can either send me an email with the new signatures (if you have a functional MTA on your system):
+
+ gpg --armor --export D119CD2B | mail -s 'OpenPGP Signatures' casey at rampantmonkey.com
+
+Or you can just upload the signatures to a public keyserver directly:
+
+ gpg --keyserver pgp.mit.edu --send-key D119CD2B
+
+Please let me know if there is any trouble, and sorry for the inconvenience.
+
+Regards,
+ Casey Robinson
+
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2
+
+iQEcBAEBCAAGBQJVfjzCAAoJEPpdmdoZJ3eMogYH/3RskhZ9JXEqDl+ncU6Igbfp
++12XIWLfrVQMfi57E/YTKfIiZjEFscZK0+/EXysmOCcmLaEhXuuEwlvQ4spYvgLN
+d6/dNLgkm4+/Jnfs8sBCd4/vsZfREgGlJpk4kzOOlJZ3Vc80pb4Jv59lM4Tgo//4
+XH2n3gT19/U/dKssAGMjxVDe9VnkynmmT0xtq12drwifwQEn34yTqK0RCxMaPI9b
+JYPRXw2pLlOedgqnaf2rcCHdv8tDZcVEcnO2wxjW6/EbbLadfMgJg8+ThpurJt9/
+J9kQ7DX0k1DVOgJ9ktuIdyJRku+2kpEVS34zNld5Q1Wg5A4LeRh7/yTGGfLf8Qs=
+=yeEH
+-----END PGP SIGNATURE-----
+```
diff --git a/website/content/posts/2015/12/9-player-game-of-thrones.md b/website/content/posts/2015/12/9-player-game-of-thrones.md
new file mode 100644
index 0000000..c6aed46
--- /dev/null
+++ b/website/content/posts/2015/12/9-player-game-of-thrones.md
@@ -0,0 +1,136 @@
++++
+title = "9 Player Game of Thrones"
+tags = ["3d printing", "board game", "asoiaf", "Game of Thrones"]
+type = "article"
+description = "Developing an expansion to one of my favorite board games"
+slug = "9-player-game-of-thrones"
+date = "2015-12-11"
++++
+
+Last fall at my local board game meetup I was introduced to [A Game of Thrones The Board Game](https://www.fantasyflightgames.com/en/products/a-game-of-thrones-the-board-game-second-edition/).
+Originally based on [Diplomacy](https://en.wikipedia.org/wiki/Diplomacy%5F%28game%29), _A Game of Thrones_ places three to six players in charge of the great houses of Westeros to vie for control of the continent.
+With a minimal element of luck[^1] players spread influence with diplomacy, card selection, and strategic planning.
+I am fascinated by this game and have played a few dozen times in person and one hundred games online[^2].
+
+Now that we have dispensed with the pleasantries we can get on to the purpose of this post: expanding the game to support up to nine players.
+There are a few variants available online - ["A Feast For Crows" Expansion](http://www.west2productions.com/Gamers/AGOT9/)[^3], ["The Winds of Winter" Expansion](http://enter-there.com/), and [Essos](http://boardgamegeek.com/filepage/103181/9-player-variant-essos-added)[^4].
+I went for the "Essos" expansion since it was the first one I found.
+I intend to try the other two when my regular playing group gets tired of the Essos version.
+
+# The Map
+
+In order to make room for three more players/houses the territories in the central portion of Westeros have been divided and rearranged and the western portion of Essos has been introduced.
+There have also been some other balance adjustments (e.g. rearranging resources, borders, and strongholds) as fallout from introducing many new territories.
+The wildlings track has changed to increments of 3 to account for the new players[^5].
+The supply track has also been expanded up to 8 barrels since there are potentially more territories to cover on the path to seven castles.
+Click on the map for a full resolution version.
+
+<a class="nohover" href="/media/9_player_map.jpg">![the map](/media/9_player_map_780x993.jpg)</a>
+
+## Essos
+The most obvious change when looking at the new map is the addition of a new continent on the eastern portion of the map: Essos.
+Hence the name of this expansion.
+Essos consists of eight territories with two strongholds and two castles.
+**Braavos** starts with a neutral force of 8 to eliminate a quick rush but is a valuable position late in the game for many houses.
+
+The more interesting change accompanying the new continent is the additional sea zones.
+Now there are four sea zones off the east coast of Westeros which allow for three houses to participate in combat.
+In the official six player map it is common for sea zones to fall into a stalemate where players continually place support and raid tokens in alternating sea zones which completely eliminates sea zones from play[^6].
+With three players the dynamic changes to incentivize diplomacy and/or strategy.
+
+## The Riverlands
+Move over Lannister time to make room for another house.
+Divided into eight territories and covered with castles, strongholds, and resources - the Westerlands now serve as the home for two houses.
+This change requires drastic changes to Lannister, Greyjoy, and Tyrell strategies while bringing more of the story to life by turning the Riverlands into a war-torn countryside.
+
+## The Vale
+The Vale has been littered with resources and is no longer the stomping grounds for House Stark.
+There are now two strongholds and two castles east of the river along with a new sea zone, **The Bay of Crabs**.
+The impassable borders and rivers along with no single central region make navigating and holding the Vale a significant challenge.
+If you can muster enough strength there are plenty of resources and easy access to Essos.
+
+## Impassable Borders
+The official map contains _rivers_ denoted as blue borders between regions.
+Rivers break the adjacency between otherwise neighboring spaces.
+So units cannot move between, raid, or support spaces across a river.
+Unless there is a bridge.
+The Essos map introduces the concept of _impassable borders_ which are black lines between spaces.
+These are functionally equivalent to rivers but lack the thematic motivation.
+The impassable borders were introduced since the central region of the board is now crowded with two additional houses.
+
+## Balance Adjustments
+There are less drastic, but equally important, changes throughout the rest of Westeros in order to keep the game balanced.
+Starting at the top and working our way down through each of the remaining houses, first we have House Stark.
+Since the Vale is now occupied by a new house the resources that the Starks' traditionally rely on have been redistributed across a newly partitioned north.
+
+**The Shivering Sea** now extends to **Braavos** and due to the newly added sea zone **The Byte** loses the ability act as _unraidable support_[^7].
+That honor has moved to the west coast with the addition of "Bear Island" and the division of the **Bay of Ice** into two sea zones.
+No longer touching either ocean, **Winterfell** is dramatically smaller.
+Instead **Deepwood** is added to the west coast with a castle and a port.
+
+Continuing down the western coast we reach House Greyjoy.
+The castle at **Flint's Finger** and stronghold at **Seagard** have swapped places.
+No other changes beyond the modifications for the Tullys and Lannisters.
+
+Continuing the counterclockwise tour of Westeros, House Tyrell.
+The castle previously **The Reach** is now further from **King's Landing** making it easier to hold, while the extra supply in from **Blackwater** is now further from **Highgarden** forcing House Tyrell to look elsewhere for supply.
+
+Next up: the Martells.
+**Storm's End** is no longer adjacent to the **Sea of Dorne** but the **Rainwood** has been added and includes a supply.
+**Lys** is a nearby island and Essos is only one sea zone away.
+
+
+Finally House Baratheon whose seat has been moved from **Dragonstone** to **Storm's End**.
+This is to allow for separation between all three new neighbors.
+**Tarth** is a new island added to the east of **Storm's End** and provides the opportunity for a quick supply grab.
+The rest of the changes that affect House Baratheon have been discused previously.
+
+## Printing the Map
+By replacing the tracks with Essos the expanded map is nearly identical in size to the original.
+Extra printouts can be placed anywhere around the table to track the influence and victory status for each house.
+I went to the FedEx Office store across the street from my apartment to print the map.
+Two hours and $50 later I walked out with a freshly minted map.
+
+# The New Houses
+The three new houses are House Arryn, House Targaryen, and House Tully.
+Each house needs cards, power tokens, track markers, and a shield (to hide which orders have yet to be used).
+The original designer produced a few pdfs containing all of the required images.
+My wife and I spent two nights at the FedEx Office store printing, cutting, and laminating all of the pieces.
+Lamination is not necessarily the best production method, but it was the cheapest that provided any level of durability.
+I plan to try a different method next time.
+
+## House Arryn
+The House Arryn cards place a strong emphasis on power tokens.
+In fact, every card with text deals with power tokens.
+This provides an interesting twist to bidding since tokens are easier to come by but are also valuable in battle.
+<a class="nohover" href="/media/arryn_cards.jpg">![house arryn cards](/media/arryn_cards_762x604.jpg)</a>
+
+## House Targaryen
+The House Targaryen cards either increase strength of units in combat or allow you to place/move orders after resolving combat.
+Daenerys is the only card in the game (aside from the awful Tides of Battle cards) with a skull symbol.
+The skull kills one unit even in the presence of towers.
+<a class="nohover" href="/media/targaryen_cards.jpg">![house targaryen cards](/media/targaryen_cards_744x1052.jpg)</a>
+
+## House Tully
+Since the designers could not settle on seven cards House Tully is the only house to have eight.
+Staying true to the theme, many of the cards provide tactical advantages if you are able to predict what card your opponent will play.
+<a class="nohover" href="/media/tully_cards.jpg">![house tully cards](/media/tully_cards_744x1052.jpg)</a>
+
+# The Units
+I have recently obtained a Printrbot Simple Metal 3D printer for projects just like this one.
+To create the pieces I found and printed these [pieces by Srokap](http://www.thingiverse.com/thing:279476) for each house at 30% infill to match the weight of the official pieces.
+Purple for House Targaryen, sky blue for House Arryn, and orange for House Tully.
+Purple and blue work thematically, but orange was the only other color of plastic I had on hand.
+<a class="nohover" href="/media/game_of_thrones_pieces.jpg">![the pieces, 3d printed](/media/game_of_thrones_pieces_953x658.jpg)</a>
+
+# References and Files
+I have uploaded the resources required to make the game to Dropbox ([tar.gz](https://www.dropbox.com/s/mulzuoktkip02bq/9_player_game_of_thrones_essos_resources.tar.gz?dl=0) or [zip](https://www.dropbox.com/s/nkpevrsta0891r9/9_player_game_of_thrones_essos_resources.zip?dl=0)).
+If you try the game or have any suggestions for improving it [let me know](mailto:casey@rampantmonkey.com).
+
+[^1]: The game has only one element of randomness - the ordering of events in the Westeros decks.
+[^2]: [Thronemaster](http://thronemaster.net)
+[^3]: Not to be confused with the official "A Feast For Crows" expansion with House Arryn and scenarios.
+[^4]: [Video overview](https://www.youtube.com/watch?v=D-tUFbSCCXE) from the designer
+[^5]: The wildling track still follows the 1 power token per three players per space ratio. This leaves bidding strategies relatively untouched.
+[^6]: The Raid/Support stalemate would be a great topic for a future blog post.
+[^7]: Support placed in an area which cannot be raided since the player controls all neighboring zones.
diff --git a/website/content/posts/2015/12/pandemic_legacy_june_debreif.md b/website/content/posts/2015/12/pandemic_legacy_june_debreif.md
new file mode 100644
index 0000000..a0f94eb
--- /dev/null
+++ b/website/content/posts/2015/12/pandemic_legacy_june_debreif.md
@@ -0,0 +1,46 @@
++++
+title = "Pandemic Legacy: June Debrief"
+tags = ["board game", "pandemic", "pandemic legacy"]
+type = "article"
+description = "Documenting our progress through the first half of Pandemic Legacy. Warning: spoilers ahead."
+slug = "pandemic-legacy-june-debrief"
+date = "2015-12-26"
++++
+
+> Warning: The rest of this post will reveal many of the twists introduced in the first six months. Come back after you play through June.
+
+Rose and I received [Pandemic Legacy: Season 1](https://boardgamegeek.com/boardgame/161936/pandemic-legacy) as a Christmas gift from one of our board gaming friends.
+We dove in and played the first six months in a single sitting; ended by a universal desire for sleep.
+The purpose of this post is to document our progress, our plan going forward, and tactics we have employed before continuing to the second half of the game.
+
+## Current Status
+- We are undefeated through June[^1].
+- Our medic and operations expert each have one scar.
+- All other characters are unharmed.
+- All red territories are now faded[^2].
+- All faded territories are isolated with road blocks from the rest of the world.
+- Panic Level 1: Chicago, Lima, Madrid, Algiers, Lagos, Khartoum, Moscow, Tehran, Delhi, Shanghai, Hong Kong, Osaka, and Sydney
+- Panic Level 2: St. Petersburg and Ho Chi Minh City
+- Panic Level 3: Kinsasha
+- No collapsing or fallen cities.
+- Three positive mutations on black[^3].
+- Permanent Research Stations: Atlanta, Karachi, and Taipei
+- Permanent Military Bases: Lagos and Taipei
+
+## Tactics
+We have heavily invested in infrastructure, with five permanent buildings, to reduce travel time and contain the disease[^4].
+April-June we stuck with the same character load out: Medic with Veteran upgrade, Operations Expert, and Quarantine Specialist.
+We have no intention of changing this unless a new character or mechanic appears.
+
+## Summary
+I'm feeling optimistic about our chances in the second half of the year.
+And this is a fantastic Christmas present.
+
+[^1]: June was a nail-biter ending with five neighboring cities in Faded territories with three Faded figures each and seven outbreaks. The main cause of this tension was the player deck. Eight of the last ten cards were black cities which made it nearly impossible to cure black despite our positive mutations from previously eradicating black.
+[^2]: In a stroke of luck, the red cubes mutated into __COdA-403__. Lucky because red has the least connections to other colors which limits the ability of __COdA-403__ to spread.
+[^3]: One accidental eradication since we never drew a black city card in March.
+[^4]: Heavily influenced by my real-life career building computing infrastructure.
+
+
+
+
diff --git a/website/content/posts/2016/10/lycanthropic_love.md b/website/content/posts/2016/10/lycanthropic_love.md
new file mode 100644
index 0000000..2f3c4ca
--- /dev/null
+++ b/website/content/posts/2016/10/lycanthropic_love.md
@@ -0,0 +1,205 @@
++++
+title = "Lycanthropic Love"
+tags = ["elm", "DCPHR", "puzzles"]
+type = "article"
+description = "An experiment with Elm and Hammer.js"
+date = "2016-10-18"
++++
+
+For the past few months I have been working with a team of puzzlers to write a puzzle hunt for the DC area called [DCPHR](http://dcphr.org)[^1].
+A puzzle hunt is an event where teams of people compete to solve puzzles of all types at different locations around the city.
+Our first hunt was run last weekend in Clarendon.
+This post describes my experience writing one of the puzzles __Lycanthropic Love__.
+
+Brief tangent: DCPHR is an annual event. We are always looking for more people to help write, test, and run the hunt. [Email me](mailto:casey@rampantmonkey.com) if you are interested in participating in developing next year's hunt.
+
+Take a moment now to go look at the final product hosted at [lycanthropic.love](http://lycanthropic.love). The rest of this post will dive into the details of both the puzzle mechanics and their implementation in the browser with Elm. So, beware of spoilers.
+
+I chose to work on this puzzle specifically to experiment with new browser technologies.
+So I couldn't go with plain JavaScript.
+I'm drawn to languages over frameworks, which leaves me with ClojureScript, CoffeeScript, TypeScript, or Elm.
+Past experience with Clojure[^2] and ClojureScript[^3] left me wanting more useful error messages and less Java dependencies.
+CoffeeScript and TypeScript are supersets of JavaScript which forces them to maintain / paper over some of the JavaScript ugliness (the exact thing I was trying to avoid).
+Which leaves Elm.
+
+Elm provides a runtime which handles the interaction with the DOM and JavaScript and thus allows me to focus on my business logic.
+Immutability, friendly errors, and strong typing also match closely with my recent rust experience.
+So Elm it is.
+
+Lycanthropic Love is a satirical dating app for Werewolves.
+Inspired by Tinder, you are presented with matches.
+For each match you are expected to swipe right for yes and left for no.
+In this puzzle you are presented with 7 different profiles.
+Your job is to read each profile, determine a pattern for what they like, and then select the appropriate matches.
+
+Each profile contains a list of likes.
+All of the likes have a common relationship.
+The matches which should be swiped right also have this relationship.
+For example, the Bare Wolf lists his likes as "Pandemonium", "discount sales", "education", and "Pabst Blue Ribbon".
+Each of these items contain each vowel exactly once, also known as supervocalics[^4].
+
+Once all of the matches are swiped, the results are listed on the main page as a series of paws up or down.
+These five swipes can then be converted to a letter using a binary table (common encoding technique provided in the intro packet).
+The answer to the puzzle is a seven letter word.
+
+Now for the fun part: writing web page.
+Let's start with the wolf data structure (called Models in Elm).
+
+ type alias Wolf =
+ { name : String
+ , imgLink : String
+ , likes : List String
+ , matches : List Match
+ }
+
+ type alias Match =
+ { name : String
+ , imgLink : String
+ , shouldLike : Bool
+ , swipe : Maybe SwipeDirection
+ }
+
+ type SwipeDirection
+ = Left
+ | Right
+
+I chose to store the matches inside of the `Wolf` type and the `SwipeDirection` inside of the `Match`.
+This choice allowed rendering to be a straightforward tree walk, while storing a swipe requires two list lookups, both for the wolf and the match
+I later found out (while watching an [elm-conf presentation](https://www.youtube.com/watch?v=IcgmSRJHu_8)) that a Ziplist[^5] would have been the correct compromise.
+
+To provide a taste of the rendering section, let's look at the process for rendering the profile screen for a single wolf.
+The function takes a `Maybe Wolf` since it is possible that a wolf hasn't been selected yet (likely due to the refresh or back button, one of the many areas that could be improved) and returns a request to the Elm runtime (and virtual dom) to add nodes to the DOM tree.
+This indirection is one of the key reasons Elm is both safe and fast.
+Developers only write requests and must deal with both the success and failure of that request.
+The Elm runtime then optimizes DOM insertions with one of the fastest virtual DOM implementations.
+
+ renderCurrent : Maybe Wolf -> Html Msg
+ renderCurrent wolf =
+ case wolf of
+ Just wolf ->
+ let dislikes =
+ case List.length(wolf.dislikes) of
+ 0 -> div [] []
+ _ -> div []
+ [ h3 [] [ text "Dislikes" ]
+ , div [] [ text (String.join ", " wolf.dislikes) ]
+ ]
+ in
+ div [ class "wolf-profile" ]
+ [ wolfIcon (onClick NoOp) wolf
+ , h1 [] [ text wolf.name ]
+ -- , h2 [] [ text wolf.epitat ]
+ , h3 [] [ text "Likes" ]
+ , div [] [ text ( String.join ", " wolf.likes ) ]
+ , dislikes
+ , a [ class "button", onClick ShowMatches ] [ text "View Matches" ]
+ , a [ class "button", onClick Logout ] [ text "Back" ]
+ ]
+ Nothing -> div [ class "error" ] [ text "Render Current triggered without a wolf" ]
+
+To demonstrate both the consequences of the `Wolf` type structure and my lack of experience with Elm, here is the code which stores the swipes. Maybe chaining and ziplists would drastically reduce the size of this code snippet.
+
+ Swipe direction ->
+ case state.mode of
+ All -> (state, Cmd.none)
+ Current -> (state, Cmd.none)
+ _ ->
+ case lookupWolf state.currentWolf state.wolves of
+ Just wolf ->
+ let state =
+ storeSwipe direction state
+ in
+ case state.currentMatch of
+ Just matchIndex ->
+ case List.head (List.drop matchIndex wolf.matches) of
+ Just matchedWolf ->
+ case optionallyIncrement state.currentMatch of
+ Just n ->
+ case n >= List.length(wolf.matches) of
+ True ->
+ ( { state
+ | currentMatch = Just 0
+ , mode = All
+ }
+ , Navigation.newUrl (toPath All)
+ )
+ False ->
+ ( { state
+ | currentMatch = Just n
+ }
+ , Cmd.none
+ )
+ Nothing ->
+ ( { state
+ | currentMatch = Nothing
+ , mode = All
+ }
+ , Navigation.newUrl (toPath All)
+ )
+ Nothing -> (
+ { state
+ | mode = All
+ , currentMatch = Nothing
+ }
+ , Navigation.newUrl (toPath All))
+ Nothing ->(state, Cmd.none)
+ Nothing -> ( -- Landing page was swiped away
+ { state
+ | mode = All
+ }
+ , Navigation.newUrl (toPath All))
+
+In order to capture the swipe I had to fall back to JavaScript and the [Hammer.js](http://hammerjs.github.io/) library.
+Elm uses `ports` and `subscriptions` to communicate with JavaScript.
+The code below is slightly bloated due to dynamically attaching event listeners tonodes (which represent the swipeable object) as they are added to the DOM.
+The virtual dom asynchronously updates the actual dom nodes, hence the setInterval to periodically test whether the node is ready or not.
+
+ var app = Elm.Main.fullscreen()
+
+ app.ports.match.subscribe(function(id) {
+ var interval = setInterval(function() {
+ var el = document.getElementById(id)
+ if(el) { window.clearInterval(interval) }
+ else { return }
+ var hammertime = new Hammer(el, null)
+ el.style.display = "block"
+ var element_width = el.getBoundingClientRect().width / 2
+ el.style.left = window.innerWidth / 2 - element_width + "px"
+
+ // ignore pan event which comes after swipe due to javascript event ordering
+ var swiped = false
+
+ if(registered) { return }
+ hammertime.on("pan", function (event) {
+ if(swiped) { swiped = false; return }
+ el.style.left = event.center.x - element_width + "px"
+ })
+
+ hammertime.on('swipe', function(ev) {
+ swiped = true
+
+ if(ev.direction == Hammer.DIRECTION_RIGHT) {
+ app.ports.swipe.send("right")
+ } else if(ev.direction == Hammer.DIRECTION_LEFT) {
+ app.ports.swipe.send("left")
+ } else {
+ return
+ }
+
+ element_width = el.getBoundingClientRect().width / 2
+ el.style.left = (window.innerWidth / 2) - element_width + "px"
+ })
+
+ registered = true
+ })
+ }, 10)
+
+Despite some less than ideal choices, Elm was easy to get started with.
+By forcing me to think about my data model up front I ended up with a cleaner application.
+I look forward to using Elm on my next project.
+
+[^1]: DCPHR is pronunced "Decipher" and stands for DC Puzzle Hunt. We never came up with a useable acronym which used the "R".
+[^2]: Clojure projects: [neighborhoods](http://src.rampantmonkey.com/neighborhoods) and [nuc cluster](http://src.rampantmonkey.com/nuc_cluster/)
+[^3]: ClojureScript project: [corewar](http://src.rampantmonkey.com/corewar/)
+[^4]: Clever readers will notice that "supervocalics" is also supervocalic.
+[^5]: A ziplist stores a list as three components `Before`, `Current`, `After`; where `Before` and `After` are lists themselves.
diff --git a/website/content/posts/2016/11/shortening_the_rust_edit_feedback_cycle.md b/website/content/posts/2016/11/shortening_the_rust_edit_feedback_cycle.md
new file mode 100644
index 0000000..2069ed5
--- /dev/null
+++ b/website/content/posts/2016/11/shortening_the_rust_edit_feedback_cycle.md
@@ -0,0 +1,75 @@
++++
+title = "Shortening the Rust Edit/Feedback Cycle"
+tags = ["rust", "cargo"]
+type = "article"
+description = "Some cargo and rustc flags to reduce waiting during development with rust"
+date = "2016-11-08"
++++
+
+One of the most common frustrations when working with rust is the speed of the compiler.
+Well actually, the lack of it.
+At work we currently have a 15k line project.
+From a clean slate, compilation takes 92 seconds.
+If all of the dependencies are compiled, `cargo build` still takes over 30 seconds to run on a two year old 15 inch MacBook Pro.
+Anecdotally, this is more than enough time to get distracted with Slack or Reddit.
+Time to dive into the less common features of `cargo`.
+
+By design the usual collection of `cargo` commands do not expose the underlying details of the compiler.
+This choice removes a large swath of potential build system issues.
+But sometimes users need to fiddle with the lower levels of the toolchain.
+`cargo` provides a subcommand specifically for this purpose - `cargo rustc`.
+
+> λ> cargo rustc --help
+> Compile a package and all of its dependencies
+
+In our project we have three targets: a library which contains all of the business logic, an executable which wraps the library and provides the command line parsing, and a second executable for managing our rfc process.[^1]
+With the normal subcommands - build, test, doc - cargo automatically handles creating all three build artifacts.
+This is one of the advantages of severely limiting users ability to customize the build process.
+`cargo rustc` does not provide this affordance, instead requiring you to specify the desired build artifact with `--lib` or `--bin`.
+The documentation quoted below explains exactly how to use these flags.
+
+>This command requires that only one target is being compiled. If more than one
+>target is available for the current package the filters of --lib, --bin, etc,
+>must be used to select which target is compiled. To pass flags to all compiler
+>processes spawned by Cargo, use the $RUSTFLAGS environment variable or the
+>\`build.rustflags\` configuration option.
+
+Reading through [github issues](https://github.com/rust-lang/rust/issues), [reddit](https://www.reddit.com/r/rust/), and the [internals forum](https://internals.rust-lang.org/) there is oft mention of the `-Z` flag to `rustc`.
+According to the help page `-Z` is the catch-all flag to"Print internal options for debugging rustc".
+Let's see what is available.
+
+> λ> cargo rustc --lib -Zhelp
+> warning: the option \`Z\` is unstable and should only be used on the nightly compiler, but it is currently accepted for backwards compatibility; this will soon change, see [issue #31847](https://github.com/rust-lang/rust/issues/31847) for more details
+
+Oops.
+`rustup` to the rescue.
+Adding the `+nightly` flag to our command will tell cargo to use the nightly toolchain and thus remove the warning.
+The command to run is now `cargo +nightly rustc --lib -Zhelp`
+
+Three of the debug options have reduced the wait for feedback: `parse-only`, `no-trans`, and `incremental`.[^2]
+The first two options skip compilation phases while incremental caches intermediate compilation results and only reruns the phases invalidated by subsequent changes.
+
+`parse-only` does exactly what it says on the tin - only runs the parse phase of the compiler.
+Only running parsing catches typos and some type errors and completes in under a second.
+This behavior serves as the basis for many editor plugins such as flycheck.
+
+`no-trans` runs all of the compilation phases up until llvm.
+This this covers linting and analysis which produce the bulk of the valuable feedback provided by the compiler.
+Including unimplemented methods for traits, missing match branches, move semantics, and lifetime checks.
+I have noticed myself running this command most frequently.
+Looking through [my shell history](http://src.rampantmonkey.com/dot_files/commit/?id=029e747410a51d37bc0bd48ff18b8844280a80b3) confirms that notion.
+
+Incremental compilation is a [very new and experimental feature](https://blog.rust-lang.org/2016/09/08/incremental.html) in rustc.
+There are many caveats with using incremental compilation, not the least of which is no guarantees on correctness.
+The goal of this exercise is to document some options for gaining information quickly about your rust program.
+Not to reduce overall compilation times.
+Incremental compilation is enabled by the `incremental` parameter to the `-Z` flag.
+`incremental` also requires a path to store the incremental build index.
+So the final command for experimenting with incremental compilation is `cargo +nightly rustc --lib -Zincremental=incremental_state`.
+With incremental compilation we have seen build times reduce to 4 seconds for minor changes to a single module.
+
+__tl;dr__ `cargo +nightly rustc --lib -Zno-trans` is awesome.[^3]
+
+[^1]: We follow a similar rfc process to [rust](http://github.com/rust-lang/rfcs) for proposing changes to the project. So far we have found the separation of design and implementation to significantly reduce change review time (even when adding together rfc and implementation reviews). This probably deserves its own post.
+[^2]: When reading through the help listing I was reminded of `no-analysis` which is invaluable in debugging macros but completely unrelated to this post.
+[^3]: You can automatically run this command with `cargo +nightly watch -- "rustc --lib -- -Zno-trans"`. The watch subcommand can be found on [github](https://github.com/passcod/cargo-watch).
diff --git a/website/content/posts/2017/01/rainbow_box.md b/website/content/posts/2017/01/rainbow_box.md
new file mode 100644
index 0000000..40ebb47
--- /dev/null
+++ b/website/content/posts/2017/01/rainbow_box.md
@@ -0,0 +1,539 @@
++++
+title = "Rainbow Box"
+tags = ["puzzles", "3d printing", "arduino"]
+type = "article"
+description = "Polychromatic, 3D printed, electronic logic puzzle"
+date = "2017-01-30"
++++
+
+<video autoplay="autoplay" loop="loop" width="400" height=300">
+ <source src="/media/rainbow_box_intro.mp4" type="video/mp4" />
+ <img src="/media/rainbow_box_intro.mp4" width="400" height="300" />
+</video>
+
+<a class="nohover" name="overview"></a>
+## Overview of Puzzle
+Last weekend I wanted to continue learning about arduino and 3D printing, so I created a physical logic puzzle.
+Inspired by the [XBox](http://thefaminegame.com/puzzles/14-XBox.html) [puzzle](https://www.youtube.com/watch?v=o_8e6XgAiow) from the Famine Games, the Rainbow Box is a logic puzzle where the goal is to enter the word "rainbow" into the box.
+There is not much else I can say about the puzzle without spoiling it.
+
+<div class="warning">
+ <h1>Spoiler Warning</h1>
+ <hr />
+ <p>The rest of this post will provide the solution as well as explore the implementation of the puzzle. If you want to solve the puzzle yourself stop here and come back once you are done.</p>
+</div>
+
+<a class="nohover" name="solution"></a>
+## Solution
+
+<div class="note">
+ <h1>Note</h1>
+ <hr />
+ <p>Since the seven segment display has only two columns of vertical lines it is impossible to render the entire alphabet, including "w". Which is necessary for entering the word "rainbow". Thus it is required to determine the function of each button before submitting an answer. I guess one could brute force it by trying all 32 combinations after entering "rainbo", but that defeats the goal of a puzzle.
+</div>
+
+To begin, flip the switch and wait for the screen to finish displaying the spiral.
+Now the box is ready to receive input.
+There are six buttons, one on each side of the cube.
+The first step in solving is to observe what each button does when pressed individually.
+
+The blue button displays a `p`.
+The green button displays an `h`.
+The orange button displays a `b`.
+The red button displays an `a`.
+The white button displays the phrase `nope`.
+The yellow button displays `d`.
+
+The white button is an obvious outlier, displaying a phrase instead of a single letter.
+From this fact we deduce that the white button is used to submit the current letter.
+Now we have to look at the colored buttons.
+The table below sorts the buttons alphabetically based on the letter produced when pressed.
+
+<figure>
+ <table>
+ <thead><tr><th>Button Color</th><th>Letter Displayed</th></tr></thead>
+ <tbody>
+ <tr><td>red</td><td><code>a</code></td></tr>
+ <tr><td>orange</td><td><code>b</code></td></tr>
+ <tr><td>yellow</td><td><code>d</code></td></tr>
+ <tr><td>green</td><td><code>h</code></td></tr>
+ <tr><td>blue</td><td><code>p</code></td></tr>
+ </tbody>
+ <table>
+ <figcaption>Fig1. Mapping from button to letter</figcaption>
+</figure>
+
+Alphabetizing the button characters has revealed an interesting pattern: the buttons are now ordered based on the colors of the rainbow.[^1]
+The next step is to try pairs of buttons.
+For each pair of buttons predict what be displayed and record the output in a five-by-five table.
+
+<figure>
+ <table>
+ <thead><tr><th></th><th>red</th><th>orange</th><th>yellow</th><th>green</th><th>blue</th></tr></thead>
+ <tbody>
+ <tr><th>red</th> <td> </td><td><code>c</code></td><td><code>e</code></td><td><code>i</code></td><td><code>q</code></td></tr>
+ <tr><th>orange</th><td><code>c</code></td><td> </td><td><code>f</code></td><td><code>j</code></td><td><code>r</code></td></tr>
+ <tr><th>yellow</th><td><code>e</code></td><td><code>f</code></td><td> </td><td><code>l</code></td><td><code>t</code></td></tr>
+ <tr><th>green</th> <td><code>i</code></td><td><code>j</code></td><td><code>l</code></td><td> </td><td><code>?</code></td></tr>
+ <tr><th>blue</th> <td><code>q</code></td><td><code>r</code></td><td><code>t</code></td><td><code>?</code></td><td> </td></tr>
+ </tbody>
+ </table>
+ <figcaption>Fig2. Pairs of buttons</figcaption>
+</figure>
+
+Now that all of the pairs of buttons have been observed there is enough information to make a hypothesis about the role of each button.
+Start by looking at the list of single button outputs: `b`, `d`, `h`, `p`.
+Compare that list with the list of pairs which include the red button: `c`, `e`, `i`, and `q`.
+Notice that the characters in the red button list are the very next character in the alphabet.
+From this, the hypothesis is that the red button shifts the output by one letter.
+This hypothesis can be tested by pressing the red button along with one of the non-red pairs.
+Pressing the orange, yellow, and red buttons simulataneously reveals a `g`.
+Thereby confirming our hypothesis.
+
+Using the same process shows that the orange button (`c`, `f`, `j`, `r`) shifts by two letters and the yellow button(`e`, `f`, `l`, `t`) shifts by four letters.
+Green (`i`, `j`, `l`, `?`) and blue (`q`, `r`, `t`, `?`) appear to shift by eight and sixteen but have an unknown letter.
+Based on our theory we can resolve that ambiguity by adding the red button and then shifting backwards by one letter.
+green-blue-red reveals a `y` which means that green-blue is `x`.
+
+The buttons shift the display character by `1`, `2`, `4`, `8`, or `16`.
+All of which are powers of two.
+This means that the box is using each button to represent a single bit in the the letter that is displayed.
+The following figure shows the conversion between bits and letters.
+
+<figure>
+ <table>
+ <thead><tr><th>Letter</th><th>Index</th><th>Binary</th></tr></thead>
+ <tbody>
+ <tr><td>A</td><td> 1</td><td><code>00001</code></td></tr>
+ <tr><td>B</td><td> 2</td><td><code>00010</code></td></tr>
+ <tr><td>C</td><td> 3</td><td><code>00011</code></td></tr>
+ <tr><td>D</td><td> 4</td><td><code>00100</code></td></tr>
+ <tr><td>E</td><td> 5</td><td><code>00101</code></td></tr>
+ <tr><td>F</td><td> 6</td><td><code>00110</code></td></tr>
+ <tr><td>G</td><td> 7</td><td><code>00111</code></td></tr>
+ <tr><td>H</td><td> 8</td><td><code>01000</code></td></tr>
+ <tr><td>I</td><td> 9</td><td><code>01001</code></td></tr>
+ <tr><td>J</td><td>10</td><td><code>01010</code></td></tr>
+ <tr><td>K</td><td>11</td><td><code>01011</code></td></tr>
+ <tr><td>L</td><td>12</td><td><code>01100</code></td></tr>
+ <tr><td>M</td><td>13</td><td><code>01101</code></td></tr>
+ <tr><td>N</td><td>14</td><td><code>01110</code></td></tr>
+ <tr><td>O</td><td>15</td><td><code>01111</code></td></tr>
+ <tr><td>P</td><td>16</td><td><code>10000</code></td></tr>
+ <tr><td>Q</td><td>17</td><td><code>10001</code></td></tr>
+ <tr><td>R</td><td>18</td><td><code>10010</code></td></tr>
+ <tr><td>S</td><td>19</td><td><code>10011</code></td></tr>
+ <tr><td>T</td><td>20</td><td><code>10100</code></td></tr>
+ <tr><td>U</td><td>21</td><td><code>10101</code></td></tr>
+ <tr><td>V</td><td>22</td><td><code>10110</code></td></tr>
+ <tr><td>W</td><td>23</td><td><code>10111</code></td></tr>
+ <tr><td>X</td><td>24</td><td><code>11000</code></td></tr>
+ <tr><td>Y</td><td>25</td><td><code>11001</code></td></tr>
+ <tr><td>Z</td><td>26</td><td><code>11010</code></td></tr>
+ </tbody>
+ </table>
+ <figcaption>Fig3. letters, decimal, and binary representations of numbers</figcaption>
+</figure>
+
+The table above shows the buttons needed to enter each letter.
+
+<ol style="margin: 0.8em 0; list-style: decimal; list-style-position: inside;">
+ <li><code>r</code> = <code>10010</code> = blue + orange</li>
+ <li><code>a</code> = <code>00001</code> = red</li>
+ <li><code>i</code> = <code>01001</code> = green + red </li>
+ <li><code>n</code> = <code>01110</code> = green + yellow + orange</li>
+ <li><code>b</code> = <code>00010</code> = orange</li>
+ <li><code>o</code> = <code>01111</code> = green + yellow + orange + red</li>
+ <li><code>w</code> = <code>10111</code> = blue + yellow + orange + red</li>
+</ol>
+
+Entering each of the button combinations above produces the final message: "congrats you have found the pot of gold" which is the end of the puzzle.
+
+<a class="nohover" name="typeface"></a>
+## Typeface
+
+Each letter is rendered on the seven segment display.
+The rendering process uses the integer computed from the current button configuration as an index into the typeface table.
+Each row of the table contains eight integers representing the signal to send to each segment (`HIGH` or `LOW`).
+
+The following figure is a JavaScript implementation of the rendering process.
+The text input accepts a single character and displays it on the adjacent display.
+Some of the characters are not renderable and are represented by a single dot.
+
+<script>
+(function(){
+ var typeface =
+ { 97: [1,1,1,0,1,1,1,0]
+ , 98: [0,0,1,1,1,1,1,0]
+ , 99: [1,0,0,1,1,1,0,0]
+ , 100: [0,1,1,1,1,0,1,0]
+ , 101: [1,0,0,1,1,1,1,0]
+ , 102: [1,0,0,0,1,1,1,0]
+ , 103: [1,1,1,1,0,1,1,0]
+ , 104: [0,0,1,0,1,1,1,0]
+ , 105: [0,0,0,0,1,1,0,0]
+ , 106: [0,1,1,1,1,0,0,0]
+ , 107: [0,1,1,0,1,1,1,1]
+ , 108: [0,0,0,1,1,1,0,0]
+ , 109: [0,0,0,0,0,0,0,1]
+ , 110: [0,0,1,0,1,0,1,0]
+ , 111: [1,1,1,1,1,1,0,0]
+ , 112: [1,1,0,0,1,1,1,0]
+ , 113: [1,1,1,0,0,1,1,0]
+ , 114: [0,0,0,0,1,0,1,0]
+ , 115: [1,0,1,1,0,1,1,0]
+ , 116: [0,0,0,1,1,1,1,0]
+ , 117: [0,0,1,1,1,0,0,0]
+ , 118: [0,1,1,1,1,1,0,0]
+ , 119: [0,0,0,0,0,0,0,1]
+ , 120: [0,0,0,0,0,0,0,1]
+ , 121: [0,1,1,1,0,1,1,0]
+ , 122: [1,1,0,1,1,0,1,0]}
+
+ window.addEventListener("load", function(e) {
+ var segments = (function() {
+ var s = {}
+ s.a = document.getElementById("led-a")
+ s.b = document.getElementById("led-b")
+ s.c = document.getElementById("led-c")
+ s.d = document.getElementById("led-d")
+ s.e = document.getElementById("led-e")
+ s.f = document.getElementById("led-f")
+ s.g = document.getElementById("led-g")
+ s.h = document.getElementById("led-h")
+ return s
+ }())
+ if(!segments) { return }
+
+ var turnOnSegment = function(letter) {
+ segments[letter].setAttribute("fill", "#ff0000")
+ }
+ var turnOffSegment = function(letter) {
+ segments[letter].setAttribute("fill", "#dddddd")
+ }
+
+ var inp = document.getElementById("typeface-entry")
+ if(!inp) { return }
+ inp.addEventListener("keypress", function(e) {
+ var charCode = e.charCode;
+ if(charCode > 64 && charCode < 91) { charCode += 32 }
+ var leds = typeface[charCode];
+ if(!leds) { return; }
+ inp.value = String.fromCharCode(e.charCode) // clear input
+ if(leds[0] > 0) { turnOnSegment("a") } else { turnOffSegment("a") }
+ if(leds[1] > 0) { turnOnSegment("b") } else { turnOffSegment("b") }
+ if(leds[2] > 0) { turnOnSegment("c") } else { turnOffSegment("c") }
+ if(leds[3] > 0) { turnOnSegment("d") } else { turnOffSegment("d") }
+ if(leds[4] > 0) { turnOnSegment("e") } else { turnOffSegment("e") }
+ if(leds[5] > 0) { turnOnSegment("f") } else { turnOffSegment("f") }
+ if(leds[6] > 0) { turnOnSegment("g") } else { turnOffSegment("g") }
+ if(leds[7] > 0) { turnOnSegment("h") } else { turnOffSegment("h") }
+
+ })
+ }, false)
+}())
+</script>
+
+<figure style="text-align: center;">
+ <div>
+ <input style="display: inline-block; vertical-align: middle; width: 2em; padding: 0.3em; font-size: 3em; text-align: center; cursor: none; margin: 0.3em;" id="typeface-entry" type="text" maxlength="1" />
+ <svg style="display: inline-block; vertical-align: middle;" height="100px" viewBox="0 0 13 18">
+ <g style="fill-rule:evenodd; stroke:#ffffff; stroke-width:0.25; stroke-opacity:1; stroke-linecap:butt; stroke-linejoin:miter;">
+ <polygon id="led-a" points=" 1, 1 2, 0 8, 0 9, 1 8, 2 2, 2" fill="#dddddd" />
+ <polygon id="led-b" points=" 9, 1 10, 2 10, 8 9, 9 8, 8 8, 2" fill="#dddddd" />
+ <polygon id="led-c" points=" 9, 9 10,10 10,16 9,17 8,16 8,10" fill="#dddddd" />
+ <polygon id="led-d" points=" 9,17 8,18 2,18 1,17 2,16 8,16" fill="#dddddd" />
+ <polygon id="led-e" points=" 1,17 0,16 0,10 1, 9 2,10 2,16" fill="#dddddd" />
+ <polygon id="led-f" points=" 1, 9 0, 8 0, 2 1, 1 2, 2 2, 8" fill="#dddddd" />
+ <polygon id="led-g" points=" 1, 9 2, 8 8, 8 9, 9 8,10 2,10" fill="#dddddd" />
+ <circle id="led-h" cx="11" cy="17" r="1" fill="#dddddd"/>
+ </g>
+ </svg>
+ </div>
+ <figcaption>Fig4. Typeface Explorer</figcaption>
+</figure>
+
+<a class="nohover" name="code"></a>
+## Code
+
+The code centers around one main data strucure, `state`.
+`state` represents the current state of each button (pressed or not) and the current stage of the puzzle (which letters have been correctly entered).
+There are then a series of functions which construct the state from the buttons, render the state on the display, and submit a letter.
+The `numberEntered` function is particularly interesting as it succintly summarizes the entire puzzle.
+
+ const int LED_A = 2;
+ const int LED_B = 3;
+ const int LED_C = 4;
+ const int LED_D = 5;
+ const int LED_E = 6;
+ const int LED_F = 7;
+ const int LED_G = 8;
+ const int LED_H = 9;
+ const int RED_PIN = 10;
+ const int ORANGE_PIN = 11;
+ const int YELLOW_PIN = 12;
+ const int GREEN_PIN = 13;
+ const int BLUE_PIN = 14;
+ const int SUBMIT_PIN = 15;
+
+ static const int typeface[32][8] =
+ { {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }
+ , {HIGH, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, LOW }
+ , {LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW }
+ , {HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW }
+ , {LOW, HIGH, HIGH, HIGH, HIGH, LOW, HIGH, LOW }
+ , {HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, LOW }
+ , {HIGH, LOW, LOW, LOW, HIGH, HIGH, HIGH, LOW }
+ , {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW }
+ , {LOW, LOW, HIGH, LOW, HIGH, HIGH, HIGH, LOW }
+ , {LOW, LOW, LOW, LOW, HIGH, HIGH, LOW, LOW }
+ , {LOW, HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW }
+ , {LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH}
+ , {LOW, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH}
+ , {LOW, LOW, HIGH, LOW, HIGH, LOW, HIGH, LOW }
+ , {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW }
+ , {HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW }
+ , {HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW }
+ , {LOW, LOW, LOW, LOW, HIGH, LOW, HIGH, LOW }
+ , {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW }
+ , {LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH, LOW }
+ , {LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW, LOW }
+ , {LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH}
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH}
+ , {LOW, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW }
+ , {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }
+ , {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW } };
+
+ void setup() {
+ pinMode(LED_A, OUTPUT);
+ pinMode(LED_B, OUTPUT);
+ pinMode(LED_C, OUTPUT);
+ pinMode(LED_D, OUTPUT);
+ pinMode(LED_E, OUTPUT);
+ pinMode(LED_F, OUTPUT);
+ pinMode(LED_G, OUTPUT);
+ pinMode(LED_H, OUTPUT);
+ pinMode(RED_PIN, INPUT);
+ pinMode(ORANGE_PIN, INPUT);
+ pinMode(YELLOW_PIN, INPUT);
+ pinMode(GREEN_PIN, INPUT);
+ pinMode(BLUE_PIN, INPUT);
+ pinMode(SUBMIT_PIN, INPUT);
+
+ spiral();
+ }
+
+ enum stage {
+ START,
+ FAIL,
+ R,
+ RA,
+ RAI,
+ RAIN,
+ RAINB,
+ RAINBO,
+ WIN,
+ };
+
+ struct state {
+ enum stage progress;
+ bool redPressed;
+ bool orangePressed;
+ bool yellowPressed;
+ bool greenPressed;
+ bool bluePressed;
+ bool submitPressed;
+ };
+
+ void loop() {
+ static struct state s = {START, false, false, false, false, false, false};
+ readButtons(&s);
+ renderState(&s);
+ if(s.submitPressed) { submit(&s); }
+ }
+
+ void spiral() {
+ spiralOn();
+ spiralOff();
+ }
+
+ void spiralOn() {
+ digitalWrite(LED_A, HIGH);
+ delay(100);
+ digitalWrite(LED_B, HIGH);
+ delay(100);
+ digitalWrite(LED_C, HIGH);
+ delay(100);
+ digitalWrite(LED_D, HIGH);
+ delay(100);
+ digitalWrite(LED_E, HIGH);
+ delay(100);
+ digitalWrite(LED_F, HIGH);
+ delay(100);
+ }
+
+ void spiralOff() {
+ digitalWrite(LED_A, LOW);
+ delay(100);
+ digitalWrite(LED_B, LOW);
+ delay(100);
+ digitalWrite(LED_C, LOW);
+ delay(100);
+ digitalWrite(LED_D, LOW);
+ delay(100);
+ digitalWrite(LED_E, LOW);
+ delay(100);
+ digitalWrite(LED_F, LOW);
+ delay(100);
+ }
+
+ void readButtons(struct state* s) {
+ if (digitalRead(RED_PIN) == HIGH) { s->redPressed = true; } else { s->redPressed = false; }
+ if (digitalRead(ORANGE_PIN) == HIGH) { s->orangePressed = true; } else { s->orangePressed = false; }
+ if (digitalRead(YELLOW_PIN) == HIGH) { s->yellowPressed = true; } else { s->yellowPressed = false; }
+ if (digitalRead(GREEN_PIN) == HIGH) { s->greenPressed = true; } else { s->greenPressed = false; }
+ if (digitalRead(BLUE_PIN) == HIGH) { s->bluePressed = true; } else { s->bluePressed = false; }
+ if (digitalRead(SUBMIT_PIN) == HIGH) { s->submitPressed = true; } else { s->submitPressed = false; }
+ }
+
+ void renderIndex(unsigned int index) {
+ if(index > 31) { index = 0; }
+ const int* pattern = *(typeface+index);
+ digitalWrite(LED_A, *pattern++);
+ digitalWrite(LED_B, *pattern++);
+ digitalWrite(LED_C, *pattern++);
+ digitalWrite(LED_D, *pattern++);
+ digitalWrite(LED_E, *pattern++);
+ digitalWrite(LED_F, *pattern++);
+ digitalWrite(LED_G, *pattern++);
+ digitalWrite(LED_H, *pattern++);
+ }
+
+ void renderCharacter(char c) {
+ if(c >= 'A' && c <= 'Z') {
+ renderIndex(c - 'A' + 1);
+ } else if(c >= 'a' && c <= 'z') {
+ renderIndex(c - 'a' + 1);
+ } else {
+ renderIndex(0);
+ }
+ }
+
+ void renderString(char* s) {
+ while (*s) {
+ renderCharacter(*s++);
+ delay(400);
+ }
+ }
+
+ void renderState(const struct state* s) {
+ renderIndex(numberEntered(s));
+ }
+
+ void submit(struct state* s) {
+ switch(s->progress) {
+ case START:
+ if(letterEntered(s) == 'R') { s->progress = R; renderString((char*) "r"); } else { s->progress = FAIL; }
+ break;
+ case R:
+ if(letterEntered(s) == 'A') { s->progress = RA; renderString((char*) "a"); } else { s->progress = FAIL; }
+ break;
+ case RA:
+ if(letterEntered(s) == 'I') { s->progress = RAI; renderString((char*) "i"); } else { s->progress = FAIL; }
+ break;
+ case RAI:
+ if(letterEntered(s) == 'N') { s->progress = RAIN; renderString((char*) "n"); } else { s->progress = FAIL; }
+ break;
+ case RAIN:
+ if(letterEntered(s) == 'B') { s->progress = RAINB; renderString((char*) "b"); } else { s->progress = FAIL; }
+ break;
+ case RAINB:
+ if(letterEntered(s) == 'O') { s->progress = RAINBO; renderString((char*) "o"); } else { s->progress = FAIL; }
+ break;
+ case RAINBO:
+ if(letterEntered(s) == 'W') {
+ s->progress = WIN;
+ renderString((char*) "congrats you have found the pot of gold");
+ } else {
+ s->progress = FAIL;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if(s->progress == FAIL) {
+ renderString((char*) "nope");
+ s->progress = START;
+ }
+ }
+
+ unsigned int numberEntered(const struct state* s) {
+ return (s->redPressed << 0)
+ | (s->orangePressed << 1)
+ | (s->yellowPressed << 2)
+ | (s->greenPressed << 3)
+ | (s->bluePressed << 4);
+ }
+
+ char letterEntered(const struct state* s) {
+ return numberEntered(s) + 'A' - 1;
+ }
+
+<a class="nohover" name="circuit_diagram"></a>
+## Circuit Diagram[^2]
+
+<figure>
+ <img src="/media/rainbow_box_wiring.svg" onerror="this.src='/media/rainbow_box_wiring.png'; this.onerror=null;" />
+ <figcaption>Fig5. Circuit Diagram</figcaption>
+</figure>
+
+<a class="nohover" name="3d_models"></a>
+## 3D Models
+
+I created the panels for the box with 123D design.
+I started by measuring the battery holder since it is the largest component.
+Then I added some buffer and ended up with each panel being 70mm x 70mm x 5mm.
+Next I worked out the joints. This was accomplished by adding 5mm x 5mm x 5mm cubes along each edge of each panel, forming a complete 80mm x 80mm x 80mm box.
+With all of the pieces in place I started merging the cubes along each edge to one of the two adjacent panels, alternating between each panel to form a finger joint.
+When I reached the corners I arbitrarily chose one of the three panels to join the final 8 cubes to.
+
+With the box completed I measured each of the physical components (switches and display).
+Then I placed corresponding holes around the box where I wanted the components to be attached.
+After the model was finished it was just a matter of printing.
+
+<figure>
+ <img src="/media/rainbow_box_model_screenshot.png" />
+ <figcaption>Fig6. Screenshot of box parts in 123D Design </figcaption>
+</figure>
+
+The model file shown in Fig6 can be [downloaded here](/media/rainbow_box.123dx).
+
+<a class="nohover" name="assembly"></a>
+## Assembly
+
+Physically assembling the box was the most challenging aspect of this project.
+While I have spent many years learning how to think in three dimensions and how to model the world in software, I have spent zero time soldering outside of assembling my ergodox[^3].
+A few burnt fingers and ugly solder joints later I managed to build a working prototype.
+
+Once completing the box I realized that I spent zero time considering the mechanical properties of the wires and solder joints.
+This oversight makes the box fragile and replacing the batteries almost always requires pulling out the soldering iron and reattaching wires.
+I have already purchased screw terminals, zipties, and a hot glue gun to avoid the same error when building the next puzzle.
+
+<a class="nohover" name="transportation"></a>
+## Transportation
+
+In order to store and transport the cube I took the assembled puzzle to the container store and tried fitting it into a bunch of different boxes.
+I ended up using one of the cylindrical gift boxes.
+Then I created spacers for the top and bottom to prevent the puzzle from bouncing around.
+I also attached some foam (left over from one of my pelican cases) to the top spacer to reduce damage from any impacts or vibrations.
+
+[^1]: This ordering mechanic was intentionally created to reduce the amount of memorization required for entering letters.
+[^2]: Created with [Fritzing](http://fritzing.org/home/) which was surprisingly intuitive. Highly recommended. NixOS even has a package for it.
+[^3]: Speaking of mechanical keyboards, I should really get around to writing that post.
diff --git a/website/content/posts/2017/10/the_adventure_zone.md b/website/content/posts/2017/10/the_adventure_zone.md
new file mode 100644
index 0000000..1de142a
--- /dev/null
+++ b/website/content/posts/2017/10/the_adventure_zone.md
@@ -0,0 +1,18 @@
++++
+title = "The Adventure Zone"
+tags = ["podcasts", "role playing"]
+type = "link"
+description = "My favorite podcast of 2017."
+external = "http://maximumfun.org/shows/adventure-zone"
+date = "2017-10-29"
++++
+
+I recently started a new job which requires more commuting on the metro and am therefore consuming audio faster than my current slate of podcast subscriptions can fulfill.
+When listening to [Analog(ue) 116](https://www.relay.fm/analogue/116) Myke recommended [The Adventure Zone](http://theadventure.zone), a podcast in which three brothers and their dad play Dungeons and Dragons.
+I downloaded the first campaign, _Here There Be Gerblins_ before Analog(ue) was over.
+By the time I got home I had finished (listening at 2.7x speed of course).
+I was hooked.
+Over the next four weeks I watched my podcast backlog grow as I listened exclusively to The Adventure Zone, even starting again with my wife on flights and car rides.
+
+The first story is now complete and the McElroys are now exploring other role playing systems and taking turns Dungeon Mastering while they search for the next overarching story.
+So far I am enjoying this phase of exploration and the meta story of how to structure a podcast about role playing even more than I did the _Balance_ story. \ No newline at end of file
diff --git a/website/content/posts/micro/217173010632142d8b1cce2cd8e62f0f4ef9ecaa.md b/website/content/posts/micro/217173010632142d8b1cce2cd8e62f0f4ef9ecaa.md
new file mode 100644
index 0000000..a0a4402
--- /dev/null
+++ b/website/content/posts/micro/217173010632142d8b1cce2cd8e62f0f4ef9ecaa.md
@@ -0,0 +1,8 @@
++++
+type = "micro"
+date = "Mon, 30 Oct 2017 17:56:09 -0400"
++++
+
+I wonder if I can come up with a reasonable system for using OpenSCAD from my iPad.
+
+I would probably need a text editor that does syntax highlighting and a remote system for rendering. \ No newline at end of file
diff --git a/website/content/posts/micro/2aa350d608242eeba603a88a761b59f7178f9f30.md b/website/content/posts/micro/2aa350d608242eeba603a88a761b59f7178f9f30.md
new file mode 100644
index 0000000..48090e7
--- /dev/null
+++ b/website/content/posts/micro/2aa350d608242eeba603a88a761b59f7178f9f30.md
@@ -0,0 +1,6 @@
++++
+type = "micro"
+date = "Wed, 08 Nov 2017 14:30:31 -0500"
++++
+
+I can’t decide whether strings or multiple sources of truth are worse. \ No newline at end of file
diff --git a/website/content/posts/micro/cb16aa920be51fb53dc11b7805f60bc708eba4b4.md b/website/content/posts/micro/cb16aa920be51fb53dc11b7805f60bc708eba4b4.md
new file mode 100644
index 0000000..2cfcf9f
--- /dev/null
+++ b/website/content/posts/micro/cb16aa920be51fb53dc11b7805f60bc708eba4b4.md
@@ -0,0 +1,6 @@
++++
+type = "micro"
+date = "Mon, 30 Oct 2017 08:35:11 -0400"
++++
+
+Today I decided to sit down and start experimenting with Workflow.app on my iPad. Working directly with the visual representation of the data flow is a refreshing hinge from having to visualize it myself and serialize those thoughts into text. But I sure do miss my Emacs keybindings.
diff --git a/website/default.nix b/website/default.nix
new file mode 100644
index 0000000..fdca45f
--- /dev/null
+++ b/website/default.nix
@@ -0,0 +1,10 @@
+with import <nixpkgs> {};
+stdenv.mkDerivation rec {
+ name = "rm_web";
+ env = buildEnv { name = name; paths = buildInputs; };
+ buildInputs = [
+ hugo
+ rsync
+ ];
+}
+
diff --git a/website/deploy.sh b/website/deploy.sh
new file mode 100755
index 0000000..921d463
--- /dev/null
+++ b/website/deploy.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+set -e
+
+username="${USERNAME:-}"
+hostname="${HOST:-rm}"
+if [ ! -z $username ]; then
+ username="${username}@"
+fi
+ssh_key_path="${KEYPATH:-$HOME/.ssh/id_rsa}"
+
+hugo --theme=rampantmonkey -d public
+rsync -v -r -e "ssh -i ${ssh_key_path}" -u --delete public/ "${username}${hostname}:rm/"
+rm -r public
diff --git a/website/drafts/free-and-potential-energy.html b/website/drafts/free-and-potential-energy.html
new file mode 100644
index 0000000..dd73fc3
--- /dev/null
+++ b/website/drafts/free-and-potential-energy.html
@@ -0,0 +1,12 @@
+Free and Potential Energy
+=========================
+Type:Article
+Tags: physics, terminology
+
+<p><a href="http://en.wikipedia.org/wiki/Potential_energy">Potential Energy</a> Overview</p>
+
+<p><a href="http://en.wikipedia.org/wiki/Thermodynamic_free_energy">Free Energy</a> Overview</p>
+
+<p>Both are <a href="en.wikipedia.org/wiki/State_function">state functions</a>.</p>
+
+http://cmm.info.nih.gov/intro_simulation/node14.html
diff --git a/website/drafts/getting-started-with-ruby.md b/website/drafts/getting-started-with-ruby.md
new file mode 100644
index 0000000..cf41efd
--- /dev/null
+++ b/website/drafts/getting-started-with-ruby.md
@@ -0,0 +1,26 @@
+Getting Started With Ruby
+Path: getting-started-with-ruby
+Type: Article
+Tags: ruby, OS X
+
+# Installation
+
+I am going to focus on OS X for this post. Installation on Linux follows similar steps. Apple ships their computers with the minimal command line tools necessary, therefore we need to download and install the [XCode Command Line Tools](connect.apple.com) package from Apple's developer portal before continuing. Once there, you will see a prompt for a username and password. Any [Apple ID](https://appleid.apple.com) will work for the login, in other words no need to pay to join Apple's developer program. After logging in, look for the most recent __Command Line Tools (OS X Version)__. Installation follows the same procedure for any other `.dmg` file: double click to open and follow the directions. The Command Line Tools package includes many useful tools - the [clang](http://clang.llvm.org/) compiler toolchain and [make](http://www.gnu.org/software/make/).
+
+While the XCode CLT package is the only requirement for building Ruby [2.0.0-p0](http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/), the experience may be rough for users unfamiliar with the Unix environment. Fortunately there are many tools for simplifying the installation/update process. In the rest of this section I will discuss my preferred setup and explain the rest of the installation process.
+
+A [package manager](http://en.wikipedia.org/wiki/Package_management_system) is a general tool for installing and configuring programs. On OS X I recommend [Homebrew](http://mxcl.github.io/homebrew/). The installation of Homebrew is simple, paste `ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"` into a terminal window and answer the prompts as they appear. The Homebrew webpage explains the process in more detail.
+
+Ruby has many versions and many major implementations. At this stage any recent version of any implementation will do, but we should add the flexibility to switch versions now to avoid recompiling. Currently I use [rbenv](http://rbenv.org/) for the task of switching between versions and [ruby-build](https://github.com/sstephenson/ruby-build)(a plugin for rbenv) for compiling Ruby implementations. Here is where Homebrew will begin to shine. Installing both tools is accomplished with one command, `brew install rbenv ruby-build`.
+
+All that of the prerequisites are now installed we can finally get down to the business of installing Ruby. This step will require two commands: `rbenv install 2.0.0-p0` to fetch and compile the Ruby source code and `rbenv global 2.0.0-p0`.
+
+To test the final result run `ruby -v`. You should see something similar to this: `ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]`.
+
+Now to the fun part, writing code.
+
+# Interactive Ruby
+
+# Executing a Ruby Script
+
+# Further Reading
diff --git a/website/drafts/improving-the-amazing-race.html b/website/drafts/improving-the-amazing-race.html
new file mode 100644
index 0000000..b740b84
--- /dev/null
+++ b/website/drafts/improving-the-amazing-race.html
@@ -0,0 +1,16 @@
+Improving the Amazing Race
+==========================
+Type: Article
+Tags: Television, AmazingRace
+
+One of my favorite television shows is The Amazing Race. The show consists of "Teams of two
+
+
+
+- Mid-leg flights
+- Fast-Forwards on every leg
+- Less equalizers
+- More serious consequences for failing a challenge
+- Bonus: Move it to another night (avoid sporting related delays)
+
+Now for the bonus round. The Amazing Race airs on Sunday evenings. While Sundays are a great day for watching with friends and family, they present a unique challenge. Every Sunday there is a major sporting event - Football in the fall and PGA in the spring - and these competitions frequently overrun their time slot. This causes much frustration, especially when planning snacks, deciding which game to play while we wait, or coercing the dvr to actually record the entire show. CBS has acknowledged this issue and display a banner along the bottom of the screen with the new start time for the evening lineup. Hopefully this season CBS will be able to manage something more useful than a fleeting, microscopic graphic.
diff --git a/website/drafts/migrating-to-git.md b/website/drafts/migrating-to-git.md
new file mode 100644
index 0000000..1413283
--- /dev/null
+++ b/website/drafts/migrating-to-git.md
@@ -0,0 +1,3 @@
+Migrating to Git
+
+
diff --git a/website/drafts/retropsective-2012-edition.md b/website/drafts/retropsective-2012-edition.md
new file mode 100644
index 0000000..f6a1490
--- /dev/null
+++ b/website/drafts/retropsective-2012-edition.md
@@ -0,0 +1,62 @@
+Retrospective 2102 Edition
+Type: Article
+Tags: Editorial
+Summary: A look back on the year that was.
+Published: Mon, 31 Dec 2012 15:41:00 EST
+
+2012 was a big year. Lots of things happened and I learned many things. My hope is that this post will serve as an inspiration for 2013 and beyond.
+
+### Programming
+For Christmas 2011 I recieved a copy of [Seven Languages in Seven Weeks](http://pragprog.com/book/btlang/seven-languages-in-seven-weeks). The book provides (as evidenced by the title) an overview/introduction to seven different programming languages. I made it through the book, but it was not an easy feat. I will be the first to admit that I did not fully understand the book. The final three languages - [Erlang](http://www.erlang.org), [Clojure](http://clojure.com), and [Haskell](http://www.haskell.org/haskellwiki/Haskell) - were brutal for someone with little theoretical experience with programming languages. I learned a lot and plan to revisit Seven Languages over the summer once I finish Algorithms and Compilers. But as far as 2012 is concerned, the most important aspect of Seven Languages was my introduction to the beauty of [Ruby](http://www.ruby-lang.org/en/). I ended up spending the rest of 2012 learning Ruby. Here is my 2012 Ruby reading list.
+
+- [Agile Web Development with Rails](http://pragprog.com/book/rails4/agile-web-development-with-rails)
+- [Build Awesome Command-Line Applications in Ruby](http://pragprog.com/book/dccar/build-awesome-command-line-applications-in-ruby)
+- [Design Patterns in Ruby](http://designpatternsinruby.com)
+- [Eloquent Ruby](http://www.amazon.com/gp/product/B004MMEJ36)
+- [Exceptional Ruby: Master the Art of Handling Failure in Ruby](http://pragprog.com/book/ager/exceptional-ruby)
+- [Humble Little Ruby Book](http://www.humblelittlerubybook.com)
+- [Learn to Program](http://pragprog.com/book/ltp2/learn-to-program)
+- [Metaprogramming Ruby: Program Like the Ruby Pros](http://pragprog.com/book/ppmetr/metaprogramming-ruby)
+- [Poignant Guide](http://mislav.uniqpath.com/poignant-guide/book/)
+- [Practical Object-Oriented Design in Ruby: An Agile Primer](http://www.amazon.com/gp/product/B0096BYG7C)
+- [Programming Ruby 1.9](http://pragprog.com/book/ruby3/programming-ruby-1-9)
+- [Ruby Best Practices](http://blog.rubybestpractices.com/posts/gregory/022-rbp-now-open.html)
+- [Ruby on Rails Tutorial: Learn Rails by Example](http://ruby.railstutorial.org)
+- [Ruby Under a Microscope](http://patshaughnessy.net/ruby-under-a-microscope)
+- [Seven Languages in Seven Weeks](http://pragprog.com/book/btlang/seven-languages-in-seven-weeks)
+- [The Well Grounded Rubyist](http://www.amazon.com/Well-Grounded-Rubyist-David-Black/dp/1933988657)
+
+All of these books provided insight into programming in Ruby and I plan to re-visit the advanced titles as I continue to explore Ruby in 2013.
+
+The most interesting project I created while reading through these books is my static blog engine - [Carmine Contraption](https://github.com/rampantmonkey/carmine_contraption) - which powers this site.
+
+### Photography
+Photography became my new hobby in 2012. For my birthday Rose bought me a DSLR with two lenses ([Nikon D5100](http://www.nikonusa.com/en/Nikon-Products/Product/Digital-SLR-Cameras/25478/D5100.html) with [AF-S DX NIKKOR 18-55mm f/3.5-5.6G VR](http://www.nikonusa.com/en/Nikon-Products/Product/Camera-Lenses/2176/AF-S-DX-NIKKOR-18-55mm-f%252F3.5-5.6G-VR.html) and [AF-S DX NIKKOR 35mm f/1.8G](http://www.nikonusa.com/en/Nikon-Products/Product/Camera-Lenses/2183/AF-S-DX-NIKKOR-35mm-f%252F1.8G.html) in case you were wondering). I have taken 3,465 photos since my birthday. Most of them were out of focus or over exposed, but I had a few good ones and have managed to reduce the frequency of unusable photos with practice. I look forward to exploring more aspects of photography (snow and flowers are the first two that come to mind).
+
+
+### Technology
+In 2012, I decided to begin migrating my workflows to the command line. GUI's became too unreliable, slow to upgrade, and difficult to customize. This pilgrimage began over the summer when Apple released a new laptop ([15" MBP with Retina Display](http://www.apple.com/pr/library/2012/06/11Apple-Introduces-All-New-MacBook-Pro-with-Retina-Display.html)). The new display required developers to rewrite their existing applications, otherwise they would look horrendous. My previously favorite editor failed to upgrade in time for me. I switched to [vim](http://www.vim.org) and haven't looked back. I also switched from bash to [zsh](http://zsh.sourceforge.net) and began using [tmux](http://tmux.sourceforge.net) to manage multiple applications.
+
+The biggest change in my computing experience was realizing that I could change the function of keyboard keys. I knew that it was possible from my gaming days, but applying that idea to text editing was new to me. The most useful change was remapping `capslock`. I mean, what a useless key. It is one of the largest keys and performs a frivilous task (only usable in YouTube comments). It is almost begging to be changed. Steve Losh pointed out one potential use of `capslock` on his [blog](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#controlescape). He proposed that `capslock` be remapped to `control` AND `escape`. I know that it sounds crazy, but read his post and you will see the light.
+
+### Entertainment
+I found many new TV shows that are excellent. Most of them are shows that have ended and I missed, which I tend to prefer. The highlights are [24](http://en.wikipedia.org/wiki/24_(TV_series)), [Battle Star Galactica (2004)](http://en.wikipedia.org/wiki/Battlestar_Galactica_(2004_TV_series)), [The League](http://en.wikipedia.org/wiki/The_league), and [Top Chef](http://en.wikipedia.org/wiki/Top_chef). 2012 also brought the end of two favorites: House and Chuck. House is the first series that I watched from the beginning and ended with good ratings, which provides a new perspective to television. 2012 even had two superb seasons of Survivor - [One World](http://en.wikipedia.org/wiki/Survivor:_One_World) and [Philippines](http://en.wikipedia.org/wiki/Survivor:_Philippines).
+
+Throughout the past year I have realized that video games have lost almost all presence in my life. Instead of Mario Kart we play board games and watch tv; and instead of playing TF2 or Guild Wars I write code. Not sure why this happened, but I found it to be an interesting observation.
+
+One form of entertainment that has not lost prominence is podcasts. I still listen to six or seven each week. This may reduce in 2013 due to the cancellation of two of the best - [Hypercritical](http://5by5.tv/hypercritical) and [Build & Analyze](http://5by5.tv/buildanalyze) (still worth listening to the back catalog). But new podcasts continue to find their way onto my iPhone.
+
+### Personal
+On a more personal level, 2012 was a year which contained many changes. In January I began my final semester at YSU with two classes and working on my thesis. In February I was flown out to South Bend for an admissions interview with the graduate school at Notre Dame. Apparently they liked my answers because I was admited to the program with a full stipend. May marked the end of my Master's degree with a successful defense of my thesis and passing my finals.
+
+On June 1st my wife and I packed up our first apartment and drove seven hours to our new home in South Bend. This was a first for both of us. We had both lived in Pennsylvania for our entire lives. At the end of June we adopted our puppy, Radley. He has provided many learning experiences and is the perfect addition to our family. Throughout the summer I worked as a research assistant on campus and made some new friends. We also explored the local attractions. I even managed to lose my wedding ring in Lake Michigan. Both sets of parents also made a trip out to see us over the summer. They are happy for us, but miss having us fifteen minutes away.
+
+On August 14th Rose and I celebrated our second anniversary by assembling a portable grill and cooking steaks. At the end of August I began my first semester of classes at Notre Dame. I had one class - [Operating Systems](http://rampantmonkey.com/tags/os-f12) - and research. Both went surprisingly well and were excellent experiences. In September Rose started her new job as a therapist working with children suffering with autisim. Every day I am impressed by her patience and willingness to help others.
+
+October brought both of our birthdays. Mine was first and my parents came out to celebrate. They gave me a new game - Agricola - which has provided many weekends ofentertainment. For Rose's birthday traveled by train to Chicago. It was a long day full of walking and excitement. I even managed to take a few [photos](http://rampantmonkey.com/photos/chicago-2012).
+
+2012 was the first year we had our own Thanksgiving. Rose cooked the turkey breast and pumpkin pie while I made the sides and Radley cleaned up the floor . It was crazy, but everything was tasty. I look forward to doing it again next year.
+
+In December I completed my first semester at Notre Dame with a 4.0 GPA (first time ever. I guess it helps to only take one class.). We also made our first trip back to PA despite the snow. Radley loved the car ride and made many new friends (five dogs at the in-law's for Christmas!).
+
+I think that just about does it for my year. Can't wait to see what next year brings. Happy New Year!
diff --git a/website/drafts/test.md b/website/drafts/test.md
new file mode 100644
index 0000000..97f1c0f
--- /dev/null
+++ b/website/drafts/test.md
@@ -0,0 +1,18 @@
+Testing... Testing...
+Type: Article
+Tags: Test
+Summary: Testing.
+
+Testing whether the markdown support works.
+
+Code sample
+ #include<iostream>
+
+ int main(){
+ std::cout << "Hello World.\n";
+ return 0;
+ }
+
+Some __bold text__.
+
+And an image for good luck ![test](test2.jpg)
diff --git a/website/drafts/thinner-is-not-a-feature.html b/website/drafts/thinner-is-not-a-feature.html
new file mode 100644
index 0000000..ae4a370
--- /dev/null
+++ b/website/drafts/thinner-is-not-a-feature.html
@@ -0,0 +1,8 @@
+Thinner Is Not A Feature
+Type: Article
+Tags:
+Summary:
+
+<p>These days every company is advertising their new products as thinner than the last version. Cheif among them is Apple. </p>
+
+<p>Thin is not always a good thing. It removes volume which can be used for batteries. It also makes the device more difficult to hold, sometimes even painful.</p>
diff --git a/website/migrate_posts.sh b/website/migrate_posts.sh
new file mode 100755
index 0000000..b8d5e0c
--- /dev/null
+++ b/website/migrate_posts.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+for f in posts/*
+do
+ bn=${f##*/}
+# echo $bn
+ year=$(echo $bn | cut -c1-4)
+ month=$(echo $bn | cut -c5-6)
+ day=$(echo $bn | cut -c7-8)
+ title=$(echo $bn | cut -c10-)
+ slug=${title%.*}
+ dir=content/$year/$month
+ mkdir -p $dir
+ tmppost=$(cat $f |\
+ grep -v '====' |\
+ grep -v '^Filename:' |\
+ sed -e '1 s/^\(.*\)/title = "\1"/' |\
+ sed -e '1i+++' |\
+ sed -e 's/^[Tt]ype:\s*\(.*\)/type = "\1"/' |\
+ sed -e "s/^[Pp]ublished:\s*\(.*\)/date = \"$year-$month-$day\"/" |\
+ sed -e 's/^[Ss]ummary:\s*\(.*\)/description = \1/' |\
+ sed -e 's/^[Ee]xternal:\s*\(.*\)/external = "\1"/' |\
+ sed -e 's/^[Tt]ags:\s*\(.*\)/tags = [ \1 ]/' |\
+ sed -e 's/^[Tt]itle:\s*\(.*\)/title = [ \1 ]/' |\
+ sed -e "0,/^$/ s/^$/slug = \"${slug}\"\n+++\n/" |\
+ cat -)
+ description="description = \"$(echo "$tmppost" |\
+ grep -m 1 '^description =' |\
+ cut -d'=' -f2- |\
+ sed -e 's/^\s*//' |\
+ sed -e 's/\//\\\//g' |\
+ sed -e 's/\"/\\\\"/g' |\
+ cat -)\""
+ tagline="tags = [ $(echo "$tmppost" |\
+ grep -m 1 '^tags = \[' |\
+ awk -F'=' '{print $2}' |\
+ sed -e "s/\s*\[\s*\(.*\)\s*\]/\1/" |\
+ sed -e "s/^\s*//" |\
+ sed -e "s/\s*$//" |\
+ sed -e "s/\s*,\s*/,/" |\
+ sed -e 's/"//g' -e 's/^\|$/"/g' -e 's/,/","/g' |\
+ cat -) ]"
+ contents=$(echo "$tmppost" |\
+ sed -e "s/^tags = \[.*\]/${tagline}/" |\
+ sed -e "s/^description =.*/${description}/" |\
+ cat -)
+
+ echo "$contents" > $dir/$title
+done
diff --git a/website/serve.sh b/website/serve.sh
new file mode 100755
index 0000000..bdf4fe4
--- /dev/null
+++ b/website/serve.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+hugo server --theme=rampantmonkey --buildDrafts --watch
diff --git a/website/static/css/Junction-webfont.ttf b/website/static/css/Junction-webfont.ttf
new file mode 100644
index 0000000..2d49db0
--- /dev/null
+++ b/website/static/css/Junction-webfont.ttf
Binary files differ
diff --git a/website/static/css/League_Gothic-webfont.ttf b/website/static/css/League_Gothic-webfont.ttf
new file mode 100644
index 0000000..efbe8b4
--- /dev/null
+++ b/website/static/css/League_Gothic-webfont.ttf
Binary files differ
diff --git a/website/static/css/flexgrid.css b/website/static/css/flexgrid.css
new file mode 100644
index 0000000..59c28f9
--- /dev/null
+++ b/website/static/css/flexgrid.css
@@ -0,0 +1,77 @@
+.scaffold {
+ font: normal 100% Cambria, Georgia, serif;
+ width: 97.5%;
+ max-width: 1248px;
+ margin: 0 auto;
+ clear: both;
+}
+
+.grid1, .grid2, .grid3, .grid4, .grid5, .grid6, .grid7, .grid8, .grid9, .grid10, .grid11, .grid12, .grid13, .grid14, .grid15, .grid16 {
+ float: left;
+ margin: 0 1.20192308%;
+ margin-bottom: 1.875em;
+}
+
+.grid1 {
+ width: 3.846153846153%;
+}
+
+.grid2 {
+ width: 10.096153846153%;
+}
+
+.grid3 {
+ width: 16.346153846153%;
+}
+
+.grid4 {
+ width: 22.596153846153%;
+}
+
+.grid5 {
+ width: 28.846153846153%;
+}
+
+.grid6 {
+ width: 35.096153846153%;
+}
+
+.grid7 {
+ width: 41.346153846153%;
+}
+
+.grid8 {
+ width: 47.596153846153%;
+}
+
+.grid9 {
+ width: 53.846153846153%;
+}
+
+.grid10 {
+ width: 60.096153846153%;
+}
+
+.grid11 {
+ width: 66.346153846153%;
+}
+
+.grid12 {
+ width: 72.596153846153%;
+}
+
+.grid13 {
+ width: 78.846153846153%;
+}
+
+.grid14 {
+ width: 85.096153846153%;
+}
+
+.grid15 {
+ width: 91.346153846153%;
+}
+
+.grid16 {
+ width: 97.596153846153%;
+}
diff --git a/website/static/css/ie.css b/website/static/css/ie.css
new file mode 100644
index 0000000..57f3b3a
--- /dev/null
+++ b/website/static/css/ie.css
@@ -0,0 +1,3 @@
+*:first-child+html .group {
+ min-height: 1px;
+} \ No newline at end of file
diff --git a/website/static/css/master.css b/website/static/css/master.css
new file mode 100644
index 0000000..6469d67
--- /dev/null
+++ b/website/static/css/master.css
@@ -0,0 +1,663 @@
+@font-face {
+ font-family: junction;
+ src: url('Junction-webfont.ttf');
+}
+
+@font-face {
+ font-family: league_gothic;
+ src: url('League_Gothic-webfont.ttf');
+}
+
+.group:after {
+ content: ".";
+ display:block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+body {
+ background: #fff;
+ font: 130%/198% junction, Georgia, sans-serif;
+ color: #444444;
+}
+
+body.land {
+ background: #fff;
+}
+
+nav {
+ display: block;
+ width: 100%;
+ text-align: center;
+}
+
+nav.alt {
+ text-align: right;
+}
+
+nav a {
+ margin: 0.2em;
+ font-family: league_gothic;
+ font-size: 1.5em;
+ text-align: center;
+ background: none;
+ text-decoration: none;
+ padding: 0.3em;
+ border: none;
+ border-radius: 0.5em;
+}
+nav a:visited {
+ color: #733e1a;
+}
+nav.alt a {
+ color: #733e1a;
+ -webkit-transition: border .2s linear;
+ -moz-transition: border .2s linear;
+ transition: border .2s linear;
+}
+
+.land nav a img {
+ margin-top: 1.6em;
+ height: 1.8em;
+}
+
+nav a:hover {
+ background: none;
+ border-bottom: 0.5em solid #733e1a;
+ border-radius: 0
+}
+nav.alt a:hover {
+ background: none;
+ border-bottom: 0.5em solid #ffdab9;
+ border-radius: 0;
+}
+
+nav a.current {
+ background: none;
+ border-bottom: 0.5em solid #222222;
+ border-radius: 0;
+}
+nav.alt a.current {
+ background: none;
+ border-bottom: 0.5em solid #ffdab9;
+ border-radius: 0;
+}
+
+.yt-frame {
+ display: block;
+ max-width: 100%;
+ margin: 0 auto;
+}
+
+a.logo-wrap {
+ position: relative;
+ display: inline-block;
+}
+
+a.logo-wrap:after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+}
+
+a, a:visited {
+ background: #dddedb;
+ color: #444444;
+ text-decoration: none;
+ border-bottom: 1px solid #50514B;
+ padding: 0.15em 0.25em;
+ border-radius: 0.1em 0.1em 0 0;
+ line-height: 1.6em;
+ -webkit-transition: background .4s linear;
+ -moz-transition: background .4s linear;
+ transition: background .4s linear;
+}
+a.nohover, a.nohover:visited {
+ background: none;
+ border: none;
+}
+a:hover {
+ background: #FEFFF8;
+}
+a.nohover:hover {
+ background: none;
+ border-bottom: none;
+}
+
+.indivisible {
+ white-space: nowrap;
+}
+
+emph {
+ color: #733e1a;
+ font-style: italic;
+ font-weight: bold;
+}
+
+article {
+ margin-bottom: 2em;
+ border-bottom: 1px solid #dddddd;
+}
+
+article h1 {
+ font-size: 3em;
+ line-height: 1em;
+}
+
+article .thetitle {
+ font-size: 0.8em;
+ line-height: 0.9em;
+ margin-bottom: 0;
+}
+
+article .thetitle a {
+ border-bottom: none;
+ padding: 0;
+}
+
+article img {
+ background: transparent;
+ margin: 0 auto;
+ display: block;
+}
+
+article .postbody {
+ width: 97.596153846153%;
+}
+
+article .metadata {
+ width: 97.596153846153%;
+ text-align: left;
+ font-size: 0.9em;
+ margin-bottom: 1em;
+}
+
+article span.tag {
+ font-size: .75em;
+ line-height: 1.1em;
+ margin-bottom: .4em;
+}
+
+article span:after {
+ content: ", ";
+ font-weight: bold;
+}
+
+article span:last-child:after {
+ display: none;
+}
+
+article .permalink {
+ font-size: 1.2em;
+ color: #733e1a;
+}
+
+article .date {
+ font-size: .9em;
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+article .thetitle span {
+ color: #aaaaaa;
+}
+
+article ul {
+ list-style: disc;
+}
+article ul li {
+ margin-bottom: 0.3em;
+}
+
+blockquote {
+ padding: 13px;
+ border: 1px solid #dddddd;
+ border-left: 7px solid #ffdab9;
+ border-top-left-radius: 5px;
+ border-bottom-left-radius: 5px;
+ background: #f6f6f6;
+ margin-bottom: 15px;
+}
+
+p {
+ margin-bottom: .2em;
+}
+p + p {
+ text-indent: 1.5em;
+ margin-top: 0.75em;
+}
+
+img {
+ max-width: 100%;
+}
+
+p + p img {
+ position: relative;
+ left: -1.5em;
+}
+
+
+img.aligncenter {
+ margin: 11px auto;
+}
+img.alignleft {
+ float: left;
+ margin-right: 3em;
+ margin-bottom: 3em;
+ display: inline;
+}
+img.alignright {
+ float: right;
+ margin-left: 3em;
+ margin-bottom: 3em;
+ display: inline;
+}
+
+video {
+ max-width: 95%;
+}
+
+h1.archive {
+ font-size: 2em;
+ color: #888888;
+ text-align: center;
+}
+
+h1.archive emph {
+ color: #444444;
+}
+
+hr.subtleSep {
+ border: 1px solid #dddddd;
+ margin: 2em 0;
+ width: 100%;
+}
+
+pre {
+ display:block;
+ clear: both;
+ white-space: pre-wrap;
+ border: 1px solid #cfcfcf;
+ border-radius: 0.3em;
+ padding: 0.7em;
+ text-align: left;
+ background: #f6f6f6;
+}
+
+code {
+ font-family: monospace;
+ font-size: 115%;
+ border: 1px solid #cfcfcf;
+ border-radius: 0.3em;
+ padding: 0 0.5em;
+ line-height: 1.1em;
+ text-align: left;
+ background: #f6f6f6;
+ position: relative;
+ top: -0.07em;
+}
+
+pre code {
+ border: none;
+ top: 0;
+ display: block;
+}
+
+.projects {
+ background: #f6f6f6;
+ background-image: -webkit-linear-gradient(#eeeeee,#f6f6f6);
+ background-image: -moz-linear-gradient(#eeeeee,#f6f6f6);
+ margin-bottom: 2em;
+ float: left;
+ display: block;
+ height: 18em;
+}
+
+section.projects {
+ width: 97.5%;
+ margin: 1em 1.20192308%;
+}
+
+.projects h3 {
+ font-size: 1.5em;
+ padding-top: .2em;
+ padding-left: .2em;
+}
+
+.projects img {
+ max-width: 50%;
+ max-height: 30%;
+ position: relative;
+ display: block;
+ margin: 0.8em auto;
+}
+
+.projects span {
+ float: left;
+ clear: left;
+ width: 90%;
+ margin: 1% 5%;
+ height: 30%;
+}
+
+.projects a {
+ display: block;
+ font-size: 1.2em;
+ text-align: center;
+ color: #34cbfe;
+}
+
+.border_alt {
+ height: 0.6em;
+ background: none;
+}
+
+.banner {
+ height: 100vh;
+ max-height: 512px;
+ background: #1a4f73;
+}
+
+.banner object {
+ margin: 1.3em auto;
+ display: block;
+ width: 7em;
+ height: 7em;
+}
+
+.banner p {
+ text-align: center;
+ text-indent: 0;
+ font-size: 1.2em;
+ font-weight: 100;
+ color: #ddd;
+ margin-bottom: 0.3em;
+ -moz-transition: all .5s linear;
+ -webkit-transition: all .5s linear;
+ transition: all .5s linear;
+}
+
+.banner b {
+ font-weight: 900;
+ font-size: 1.2em;
+ color: #fff;
+}
+
+.content {
+ padding-top: 1.2em;
+}
+
+.teaser {
+ margin-top: 3em;
+}
+
+.teaser div {
+ width: 97.596153846153%;
+ -moz-transition: all .5s linear;
+ -webkit-transition: all .5s linear;
+ transition: all .5s linear;
+}
+
+
+h1, h2, h3, h4, h5, h6 {
+ font: 1.5em league_gothic, Impact, Helvetica, sans-serif;
+ color: #733e1a;
+}
+
+.footer {
+ margin-top: 8em;
+ padding: 0.7em 0;
+ font-size: 0.9em;
+ line-height: 1.5em;
+ text-align: center;
+}
+
+.footer p {
+ margin: 0.3em;
+ text-indent: 0;
+}
+
+.tag_cloud {
+ font-size: 1.3em;
+ width: 35.096153846153%;
+ margin: 0 auto;
+ text-align: center;
+}
+
+.tag_cloud > span {
+ white-space: nowrap;
+}
+
+.oncanvas {
+ display: none;
+}
+
+.logo {
+ height: 3em;
+ width: 3em;
+}
+
+::selection {
+ background: #ffdab9; /* Safari */
+}
+::-moz-selection {
+ background: #ffdab9; /* Firefox */
+}
+
+.footnotes {
+ font-size: 0.7em;
+}
+
+.footnotes hr {
+ border: 1px solid #dddddd;
+ margin: 2em 0;
+ width: 100%;
+}
+
+.footnotes ol {
+ list-style-type: decimal;
+ margin-left: 1.4em;
+}
+
+.footnotes a:last-child {
+ vertical-align: top;
+ font-size: 0.7em;
+}
+
+.paginator {
+ width: 100%;
+ text-align: center;
+}
+
+sup a {
+ vertical-align: top;
+ font-size: 0.7em;
+}
+
+video {
+ display: block;
+ margin: 1em auto;
+}
+
+figure {
+ margin: 1.1em auto;
+ display: block;
+}
+
+figure table {
+ margin: 0 auto;
+ border-collapse: separate;
+}
+
+figure thead {
+ font-weight: bold;
+}
+
+figure th {
+ padding: 0.4em 1.3em;
+}
+
+figure tr:nth-child(even) {
+ background: #dddedb;
+}
+
+figure td {
+ text-align: center;
+ padding: 0.4em 0.2em;
+}
+
+figure svg {
+ margin: auto;
+ display: block;
+}
+
+figure img {
+ width: 97.5%;
+ margin: 0.6em auto;
+}
+
+figcaption {
+ max-width: 75%;
+ margin: 0.5em auto 1.3em;
+ text-align: center;
+}
+
+.warning {
+ padding: 0.5em 1.3em;
+ background: #bc3e3e;
+ color: #fff;
+ border-radius: 0.5em;
+ margin: 0.8em 1.5em;
+}
+
+.warning h1 {
+ color: #fff;
+ font-size: 1.4em;
+}
+
+.warning hr {
+ border-top: solid 0.1em #fff;
+}
+
+.note {
+ padding: 0.5em 1.3em;
+ background: #1a4f73;
+ color: #fff;
+ border-radius: 0.5em;
+ margin: 0.8em 1.5em;
+}
+
+.note h1 {
+ color: #fff;
+ font-size: 1.4em;
+}
+
+.note hr {
+ border-top: solid 0.1em #fff;
+}
+
+@media (min-width: 520px) {
+ .teaser div {
+ width: 47.596153846153%;
+ height: 12em;
+ }
+ .teaser p {
+ height: 8em;
+ }
+
+ section.projects {
+ width: 47.596153846153%;
+ }
+
+ .banner p {
+ font-size: 1.70em;
+ }
+
+ .land nav a img {
+ height: 2.6em;
+ margin: 1.6em 1.8em 0;
+ }
+
+ article .metadata {
+ width: 10.096153846153%;
+ clear: left;
+ font-size: 0.9em;
+ text-align: center;
+ }
+
+ article .metadata span {
+ float: left;
+ clear: left;
+ width: 100%;
+ }
+
+ article .permalink {
+ font-size: 3em;
+ line-height: .8em;
+ display: block;
+ text-align: center;
+ }
+
+ article .postbody {
+ width: 85.096153846153%;
+ }
+
+
+ article span:after {
+ display: none;
+ }
+
+ article .thetitle {
+ font-size: 1.4em;
+ line-height: 1.8em;
+ margin-left: 13.7019230862%;
+ margin-bottom: 1em;
+ }
+}
+
+@media (min-width: 1030px) {
+ .teaser div {
+ width: 22.596153846153%;
+ }
+
+ .teaser p {
+ height: 8em;
+ }
+
+ .land nav a img {
+ height: 4.3em;
+ margin: 1.6em 2.5em 0;
+ }
+
+ section.projects {
+ width: 30.9294871733%;
+ }
+
+ .banner object {
+ width: 10em;
+ height: 10em;
+ transition: border .2s linear;
+ }
+
+ .banner {
+ padding-bottom: 1em;
+ }
+
+ .banner p {
+ font-size: 2.3em;
+ }
+
+ .oncanvas {
+ display: block;
+ float: right;
+ }
+
+ .logo {
+ height: 6em;
+ width: 6em;
+ }
+}
diff --git a/website/static/css/photo.css b/website/static/css/photo.css
new file mode 100644
index 0000000..fd7879f
--- /dev/null
+++ b/website/static/css/photo.css
@@ -0,0 +1,165 @@
+#photos div.eventPhotos {
+ width: 784px;
+ margin-left: 116px;
+ padding-top: 65px;
+}
+#photos a.imgContainer {
+ position: relative;
+ display: block;
+ float: left;
+ margin: -13px;
+ z-index: 5;
+ -webkit-transition: all 1.3s linear 0.1s;
+ -moz-transition: all 1.3s linear 0.1s;
+}
+#photos .r0 {
+ -webkit-transform: rotate(-13deg);
+ -moz-transform: rotate(-13deg);
+ transform: rotate(-13deg);
+}
+#photos .r1 {
+ -webkit-transform: rotate(-5deg);
+ -moz-transform: rotate(-5deg);
+ transform: rotate(-5deg);
+}
+#photos .r2 {
+ -webkit-transform: rotate(1deg);
+ -moz-transform: rotate(-1deg);
+ transform: rotate(1deg);
+}
+#photos .r3 {
+ -webkit-transform: rotate(5deg);
+ -moz-transform: rotate(5deg);
+ transform: rotate(5deg);
+}
+#photos .r4 {
+ -webkit-transform: rotate(-13deg);
+ -moz-transform: rotate(-13deg);
+ transform: rotate(-13deg);
+}
+#photos a.imgContainer:hover, #photos a.imgContainer:focus, #photos a.imgContainer:active {
+ z-index: 7;
+ -webkit-transform: rotate(0deg);
+ -webkit-transform: scale(1.3);
+ -moz-transform: rotate(0deg);
+ -moz-transform: scale(1.3);
+ background: transparent;
+ border-bottom: none;
+ -moz-box-shadow: 0 0 33px #111111;
+ -webkit-box-shadow: 0 0 33px #111111;
+}
+#photos img.landscape {
+ width: 240px;
+ height: auto;
+}
+#photos img.portrait {
+ height: 240px;
+ width: auto;
+}
+#photos img {
+ margin: 0 auto;
+ -moz-box-shadow: 0 0 13px #888888;
+ -webkit-box-shadow: 0 0 13px #888888;
+ margin: -8px 0;
+}
+
+#photos .bubble {
+ clear: both;
+ margin: 0 auto;
+ background: #f6f6f6 url('/media/cork.jpg') repeat;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+ width: 1000px;
+ -moz-box-shadow: 0 0 8px rgba(0,0,0,0.3);
+ -webkit-box-shadow: 0 0 8px rgba(0,0,0,0.3);
+ position: relative;
+ z-index: 90;
+ padding-bottom: 43px;
+}
+
+#photos .rectangle {
+ background: #733e1a;
+ height: 2.307em;
+ width: 1050px;
+ position: relative;
+ left: -25px;
+ float: left;
+ -moz-box-shadow: 0 0 4 rgba(0,0,0,0.55);
+ -webkit-box-shadow: 0 0 4 rgba(0,0,0,0.55);
+ z-index: 100;
+}
+
+#photos .rectangle h2 {
+ font-size: 1.538em;
+ color: #ffdab9;
+ padding-top: .3077em;
+ text-shadow: 1px 1px 2px rgba(0,0,0,0.2);
+ text-align: center;
+}
+
+#photos .triangleL {
+ border-color: transparent #3a1f0d transparent transparent;
+ border-style: solid;
+ border-width: 25px;
+ height: 0px;
+ width: 0px;
+ position: relative;
+ float: left;
+ clear: left;
+ left: -50px;
+ top: 25px;
+ z-index: -1;
+}
+
+#photos .triangleR {
+ border-color: transparent transparent transparent #2a1f0d;
+ border-style: solid;
+ border-width: 25px;
+ height: 0px;
+ width: 0px;
+ position: relative;
+ float: left;
+ left: 1000px;
+ top: -73px;
+ z-index: -1;
+}
+
+#photos .postcard {
+ display: block;
+ float: left;
+ color: #733e1a;
+ width: 450px;
+ height: 250px;
+ z-index: 1;
+ margin-left: 25px;
+ margin-top: 50px;
+ overflow: hidden;
+}
+#photos .postcard:hover {
+ border-bottom: 0;
+ background: transparent;
+}
+
+#photos .postcard img {
+ height: 100%;
+ width: 100%;
+}
+
+#photos .postcard .title {
+ position: relative;
+ top: -270px;
+ left: -50px;
+ font-size: 1.4em;
+ color: #ffdab9;
+ background: #733e1a;
+ padding: 5px 35px;
+ -webkit-transform: rotate(-35deg);
+ -moz-transform: rotate(-35deg);
+ transform: rotate(-35deg);
+}
+
+#photos a {
+ background: none;
+ padding: 0;
+ border: none;
+}
diff --git a/website/static/css/reset.css b/website/static/css/reset.css
new file mode 100644
index 0000000..c80d5c3
--- /dev/null
+++ b/website/static/css/reset.css
@@ -0,0 +1,26 @@
+html, body, div, span, h1, h2, h3, h4, h5, h6, p, q, a, code, blockquote, img, ol, ou, li, form, table, td, th, tr, article, section{
+ padding: 0;
+ margin: 0;
+ font-size: 100%;
+ vertical-align: baseline;
+ border: 0;
+ outline: 0;
+ background: transparent;
+}
+
+ol, ul{
+ list-style: none;
+}
+
+blockquote, q{
+ quotes: none;
+}
+
+:focus{
+ outline: 0;
+}
+
+table{
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/website/static/css/screen.css b/website/static/css/screen.css
new file mode 100644
index 0000000..eebf949
--- /dev/null
+++ b/website/static/css/screen.css
@@ -0,0 +1,5 @@
+/* import stylesheets and hide from IE/Mac \*/
+@import url("reset.css");
+@import url("flexgrid.css");
+@import url("master.css");
+/* end import/hide */
diff --git a/website/static/gpg/caseyrobinson.public.gpg-key b/website/static/gpg/caseyrobinson.public.gpg-key
new file mode 100644
index 0000000..7437a57
--- /dev/null
+++ b/website/static/gpg/caseyrobinson.public.gpg-key
@@ -0,0 +1,203 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+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
+=D3Yq
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/website/static/gpg/gpg-transition-statement-2015-06.txt b/website/static/gpg/gpg-transition-statement-2015-06.txt
new file mode 100644
index 0000000..8f9c693
--- /dev/null
+++ b/website/static/gpg/gpg-transition-statement-2015-06.txt
@@ -0,0 +1,64 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+Sun 14 Jun 2015
+
+For a number of reasons, I've recently set up a new OpenPGP key, and will be transitioning away from my old one.
+
+The old key will continue to be valid for some time, but I prefer all future correspondence to come to the new one. I would also like this new key to be re-integrated into the web of trust. This message is signed by both keys to certify the transition.
+
+The old key was:
+
+pub rsa4096/41DE81A9 2013-07-03
+ Key fingerprint = 42E4 3543 BBC6 AC9B D99D 6E10 92A7 599A 41DE 81A9
+
+And the new key is:
+
+pub rsa4096/D119CD2B 2015-06-14 [expires: 2016-06-13]
+ Key fingerprint = 35BC BE03 CA63 87B5 2349 5EE0 BAD7 5204 D119 CD2B
+
+To fetch the full key you can get it with:
+
+ wget -q -O- http://rampantmonkey.com/gpg/caseyrobinson.public.gpg-key | gpg --import -
+
+Or, to fetch my new key from a public key servery, you can simply do:
+
+ gpg --keyserver pgp.mit.edu --recv-key D119CD2B
+
+If you already know my old key, you can now verify that the new key is signed by the old one:
+
+ gpg --check-sigs D119CD2B
+
+If you don't already know my old key, or you just want to be double extra paranoid, you can check the fingerprint against the one above:
+
+ gpg --fingerprint D119CD2B
+
+If you are satisfied that you've got the right key, and the UIDs match what you expect, I'd appreciate it if you would sign my key:
+
+ gpg --sign-key D119CD2B
+
+Lastly, if you could upload these signatures, I would appreciate it. You can either send me an email with the new signatures (if you have a functional MTA on your system):
+
+ gpg --armor --export D119CD2B | mail -s 'OpenPGP Signatures' casey at rampantmonkey.com
+
+Or you can just upload the signatures to a public keyserver directly:
+
+ gpg --keyserver pgp.mit.edu --send-key D119CD2B
+
+Please let me know if there is any trouble, and sorry for the inconvenience.
+
+Regards,
+ Casey Robinson
+
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2
+
+iQEcBAEBCAAGBQJVfjzCAAoJEPpdmdoZJ3eMogYH/3RskhZ9JXEqDl+ncU6Igbfp
++12XIWLfrVQMfi57E/YTKfIiZjEFscZK0+/EXysmOCcmLaEhXuuEwlvQ4spYvgLN
+d6/dNLgkm4+/Jnfs8sBCd4/vsZfREgGlJpk4kzOOlJZ3Vc80pb4Jv59lM4Tgo//4
+XH2n3gT19/U/dKssAGMjxVDe9VnkynmmT0xtq12drwifwQEn34yTqK0RCxMaPI9b
+JYPRXw2pLlOedgqnaf2rcCHdv8tDZcVEcnO2wxjW6/EbbLadfMgJg8+ThpurJt9/
+J9kQ7DX0k1DVOgJ9ktuIdyJRku+2kpEVS34zNld5Q1Wg5A4LeRh7/yTGGfLf8Qs=
+=yeEH
+-----END PGP SIGNATURE-----
diff --git a/website/static/media/9_player_map.jpg b/website/static/media/9_player_map.jpg
new file mode 100644
index 0000000..a47b82b
--- /dev/null
+++ b/website/static/media/9_player_map.jpg
Binary files differ
diff --git a/website/static/media/9_player_map_780x993.jpg b/website/static/media/9_player_map_780x993.jpg
new file mode 100644
index 0000000..099f910
--- /dev/null
+++ b/website/static/media/9_player_map_780x993.jpg
Binary files differ
diff --git a/website/static/media/DSC03098-320x179.jpg b/website/static/media/DSC03098-320x179.jpg
new file mode 100644
index 0000000..f187b8d
--- /dev/null
+++ b/website/static/media/DSC03098-320x179.jpg
Binary files differ
diff --git a/website/static/media/DSC03106-320x179.jpg b/website/static/media/DSC03106-320x179.jpg
new file mode 100644
index 0000000..f70b348
--- /dev/null
+++ b/website/static/media/DSC03106-320x179.jpg
Binary files differ
diff --git a/website/static/media/DSC03119-320x179.jpg b/website/static/media/DSC03119-320x179.jpg
new file mode 100644
index 0000000..f75c7a5
--- /dev/null
+++ b/website/static/media/DSC03119-320x179.jpg
Binary files differ
diff --git a/website/static/media/DSC03151-320x179.jpg b/website/static/media/DSC03151-320x179.jpg
new file mode 100644
index 0000000..0c07778
--- /dev/null
+++ b/website/static/media/DSC03151-320x179.jpg
Binary files differ
diff --git a/website/static/media/DSC03170-320x179.jpg b/website/static/media/DSC03170-320x179.jpg
new file mode 100644
index 0000000..f8751c2
--- /dev/null
+++ b/website/static/media/DSC03170-320x179.jpg
Binary files differ
diff --git a/website/static/media/Slide1.png b/website/static/media/Slide1.png
new file mode 100644
index 0000000..73057a0
--- /dev/null
+++ b/website/static/media/Slide1.png
Binary files differ
diff --git a/website/static/media/Slide10.png b/website/static/media/Slide10.png
new file mode 100644
index 0000000..8115766
--- /dev/null
+++ b/website/static/media/Slide10.png
Binary files differ
diff --git a/website/static/media/Slide11.png b/website/static/media/Slide11.png
new file mode 100644
index 0000000..6940839
--- /dev/null
+++ b/website/static/media/Slide11.png
Binary files differ
diff --git a/website/static/media/Slide12.png b/website/static/media/Slide12.png
new file mode 100644
index 0000000..971d50e
--- /dev/null
+++ b/website/static/media/Slide12.png
Binary files differ
diff --git a/website/static/media/Slide2.png b/website/static/media/Slide2.png
new file mode 100644
index 0000000..e8b8833
--- /dev/null
+++ b/website/static/media/Slide2.png
Binary files differ
diff --git a/website/static/media/Slide3.png b/website/static/media/Slide3.png
new file mode 100644
index 0000000..e8db9b7
--- /dev/null
+++ b/website/static/media/Slide3.png
Binary files differ
diff --git a/website/static/media/Slide4.png b/website/static/media/Slide4.png
new file mode 100644
index 0000000..c5e92d0
--- /dev/null
+++ b/website/static/media/Slide4.png
Binary files differ
diff --git a/website/static/media/Slide5.png b/website/static/media/Slide5.png
new file mode 100644
index 0000000..eba70d0
--- /dev/null
+++ b/website/static/media/Slide5.png
Binary files differ
diff --git a/website/static/media/Slide6.png b/website/static/media/Slide6.png
new file mode 100644
index 0000000..888df33
--- /dev/null
+++ b/website/static/media/Slide6.png
Binary files differ
diff --git a/website/static/media/Slide7.png b/website/static/media/Slide7.png
new file mode 100644
index 0000000..e97d074
--- /dev/null
+++ b/website/static/media/Slide7.png
Binary files differ
diff --git a/website/static/media/Slide8.png b/website/static/media/Slide8.png
new file mode 100644
index 0000000..965b80a
--- /dev/null
+++ b/website/static/media/Slide8.png
Binary files differ
diff --git a/website/static/media/Slide9.png b/website/static/media/Slide9.png
new file mode 100644
index 0000000..acfc6f5
--- /dev/null
+++ b/website/static/media/Slide9.png
Binary files differ
diff --git a/website/static/media/TM-Restore-320x240.png b/website/static/media/TM-Restore-320x240.png
new file mode 100644
index 0000000..f7c9b49
--- /dev/null
+++ b/website/static/media/TM-Restore-320x240.png
Binary files differ
diff --git a/website/static/media/absorbance-curve.png b/website/static/media/absorbance-curve.png
new file mode 100644
index 0000000..f0719fd
--- /dev/null
+++ b/website/static/media/absorbance-curve.png
Binary files differ
diff --git a/website/static/media/absorptionProb_full.png b/website/static/media/absorptionProb_full.png
new file mode 100644
index 0000000..f42e5be
--- /dev/null
+++ b/website/static/media/absorptionProb_full.png
Binary files differ
diff --git a/website/static/media/arryn_cards.jpg b/website/static/media/arryn_cards.jpg
new file mode 100644
index 0000000..6b692b9
--- /dev/null
+++ b/website/static/media/arryn_cards.jpg
Binary files differ
diff --git a/website/static/media/arryn_cards_762x604.jpg b/website/static/media/arryn_cards_762x604.jpg
new file mode 100644
index 0000000..84c1d4e
--- /dev/null
+++ b/website/static/media/arryn_cards_762x604.jpg
Binary files differ
diff --git a/website/static/media/background_position.png b/website/static/media/background_position.png
new file mode 100644
index 0000000..58cc914
--- /dev/null
+++ b/website/static/media/background_position.png
Binary files differ
diff --git a/website/static/media/background_repeat.png b/website/static/media/background_repeat.png
new file mode 100644
index 0000000..17c8114
--- /dev/null
+++ b/website/static/media/background_repeat.png
Binary files differ
diff --git a/website/static/media/beforeAndAfter-276x300.png b/website/static/media/beforeAndAfter-276x300.png
new file mode 100644
index 0000000..a46a22d
--- /dev/null
+++ b/website/static/media/beforeAndAfter-276x300.png
Binary files differ
diff --git a/website/static/media/camera.svg b/website/static/media/camera.svg
new file mode 100644
index 0000000..97204ea
--- /dev/null
+++ b/website/static/media/camera.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ width="285.62384"
+ height="209.71681"
+ sodipodi:docname="camera.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1152"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="2.0154744"
+ inkscape:cx="102.15466"
+ inkscape:cy="86.275161"
+ inkscape:window-x="1920"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <path
+ style="fill:#733e1a;fill-opacity:1"
+ d="M 132.16023,1.0529587e-4 C 120.1663,-0.0157847 111.34577,1.7665633 103.72069,5.4893563 99.120175,7.7354603 92.413826,10.548918 88.821293,11.710506 82.298951,13.819415 77.254679,19.027282 75.33342,25.721165 c -0.883014,3.076522 -0.146882,3.6909 5.54153,4.600514 9.848095,1.574782 10.233668,5.537832 0.888735,9.671536 -6.240088,2.760243 -10.391191,3.294237 -21.747887,2.823043 -12.382311,-0.513718 -14.010876,-0.242857 -14.010658,2.300258 1.84e-4,2.08507 -2.657185,3.625942 -9.619251,5.541528 -17.182973,4.727845 -24.355995,7.87274 -30.4261319,13.435598 L 0,69.582892 0.4182286,83.488997 c 2.1407952,68.208883 3.8781502,92.674373 6.8484935,96.767643 5.8146989,8.01287 32.4498169,22.0285 52.5922399,27.65536 10.636674,2.97138 21.951481,2.20168 26.348401,-1.77747 3.086745,-2.79346 3.293551,-5.37581 3.293551,-44.27995 0,-23.65702 0.700332,-43.38471 1.672914,-46.16198 0.934156,-2.66758 3.945397,-6.11757 6.691657,-7.68495 5.195865,-2.96549 5.829945,-5.24851 5.332425,-18.924853 -0.23547,-6.4727 -0.16295,-6.51447 1.56835,-1.98658 2.77871,7.26747 -0.11158,19.824363 -5.123305,22.322953 -2.22156,1.10759 -4.86068,3.39324 -5.855198,5.07102 -1.090356,1.83947 -2.013671,17.14659 -2.352535,38.58159 -0.471043,29.79672 -0.193825,35.71393 1.829749,36.49045 1.869664,0.71746 38.904819,-9.91273 40.986409,-11.76268 0.2534,-0.22521 -1.44095,-4.07324 -3.76405,-8.57369 -6.06449,-11.74854 -8.68874,-32.46294 -6.16888,-48.67135 2.25684,-14.5166 9.30018,-30.177913 17.87927,-39.836281 l 5.95976,-6.691657 -6.79621,10.769385 c -3.72063,5.91253 -7.84631,14.46754 -9.20104,19.029403 -6.10384,20.55388 -4.50184,46.67833 3.81635,62.00239 4.40718,8.11913 5.22425,8.68107 28.59637,19.81358 13.23518,6.30415 24.31124,11.18591 24.62322,10.87394 0.31194,-0.31194 -1.17581,-3.15763 -3.29355,-6.3257 -13.27446,-19.8581 -10.94353,-57.8085 5.17557,-85.00496 11.67166,-19.692703 32.65726,-35.340324 47.46895,-35.340324 8.72368,0 6.33044,-2.768323 -4.96647,-5.698365 -6.21814,-1.612774 -12.25413,-3.504388 -13.43559,-4.234566 -1.18147,-0.730193 -3.83805,-6.345314 -5.90748,-12.494582 l -3.76406,-11.187615 5.07102,-3.973172 c 4.64033,-3.631612 4.92227,-4.383253 3.08445,-8.41685 C 214.54234,14.869906 183.74962,4.6074413 150.66685,1.1502343 143.72655,0.4249633 137.61203,0.0073493 132.16023,1.0529587e-4 z M 206.08215,21.434322 c 7.00198,-0.121605 8.91216,0.4511 10.40343,2.247978 3.12866,3.769795 0.66299,6.014579 -8.52141,7.789508 -3.98443,0.770025 -14.26734,1.476095 -22.84573,1.516078 -13.94968,0.06516 -15.50602,-0.268335 -15.00396,-2.875321 0.93956,-4.878687 9.27809,-7.455996 27.0803,-8.364573 3.6292,-0.185225 6.55336,-0.273136 8.88737,-0.31367 z m -133.780888,10.2466 c -11.676055,-0.136928 -26.965657,3.148726 -23.577636,6.430265 0.788845,0.76407 3.722234,1.620535 6.482543,1.934307 7.830393,0.89009 21.242215,-0.521364 26.76663,-2.823043 l 5.018743,-2.091143 -5.018743,-2.038865 c -2.26536,-0.922696 -5.779518,-1.365884 -9.671537,-1.411521 z M 95.094725,71.5172 c 0.46005,0 2.47817,2.258435 4.44368,5.018743 1.965505,2.760309 3.178535,5.018743 2.718485,5.018743 -0.46005,0 -2.425895,-2.258434 -4.391405,-5.018743 -1.96551,-2.760308 -3.23081,-5.018743 -2.77076,-5.018743 z m -13.592432,2.091143 c 1.963315,0.07194 2.979878,0.489244 2.979878,1.202407 0,1.253114 1.299838,1.552213 3.554943,0.836457 2.615133,-0.829999 3.207462,-0.559171 2.247979,0.993293 -0.873077,1.412692 -0.635324,1.681446 0.7319,0.836458 1.197021,-0.739797 3.017319,0.01673 4.391402,1.829749 3.12243,4.12148 3.03809,5.0128 -0.88874,8.93964 -2.226713,2.22671 -5.444162,3.3291 -9.619256,3.24127 C 68.6784,91.146107 51.523967,78.363434 63.98897,75.9086 72.314044,74.269077 78.230089,73.488411 81.502293,73.608343 z m 168.284737,2.979878 c -5.26168,-0.07896 -12.86132,1.142618 -19.0294,3.450386 -13.52394,5.05995 -27.58496,19.32973 -35.07893,35.549433 -7.5848,16.41636 -9.70974,27.09619 -8.73051,43.60033 0.96973,16.34435 5.09283,26.57934 14.53343,36.01994 3.73765,3.73765 7.58786,6.79622 8.5737,6.79622 0.98581,0 0.57106,-1.20641 -0.88874,-2.66622 -23.56878,-23.56875 -20.50605,-70.50801 6.53482,-100.583973 9.18485,-10.21578 25.11963,-18.872565 34.76525,-18.872565 3.9228,0 6.11101,-0.666891 5.48926,-1.672914 -0.65857,-1.065564 -3.01187,-1.573276 -6.16888,-1.620637 z M 93.996871,81.972917 c -0.414565,0.10171 -1.091074,0.73416 -1.882028,1.77747 -2.429875,3.20512 -10.604639,4.30166 -14.533444,1.93431 -1.98329,-1.19503 -1.952408,-0.99545 0,1.41152 4.487392,5.53208 16.833706,2.07908 16.833706,-4.70507 0,-0.34504 -0.169487,-0.47923 -0.418234,-0.41823 z m 155.424209,4.60051 c -5.63233,0 -21.08854,6.87762 -24.36182,10.82167 -1.55906,1.87857 -0.75593,2.12998 4.60052,1.41151 8.91618,-1.19589 16.16623,2.867063 20.59776,11.553573 4.40112,8.62692 3.78191,23.68151 -1.62063,38.84298 -8.07667,22.666 -30.03144,33.8222 -44.38452,22.53207 -5.25764,-4.13567 -5.60549,-1.90359 -1.2024,7.68495 3.62609,7.89651 8.06185,12.20221 14.638,14.1675 16.13126,4.82085 40.2553,-10.86531 50.2397,-32.67411 11.25995,-24.59494 7.63191,-56.92849 -7.84178,-69.948743 -3.27489,-2.75565 -7.27829,-4.3914 -10.66483,-4.3914 z m 16.78142,1.67292 c -0.90834,0 -0.11545,1.69382 1.77747,3.76405 28.0726,30.701453 2.58983,103.011423 -37.48373,106.334633 -5.93348,0.49205 -8.35736,1.27258 -6.90078,2.19569 1.23828,0.78477 5.63854,1.45042 9.82837,1.46381 20.17316,0.0678 41.19885,-20.70592 49.61237,-49.03731 4.74207,-15.9682 2.75552,-39.91973 -4.23456,-51.33755 -3.63159,-5.932003 -10.64901,-13.383323 -12.59914,-13.383323 z m -39.88855,15.579013 c -9.68895,0.28737 -23.0671,23.58278 -24.36182,43.75717 -0.62994,9.81604 -0.23524,13.418 1.93431,16.72914 6.83372,10.42959 24.08463,-0.59224 30.42614,-19.44763 6.11892,-18.19356 3.18096,-37.82634 -6.11661,-40.77729 -0.60847,-0.19311 -1.23609,-0.28054 -1.88202,-0.26139 z"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/website/static/media/cardboard.png b/website/static/media/cardboard.png
new file mode 100644
index 0000000..26ede53
--- /dev/null
+++ b/website/static/media/cardboard.png
Binary files differ
diff --git a/website/static/media/cardboard_blue.png b/website/static/media/cardboard_blue.png
new file mode 100644
index 0000000..1b50fb3
--- /dev/null
+++ b/website/static/media/cardboard_blue.png
Binary files differ
diff --git a/website/static/media/control_full_1080p.mp4 b/website/static/media/control_full_1080p.mp4
new file mode 100644
index 0000000..344e031
--- /dev/null
+++ b/website/static/media/control_full_1080p.mp4
Binary files differ
diff --git a/website/static/media/cork.jpg b/website/static/media/cork.jpg
new file mode 100644
index 0000000..9b0e94e
--- /dev/null
+++ b/website/static/media/cork.jpg
Binary files differ
diff --git a/website/static/media/dpph-chemical-structure.png b/website/static/media/dpph-chemical-structure.png
new file mode 100644
index 0000000..96960e7
--- /dev/null
+++ b/website/static/media/dpph-chemical-structure.png
Binary files differ
diff --git a/website/static/media/esr-plot.png b/website/static/media/esr-plot.png
new file mode 100644
index 0000000..259f58b
--- /dev/null
+++ b/website/static/media/esr-plot.png
Binary files differ
diff --git a/website/static/media/fingerprint_components.png b/website/static/media/fingerprint_components.png
new file mode 100644
index 0000000..a7888ad
--- /dev/null
+++ b/website/static/media/fingerprint_components.png
Binary files differ
diff --git a/website/static/media/fr_docker_arch.png b/website/static/media/fr_docker_arch.png
new file mode 100644
index 0000000..f057316
--- /dev/null
+++ b/website/static/media/fr_docker_arch.png
Binary files differ
diff --git a/website/static/media/game_of_thrones_pieces.jpg b/website/static/media/game_of_thrones_pieces.jpg
new file mode 100644
index 0000000..fdab040
--- /dev/null
+++ b/website/static/media/game_of_thrones_pieces.jpg
Binary files differ
diff --git a/website/static/media/game_of_thrones_pieces_953x658.jpg b/website/static/media/game_of_thrones_pieces_953x658.jpg
new file mode 100644
index 0000000..f7e4a54
--- /dev/null
+++ b/website/static/media/game_of_thrones_pieces_953x658.jpg
Binary files differ
diff --git a/website/static/media/google_authenticator_screenshot.png b/website/static/media/google_authenticator_screenshot.png
new file mode 100644
index 0000000..1265223
--- /dev/null
+++ b/website/static/media/google_authenticator_screenshot.png
Binary files differ
diff --git a/website/static/media/grid.png b/website/static/media/grid.png
new file mode 100644
index 0000000..32ab50b
--- /dev/null
+++ b/website/static/media/grid.png
Binary files differ
diff --git a/website/static/media/iphone-slot-machine.jpg b/website/static/media/iphone-slot-machine.jpg
new file mode 100644
index 0000000..2fa4293
--- /dev/null
+++ b/website/static/media/iphone-slot-machine.jpg
Binary files differ
diff --git a/website/static/media/kittylog1-257x300.jpg b/website/static/media/kittylog1-257x300.jpg
new file mode 100644
index 0000000..ae92bb9
--- /dev/null
+++ b/website/static/media/kittylog1-257x300.jpg
Binary files differ
diff --git a/website/static/media/living-room-vent.jpg b/website/static/media/living-room-vent.jpg
new file mode 100644
index 0000000..507c20d
--- /dev/null
+++ b/website/static/media/living-room-vent.jpg
Binary files differ
diff --git a/website/static/media/magic-tee-schematic.png b/website/static/media/magic-tee-schematic.png
new file mode 100644
index 0000000..a7b8143
--- /dev/null
+++ b/website/static/media/magic-tee-schematic.png
Binary files differ
diff --git a/website/static/media/menu.png b/website/static/media/menu.png
new file mode 100644
index 0000000..b834edd
--- /dev/null
+++ b/website/static/media/menu.png
Binary files differ
diff --git a/website/static/media/menu_alt.png b/website/static/media/menu_alt.png
new file mode 100644
index 0000000..4c61bdf
--- /dev/null
+++ b/website/static/media/menu_alt.png
Binary files differ
diff --git a/website/static/media/microcenter_loot.jpg b/website/static/media/microcenter_loot.jpg
new file mode 100644
index 0000000..5d3dd4c
--- /dev/null
+++ b/website/static/media/microcenter_loot.jpg
Binary files differ
diff --git a/website/static/media/microwave-schematic.png b/website/static/media/microwave-schematic.png
new file mode 100644
index 0000000..b95adea
--- /dev/null
+++ b/website/static/media/microwave-schematic.png
Binary files differ
diff --git a/website/static/media/nazi-algorithms-screenshot.png b/website/static/media/nazi-algorithms-screenshot.png
new file mode 100644
index 0000000..55b329e
--- /dev/null
+++ b/website/static/media/nazi-algorithms-screenshot.png
Binary files differ
diff --git a/website/static/media/nintendo-framework.jpg b/website/static/media/nintendo-framework.jpg
new file mode 100644
index 0000000..b69ebfb
--- /dev/null
+++ b/website/static/media/nintendo-framework.jpg
Binary files differ
diff --git a/website/static/media/office-vent.jpg b/website/static/media/office-vent.jpg
new file mode 100644
index 0000000..a985005
--- /dev/null
+++ b/website/static/media/office-vent.jpg
Binary files differ
diff --git a/website/static/media/parallax_diagram.png b/website/static/media/parallax_diagram.png
new file mode 100644
index 0000000..b668956
--- /dev/null
+++ b/website/static/media/parallax_diagram.png
Binary files differ
diff --git a/website/static/media/pokemon-blue.jpg b/website/static/media/pokemon-blue.jpg
new file mode 100644
index 0000000..23b1c38
--- /dev/null
+++ b/website/static/media/pokemon-blue.jpg
Binary files differ
diff --git a/website/static/media/pokemon-capture-algorithm-flow-chart-downsized.png b/website/static/media/pokemon-capture-algorithm-flow-chart-downsized.png
new file mode 100644
index 0000000..2ba3de8
--- /dev/null
+++ b/website/static/media/pokemon-capture-algorithm-flow-chart-downsized.png
Binary files differ
diff --git a/website/static/media/pokemon-capture-algorithm-flow-chart.dot b/website/static/media/pokemon-capture-algorithm-flow-chart.dot
new file mode 100644
index 0000000..99ebc7e
--- /dev/null
+++ b/website/static/media/pokemon-capture-algorithm-flow-chart.dot
@@ -0,0 +1,132 @@
+digraph {
+ start [label="Start"];
+ caught [label="Caught"];
+ if_master_ball[shape="diamond", label="Master ball?"];
+ if_poke_ball[shape="diamond", label="Poké ball?"];
+ if_great_ball[shape="diamond", label="Great ball?"];
+ ultra_or_safari[shape="diamond", label="Ultra ball\nor\nSafari ball?"];
+ r1_255 [label="R1 = rand(0,255)"];
+ r1_200 [label="R1 = rand(0,200)"];
+ r1_150 [label="R1 = rand(0,150)"];
+ { rank=same; r1_255; r1_200; r1_150; }
+ if_asleep_or_frozen [shape="diamond" label="Target Pokémon\nasleep\nor frozen?"];
+ if_poisoned_burned_or_paralyzed [shape="diamond" label="Target Pokémon\npoisoned,\nburned, or\n frozen?"];
+ s_0 [label="S = 0"];
+ s_12 [label="S = 12"];
+ s_25 [label="S = 25"];
+ { rank=same; s_0; s_12; s_25 }
+ r_star [label="R* = R1 - S"]
+ if_r_star_negative [shape="diamond" label="R* < 0"]
+
+
+ start -> if_master_ball;
+ if_master_ball -> caught [label="yes"];
+ if_master_ball -> if_poke_ball [label="no"];
+ if_poke_ball -> if_great_ball [label="no"];
+ if_poke_ball -> r1_255 [label="yes"];
+ if_great_ball -> r1_200 [label="yes"];
+ if_great_ball -> ultra_or_safari [label="no"];
+ ultra_or_safari -> r1_150 [label="yes"];
+
+ r1_255 -> if_asleep_or_frozen;
+ r1_200 -> if_asleep_or_frozen;
+ r1_150 -> if_asleep_or_frozen;
+
+ if_asleep_or_frozen -> if_poisoned_burned_or_paralyzed [label="no"];
+ if_asleep_or_frozen -> s_25 [label="yes"];
+ if_poisoned_burned_or_paralyzed -> s_12 [label="yes"];
+ if_poisoned_burned_or_paralyzed -> s_0 [label="no"];
+
+ s_0 -> r_star;
+ s_12 -> r_star;
+ s_25 -> r_star;
+
+ r_star -> if_r_star_negative;
+ if_r_star_negative -> caught [label="yes"];
+ if_r_star_negative -> hp_factor [label="no"];
+
+ hp_factor [label="F = 255 * max_HP"];
+ divisor_8 [label="F /= 8"];
+ divisor_12 [label="F /= 12"];
+ if_great_ball_2 [shape="diamond" label="Great ball?"];
+ hp_factor -> if_great_ball_2;
+ if_great_ball_2 -> divisor_8 [label="yes"];
+ if_great_ball_2 -> divisor_12 [label="no"];
+
+ divisor_8 -> current_hp;
+ divisor_12 -> current_hp;
+ current_hp [shape="diamond" label="current_HP/4 > 0"];
+ f_div_hp_4 [label="F /= (current_HP/4)"];
+ current_hp -> f_div_hp_4 [label="yes"];
+ f_div_hp_4 -> round_f;
+ current_hp -> round_f [label="no"];
+ round_f [label="F = min{255, F}"];
+ round_f -> base_catch_rate;
+
+ base_catch_rate [shape="diamond" label="base_catch_rate >= R*"];
+ base_catch_rate -> w_init [label="no"];
+ base_catch_rate -> r2 [label="yes"];
+
+ r2 [label="R2 = rand(0,255)"];
+ r2 -> r2_and_f;
+ r2_and_f [shape="diamond" label="R2 <= F"];
+ r2_and_f -> caught [label="yes"];
+ r2_and_f -> w_init [label="no"];
+
+ w_init [label="W = 100 * base_catch_rate"];
+ w_init -> if_poke_ball_2
+ if_poke_ball_2 [shape="diamond" label="Poké Ball?"];
+ if_poke_ball_2 -> if_great_ball_3 [label="no"];
+ if_poke_ball_2 -> w_255[label="yes"];
+ w_255 [label="W /= 255"]
+ if_great_ball_3 [shape="diamond" label="Great Ball?"];
+ if_great_ball_3 -> w_200[label="yes"];
+ w_200 [label="W /= 200"]
+ if_great_ball_3 -> if_ultra_ball_2 [label="no"];
+ if_ultra_ball_2 [shape="diamond" label="Ultra Ball?"];
+ if_ultra_ball_2 -> w_150[label="yes"];
+ w_150 [label="W /= 150"];
+ { rank=same; w_150; w_200; w_255 };
+ w_150 -> w_overflow;
+ w_200 -> w_overflow;
+ w_255 -> w_overflow;
+ w_overflow [shape="diamond" label="W > 255"];
+ w_overflow -> wobble_3 [label="yes"];
+ w_overflow -> w_by_f [label="no"];
+ w_by_f [label="W *= F"];
+ w_by_f -> w_mod_255;
+ w_mod_255 [label="W /= 255"];
+ w_mod_255 -> if_asleep_or_frozen_2;
+ if_asleep_or_frozen_2 -> if_poisoned_burned_or_paralyzed_2 [label="no"];
+ if_asleep_or_frozen_2 -> w_plus_10 [label="yes"];
+ w_plus_10 [label="W += 10";]
+ w_plus_10 -> if_poisoned_burned_or_paralyzed_2 [label="no"];
+ if_asleep_or_frozen_2 [shape="diamond" label="Target Pokémon\nasleep\nor frozen?"];
+ if_poisoned_burned_or_paralyzed_2 [shape="diamond" label="Target Pokémon\npoisoned,\nburned, or\n frozen?"];
+ w_plus_5 [label="W += 5"];
+ if_poisoned_burned_or_paralyzed_2 -> w_plus_5 [label="yes"];
+ w_plus_5 -> w_less_than_10;
+ if_poisoned_burned_or_paralyzed_2 -> w_less_than_10 [label="no"];
+ w_less_than_10 [shape="diamond" label="W < 10"];
+ w_less_than_10 -> w_less_than_30 [label="no"];
+ w_less_than_10 -> missed [label="yes"];
+ w_less_than_30 [shape="diamond" label="W < 30"];
+ w_less_than_30 -> w_less_than_70 [label="no"];
+ w_less_than_30 -> wobble_1 [label="yes"];
+ w_less_than_70 [shape="diamond" label="W < 70"];
+ w_less_than_70 -> wobble_2 [label="yes"];
+ w_less_than_70 -> wobble_3 [label="no"];
+
+ missed [label="'The ball missed the POKéMON!'"];
+ wobble_1 [label="Wobble 1 times"];
+ wobble_1 -> broke_free;
+ broke_free [label="'Darn! The POKéMON broke free!'"];
+ wobble_2 [label="Wobble 2 times"];
+ wobble_2 -> appeared_to_be_caught;
+ appeared_to_be_caught [label="'Aww! It appeared to be caught!'"];
+ wobble_3 [label="Wobble 3 times"];
+ wobble_3 -> shoot;
+ shoot [label="'Shoot! It was so close too!'"];
+
+ { rank=same; caught; missed; broke_free; appeared_to_be_caught; shoot }
+}
diff --git a/website/static/media/pokemon-capture-algorithm-flow-chart.png b/website/static/media/pokemon-capture-algorithm-flow-chart.png
new file mode 100644
index 0000000..f6596f7
--- /dev/null
+++ b/website/static/media/pokemon-capture-algorithm-flow-chart.png
Binary files differ
diff --git a/website/static/media/pokemon-capture-algorithm-flow-chart.svg b/website/static/media/pokemon-capture-algorithm-flow-chart.svg
new file mode 100644
index 0000000..a29c6c0
--- /dev/null
+++ b/website/static/media/pokemon-capture-algorithm-flow-chart.svg
@@ -0,0 +1,629 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.38.0 (20140413.2041)
+ -->
+<!-- Title: %3 Pages: 1 -->
+<svg width="1204pt" height="3369pt"
+ viewBox="0.00 0.00 1204.17 3369.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3365)">
+<title>%3</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-3365 1200.17,-3365 1200.17,4 -4,4"/>
+<!-- start -->
+<g id="node1" class="node"><title>start</title>
+<ellipse fill="none" stroke="black" cx="76.4534" cy="-3343" rx="27" ry="18"/>
+<text text-anchor="middle" x="76.4534" y="-3338.8" font-family="Times,serif" font-size="14.00">Start</text>
+</g>
+<!-- if_master_ball -->
+<g id="node3" class="node"><title>if_master_ball</title>
+<polygon fill="none" stroke="black" points="76.4534,-3288 0.0465312,-3270 76.4534,-3252 152.86,-3270 76.4534,-3288"/>
+<text text-anchor="middle" x="76.4534" y="-3265.8" font-family="Times,serif" font-size="14.00">Master ball?</text>
+</g>
+<!-- start&#45;&gt;if_master_ball -->
+<g id="edge1" class="edge"><title>start&#45;&gt;if_master_ball</title>
+<path fill="none" stroke="black" d="M76.4534,-3324.81C76.4534,-3316.79 76.4534,-3307.05 76.4534,-3298.07"/>
+<polygon fill="black" stroke="black" points="79.9535,-3298.03 76.4534,-3288.03 72.9535,-3298.03 79.9535,-3298.03"/>
+</g>
+<!-- caught -->
+<g id="node2" class="node"><title>caught</title>
+<ellipse fill="none" stroke="black" cx="92.4534" cy="-18" rx="35.806" ry="18"/>
+<text text-anchor="middle" x="92.4534" y="-13.8" font-family="Times,serif" font-size="14.00">Caught</text>
+</g>
+<!-- if_master_ball&#45;&gt;caught -->
+<g id="edge2" class="edge"><title>if_master_ball&#45;&gt;caught</title>
+<path fill="none" stroke="black" d="M66.7308,-3254.21C56.9967,-3237.94 43.4534,-3210.7 43.4534,-3185 43.4534,-3185 43.4534,-3185 43.4534,-90 43.4534,-71.2718 55.1447,-53.8993 67.1057,-41.0266"/>
+<polygon fill="black" stroke="black" points="69.906,-43.1749 74.4859,-33.6211 64.9478,-38.2337 69.906,-43.1749"/>
+<text text-anchor="middle" x="52.7845" y="-1631.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- if_poke_ball -->
+<g id="node4" class="node"><title>if_poke_ball</title>
+<polygon fill="none" stroke="black" points="142.453,-3202 75.4773,-3184 142.453,-3166 209.43,-3184 142.453,-3202"/>
+<text text-anchor="middle" x="142.453" y="-3179.8" font-family="Times,serif" font-size="14.00">Poké ball?</text>
+</g>
+<!-- if_master_ball&#45;&gt;if_poke_ball -->
+<g id="edge3" class="edge"><title>if_master_ball&#45;&gt;if_poke_ball</title>
+<path fill="none" stroke="black" d="M87.9498,-3254.37C98.1379,-3241.4 113.17,-3222.27 124.868,-3207.38"/>
+<polygon fill="black" stroke="black" points="127.883,-3209.21 131.309,-3199.18 122.378,-3204.88 127.883,-3209.21"/>
+<text text-anchor="middle" x="120.453" y="-3222.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- if_great_ball -->
+<g id="node5" class="node"><title>if_great_ball</title>
+<polygon fill="none" stroke="black" points="303.453,-3116 233.958,-3098 303.453,-3080 372.949,-3098 303.453,-3116"/>
+<text text-anchor="middle" x="303.453" y="-3093.8" font-family="Times,serif" font-size="14.00">Great ball?</text>
+</g>
+<!-- if_poke_ball&#45;&gt;if_great_ball -->
+<g id="edge4" class="edge"><title>if_poke_ball&#45;&gt;if_great_ball</title>
+<path fill="none" stroke="black" d="M164.167,-3171.67C192.134,-3157.08 240.916,-3131.63 272.693,-3115.05"/>
+<polygon fill="black" stroke="black" points="274.323,-3118.15 281.57,-3110.42 271.085,-3111.94 274.323,-3118.15"/>
+<text text-anchor="middle" x="240.453" y="-3136.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- r1_255 -->
+<g id="node7" class="node"><title>r1_255</title>
+<ellipse fill="none" stroke="black" cx="142.453" cy="-2862" rx="71.1753" ry="18"/>
+<text text-anchor="middle" x="142.453" y="-2857.8" font-family="Times,serif" font-size="14.00">R1 = rand(0,255)</text>
+</g>
+<!-- if_poke_ball&#45;&gt;r1_255 -->
+<g id="edge5" class="edge"><title>if_poke_ball&#45;&gt;r1_255</title>
+<path fill="none" stroke="black" d="M142.453,-3165.8C142.453,-3113.27 142.453,-2954.68 142.453,-2890.45"/>
+<polygon fill="black" stroke="black" points="145.954,-2890.29 142.453,-2880.29 138.954,-2890.29 145.954,-2890.29"/>
+<text text-anchor="middle" x="151.784" y="-3050.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- ultra_or_safari -->
+<g id="node6" class="node"><title>ultra_or_safari</title>
+<polygon fill="none" stroke="black" points="442.453,-3030 362.184,-2980 442.453,-2930 522.723,-2980 442.453,-3030"/>
+<text text-anchor="middle" x="442.453" y="-2989.8" font-family="Times,serif" font-size="14.00">Ultra ball</text>
+<text text-anchor="middle" x="442.453" y="-2975.8" font-family="Times,serif" font-size="14.00">or</text>
+<text text-anchor="middle" x="442.453" y="-2961.8" font-family="Times,serif" font-size="14.00">Safari ball?</text>
+</g>
+<!-- if_great_ball&#45;&gt;ultra_or_safari -->
+<g id="edge7" class="edge"><title>if_great_ball&#45;&gt;ultra_or_safari</title>
+<path fill="none" stroke="black" d="M319.128,-3083.92C338.773,-3067.52 373.201,-3038.79 400.698,-3015.85"/>
+<polygon fill="black" stroke="black" points="403.182,-3018.33 408.617,-3009.24 398.697,-3012.96 403.182,-3018.33"/>
+<text text-anchor="middle" x="368.453" y="-3050.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- r1_200 -->
+<g id="node8" class="node"><title>r1_200</title>
+<ellipse fill="none" stroke="black" cx="303.453" cy="-2862" rx="71.1753" ry="18"/>
+<text text-anchor="middle" x="303.453" y="-2857.8" font-family="Times,serif" font-size="14.00">R1 = rand(0,200)</text>
+</g>
+<!-- if_great_ball&#45;&gt;r1_200 -->
+<g id="edge6" class="edge"><title>if_great_ball&#45;&gt;r1_200</title>
+<path fill="none" stroke="black" d="M303.453,-3079.79C303.453,-3039.56 303.453,-2939.08 303.453,-2890.35"/>
+<polygon fill="black" stroke="black" points="306.954,-2890.23 303.453,-2880.23 299.954,-2890.23 306.954,-2890.23"/>
+<text text-anchor="middle" x="312.784" y="-2975.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- r1_150 -->
+<g id="node9" class="node"><title>r1_150</title>
+<ellipse fill="none" stroke="black" cx="464.453" cy="-2862" rx="71.1753" ry="18"/>
+<text text-anchor="middle" x="464.453" y="-2857.8" font-family="Times,serif" font-size="14.00">R1 = rand(0,150)</text>
+</g>
+<!-- ultra_or_safari&#45;&gt;r1_150 -->
+<g id="edge8" class="edge"><title>ultra_or_safari&#45;&gt;r1_150</title>
+<path fill="none" stroke="black" d="M450.771,-2935.15C453.632,-2920.06 456.751,-2903.61 459.288,-2890.24"/>
+<polygon fill="black" stroke="black" points="462.756,-2890.73 461.181,-2880.25 455.879,-2889.43 462.756,-2890.73"/>
+<text text-anchor="middle" x="465.784" y="-2900.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- if_asleep_or_frozen -->
+<g id="node10" class="node"><title>if_asleep_or_frozen</title>
+<polygon fill="none" stroke="black" points="303.453,-2807 195.559,-2757 303.453,-2707 411.348,-2757 303.453,-2807"/>
+<text text-anchor="middle" x="303.453" y="-2766.8" font-family="Times,serif" font-size="14.00">Target Pokémon</text>
+<text text-anchor="middle" x="303.453" y="-2752.8" font-family="Times,serif" font-size="14.00">asleep</text>
+<text text-anchor="middle" x="303.453" y="-2738.8" font-family="Times,serif" font-size="14.00">or frozen?</text>
+</g>
+<!-- r1_255&#45;&gt;if_asleep_or_frozen -->
+<g id="edge9" class="edge"><title>r1_255&#45;&gt;if_asleep_or_frozen</title>
+<path fill="none" stroke="black" d="M167.61,-2844.91C189.731,-2830.75 222.658,-2809.69 250.555,-2791.84"/>
+<polygon fill="black" stroke="black" points="252.496,-2794.76 259.033,-2786.42 248.723,-2788.86 252.496,-2794.76"/>
+</g>
+<!-- r1_200&#45;&gt;if_asleep_or_frozen -->
+<g id="edge10" class="edge"><title>r1_200&#45;&gt;if_asleep_or_frozen</title>
+<path fill="none" stroke="black" d="M303.453,-2843.99C303.453,-2836.44 303.453,-2827.06 303.453,-2817.3"/>
+<polygon fill="black" stroke="black" points="306.954,-2817.05 303.453,-2807.05 299.954,-2817.05 306.954,-2817.05"/>
+</g>
+<!-- r1_150&#45;&gt;if_asleep_or_frozen -->
+<g id="edge11" class="edge"><title>r1_150&#45;&gt;if_asleep_or_frozen</title>
+<path fill="none" stroke="black" d="M439.297,-2844.91C417.176,-2830.75 384.248,-2809.69 356.352,-2791.84"/>
+<polygon fill="black" stroke="black" points="358.183,-2788.86 347.874,-2786.42 354.411,-2794.76 358.183,-2788.86"/>
+</g>
+<!-- if_poisoned_burned_or_paralyzed -->
+<g id="node11" class="node"><title>if_poisoned_burned_or_paralyzed</title>
+<polygon fill="none" stroke="black" points="179.453,-2657 71.5585,-2593 179.453,-2529 287.348,-2593 179.453,-2657"/>
+<text text-anchor="middle" x="179.453" y="-2609.8" font-family="Times,serif" font-size="14.00">Target Pokémon</text>
+<text text-anchor="middle" x="179.453" y="-2595.8" font-family="Times,serif" font-size="14.00">poisoned,</text>
+<text text-anchor="middle" x="179.453" y="-2581.8" font-family="Times,serif" font-size="14.00">burned, or</text>
+<text text-anchor="middle" x="179.453" y="-2567.8" font-family="Times,serif" font-size="14.00"> frozen?</text>
+</g>
+<!-- if_asleep_or_frozen&#45;&gt;if_poisoned_burned_or_paralyzed -->
+<g id="edge12" class="edge"><title>if_asleep_or_frozen&#45;&gt;if_poisoned_burned_or_paralyzed</title>
+<path fill="none" stroke="black" d="M275.625,-2719.64C258.882,-2697.77 237.302,-2669.58 218.828,-2645.44"/>
+<polygon fill="black" stroke="black" points="221.551,-2643.24 212.694,-2637.43 215.993,-2647.5 221.551,-2643.24"/>
+<text text-anchor="middle" x="256.453" y="-2677.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- s_25 -->
+<g id="node14" class="node"><title>s_25</title>
+<ellipse fill="none" stroke="black" cx="319.453" cy="-2461" rx="33.0569" ry="18"/>
+<text text-anchor="middle" x="319.453" y="-2456.8" font-family="Times,serif" font-size="14.00">S = 25</text>
+</g>
+<!-- if_asleep_or_frozen&#45;&gt;s_25 -->
+<g id="edge13" class="edge"><title>if_asleep_or_frozen&#45;&gt;s_25</title>
+<path fill="none" stroke="black" d="M306.06,-2708.11C309.45,-2645.81 315.261,-2539.04 317.975,-2489.17"/>
+<polygon fill="black" stroke="black" points="321.472,-2489.32 318.52,-2479.15 314.482,-2488.94 321.472,-2489.32"/>
+<text text-anchor="middle" x="325.784" y="-2588.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- s_0 -->
+<g id="node12" class="node"><title>s_0</title>
+<ellipse fill="none" stroke="black" cx="152.453" cy="-2461" rx="28.7127" ry="18"/>
+<text text-anchor="middle" x="152.453" y="-2456.8" font-family="Times,serif" font-size="14.00">S = 0</text>
+</g>
+<!-- if_poisoned_burned_or_paralyzed&#45;&gt;s_0 -->
+<g id="edge15" class="edge"><title>if_poisoned_burned_or_paralyzed&#45;&gt;s_0</title>
+<path fill="none" stroke="black" d="M167.768,-2535.74C164.394,-2519.49 160.866,-2502.51 158.048,-2488.94"/>
+<polygon fill="black" stroke="black" points="161.417,-2487.95 155.957,-2478.87 154.564,-2489.37 161.417,-2487.95"/>
+<text text-anchor="middle" x="169.453" y="-2499.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- s_12 -->
+<g id="node13" class="node"><title>s_12</title>
+<ellipse fill="none" stroke="black" cx="232.453" cy="-2461" rx="33.0569" ry="18"/>
+<text text-anchor="middle" x="232.453" y="-2456.8" font-family="Times,serif" font-size="14.00">S = 12</text>
+</g>
+<!-- if_poisoned_burned_or_paralyzed&#45;&gt;s_12 -->
+<g id="edge14" class="edge"><title>if_poisoned_burned_or_paralyzed&#45;&gt;s_12</title>
+<path fill="none" stroke="black" d="M200.248,-2540.99C207.553,-2523.08 215.464,-2503.67 221.618,-2488.58"/>
+<polygon fill="black" stroke="black" points="225.034,-2489.47 225.568,-2478.89 218.552,-2486.83 225.034,-2489.47"/>
+<text text-anchor="middle" x="226.784" y="-2499.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- r_star -->
+<g id="node15" class="node"><title>r_star</title>
+<ellipse fill="none" stroke="black" cx="228.453" cy="-2388" rx="52.383" ry="18"/>
+<text text-anchor="middle" x="228.453" y="-2383.8" font-family="Times,serif" font-size="14.00">R* = R1 &#45; S</text>
+</g>
+<!-- s_0&#45;&gt;r_star -->
+<g id="edge16" class="edge"><title>s_0&#45;&gt;r_star</title>
+<path fill="none" stroke="black" d="M167.833,-2445.63C178.151,-2435.99 191.968,-2423.08 203.805,-2412.03"/>
+<polygon fill="black" stroke="black" points="206.322,-2414.46 211.241,-2405.08 201.544,-2409.35 206.322,-2414.46"/>
+</g>
+<!-- s_12&#45;&gt;r_star -->
+<g id="edge17" class="edge"><title>s_12&#45;&gt;r_star</title>
+<path fill="none" stroke="black" d="M231.485,-2442.81C231.033,-2434.79 230.484,-2425.05 229.978,-2416.07"/>
+<polygon fill="black" stroke="black" points="233.47,-2415.82 229.413,-2406.03 226.481,-2416.21 233.47,-2415.82"/>
+</g>
+<!-- s_25&#45;&gt;r_star -->
+<g id="edge18" class="edge"><title>s_25&#45;&gt;r_star</title>
+<path fill="none" stroke="black" d="M301.038,-2445.63C288.361,-2435.74 271.274,-2422.41 256.863,-2411.17"/>
+<polygon fill="black" stroke="black" points="258.778,-2408.22 248.741,-2404.83 254.472,-2413.74 258.778,-2408.22"/>
+</g>
+<!-- if_r_star_negative -->
+<g id="node16" class="node"><title>if_r_star_negative</title>
+<polygon fill="none" stroke="black" points="227.453,-2333 179.057,-2315 227.453,-2297 275.85,-2315 227.453,-2333"/>
+<text text-anchor="middle" x="227.453" y="-2310.8" font-family="Times,serif" font-size="14.00">R* &lt; 0</text>
+</g>
+<!-- r_star&#45;&gt;if_r_star_negative -->
+<g id="edge19" class="edge"><title>r_star&#45;&gt;if_r_star_negative</title>
+<path fill="none" stroke="black" d="M228.211,-2369.81C228.098,-2361.79 227.961,-2352.05 227.835,-2343.07"/>
+<polygon fill="black" stroke="black" points="231.334,-2342.98 227.693,-2333.03 224.335,-2343.08 231.334,-2342.98"/>
+</g>
+<!-- if_r_star_negative&#45;&gt;caught -->
+<g id="edge20" class="edge"><title>if_r_star_negative&#45;&gt;caught</title>
+<path fill="none" stroke="black" d="M195.802,-2308.68C155.9,-2299.95 92.4534,-2278.45 92.4534,-2230 92.4534,-2230 92.4534,-2230 92.4534,-90 92.4534,-75.6513 92.4534,-59.6715 92.4534,-46.5107"/>
+<polygon fill="black" stroke="black" points="95.9535,-46.2164 92.4534,-36.2164 88.9535,-46.2164 95.9535,-46.2164"/>
+<text text-anchor="middle" x="101.784" y="-1257.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- hp_factor -->
+<g id="node17" class="node"><title>hp_factor</title>
+<ellipse fill="none" stroke="black" cx="227.453" cy="-2229" rx="77.4901" ry="18"/>
+<text text-anchor="middle" x="227.453" y="-2224.8" font-family="Times,serif" font-size="14.00">F = 255 * max_HP</text>
+</g>
+<!-- if_r_star_negative&#45;&gt;hp_factor -->
+<g id="edge21" class="edge"><title>if_r_star_negative&#45;&gt;hp_factor</title>
+<path fill="none" stroke="black" d="M227.453,-2296.6C227.453,-2285.26 227.453,-2270.23 227.453,-2257.32"/>
+<polygon fill="black" stroke="black" points="230.954,-2257.1 227.453,-2247.1 223.954,-2257.1 230.954,-2257.1"/>
+<text text-anchor="middle" x="234.453" y="-2267.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- if_great_ball_2 -->
+<g id="node20" class="node"><title>if_great_ball_2</title>
+<polygon fill="none" stroke="black" points="227.453,-2174 157.958,-2156 227.453,-2138 296.949,-2156 227.453,-2174"/>
+<text text-anchor="middle" x="227.453" y="-2151.8" font-family="Times,serif" font-size="14.00">Great ball?</text>
+</g>
+<!-- hp_factor&#45;&gt;if_great_ball_2 -->
+<g id="edge22" class="edge"><title>hp_factor&#45;&gt;if_great_ball_2</title>
+<path fill="none" stroke="black" d="M227.453,-2210.81C227.453,-2202.79 227.453,-2193.05 227.453,-2184.07"/>
+<polygon fill="black" stroke="black" points="230.954,-2184.03 227.453,-2174.03 223.954,-2184.03 230.954,-2184.03"/>
+</g>
+<!-- divisor_8 -->
+<g id="node18" class="node"><title>divisor_8</title>
+<ellipse fill="none" stroke="black" cx="218.453" cy="-2070" rx="31.1271" ry="18"/>
+<text text-anchor="middle" x="218.453" y="-2065.8" font-family="Times,serif" font-size="14.00">F /= 8</text>
+</g>
+<!-- current_hp -->
+<g id="node21" class="node"><title>current_hp</title>
+<polygon fill="none" stroke="black" points="260.453,-2015 158.984,-1997 260.453,-1979 361.923,-1997 260.453,-2015"/>
+<text text-anchor="middle" x="260.453" y="-1992.8" font-family="Times,serif" font-size="14.00">current_HP/4 &gt; 0</text>
+</g>
+<!-- divisor_8&#45;&gt;current_hp -->
+<g id="edge25" class="edge"><title>divisor_8&#45;&gt;current_hp</title>
+<path fill="none" stroke="black" d="M228.195,-2052.53C233.538,-2043.5 240.262,-2032.13 246.187,-2022.12"/>
+<polygon fill="black" stroke="black" points="249.261,-2023.79 251.34,-2013.41 243.236,-2020.23 249.261,-2023.79"/>
+</g>
+<!-- divisor_12 -->
+<g id="node19" class="node"><title>divisor_12</title>
+<ellipse fill="none" stroke="black" cx="303.453" cy="-2070" rx="35.971" ry="18"/>
+<text text-anchor="middle" x="303.453" y="-2065.8" font-family="Times,serif" font-size="14.00">F /= 12</text>
+</g>
+<!-- divisor_12&#45;&gt;current_hp -->
+<g id="edge26" class="edge"><title>divisor_12&#45;&gt;current_hp</title>
+<path fill="none" stroke="black" d="M293.48,-2052.53C288.01,-2043.5 281.126,-2032.13 275.06,-2022.12"/>
+<polygon fill="black" stroke="black" points="277.958,-2020.15 269.784,-2013.41 271.97,-2023.77 277.958,-2020.15"/>
+</g>
+<!-- if_great_ball_2&#45;&gt;divisor_8 -->
+<g id="edge23" class="edge"><title>if_great_ball_2&#45;&gt;divisor_8</title>
+<path fill="none" stroke="black" d="M225.675,-2138.4C224.446,-2126.94 222.784,-2111.42 221.364,-2098.16"/>
+<polygon fill="black" stroke="black" points="224.835,-2097.71 220.29,-2088.14 217.875,-2098.45 224.835,-2097.71"/>
+<text text-anchor="middle" x="233.784" y="-2108.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- if_great_ball_2&#45;&gt;divisor_12 -->
+<g id="edge24" class="edge"><title>if_great_ball_2&#45;&gt;divisor_12</title>
+<path fill="none" stroke="black" d="M240.003,-2141.13C251.564,-2128.35 268.94,-2109.15 282.588,-2094.06"/>
+<polygon fill="black" stroke="black" points="285.22,-2096.37 289.334,-2086.61 280.029,-2091.67 285.22,-2096.37"/>
+<text text-anchor="middle" x="277.453" y="-2108.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- f_div_hp_4 -->
+<g id="node22" class="node"><title>f_div_hp_4</title>
+<ellipse fill="none" stroke="black" cx="347.453" cy="-1911" rx="80.3542" ry="18"/>
+<text text-anchor="middle" x="347.453" y="-1906.8" font-family="Times,serif" font-size="14.00">F /= (current_HP/4)</text>
+</g>
+<!-- current_hp&#45;&gt;f_div_hp_4 -->
+<g id="edge27" class="edge"><title>current_hp&#45;&gt;f_div_hp_4</title>
+<path fill="none" stroke="black" d="M275.608,-1981.37C288.542,-1968.88 307.399,-1950.67 322.549,-1936.05"/>
+<polygon fill="black" stroke="black" points="325.32,-1938.24 330.083,-1928.77 320.458,-1933.2 325.32,-1938.24"/>
+<text text-anchor="middle" x="318.784" y="-1949.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- round_f -->
+<g id="node23" class="node"><title>round_f</title>
+<ellipse fill="none" stroke="black" cx="255.453" cy="-1838" rx="69.0734" ry="18"/>
+<text text-anchor="middle" x="255.453" y="-1833.8" font-family="Times,serif" font-size="14.00">F = min{255, F}</text>
+</g>
+<!-- current_hp&#45;&gt;round_f -->
+<g id="edge29" class="edge"><title>current_hp&#45;&gt;round_f</title>
+<path fill="none" stroke="black" d="M255.418,-1979.67C251.547,-1966.22 246.523,-1946.58 244.453,-1929 242.582,-1913.11 242.849,-1908.92 244.453,-1893 245.34,-1884.2 247.021,-1874.72 248.806,-1866.19"/>
+<polygon fill="black" stroke="black" points="252.235,-1866.9 250.989,-1856.37 245.402,-1865.38 252.235,-1866.9"/>
+<text text-anchor="middle" x="251.453" y="-1906.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- f_div_hp_4&#45;&gt;round_f -->
+<g id="edge28" class="edge"><title>f_div_hp_4&#45;&gt;round_f</title>
+<path fill="none" stroke="black" d="M326.116,-1893.53C313.807,-1884.03 298.154,-1871.95 284.711,-1861.58"/>
+<polygon fill="black" stroke="black" points="286.731,-1858.72 276.676,-1855.38 282.454,-1864.26 286.731,-1858.72"/>
+</g>
+<!-- base_catch_rate -->
+<g id="node24" class="node"><title>base_catch_rate</title>
+<polygon fill="none" stroke="black" points="255.453,-1783 126.255,-1765 255.453,-1747 384.652,-1765 255.453,-1783"/>
+<text text-anchor="middle" x="255.453" y="-1760.8" font-family="Times,serif" font-size="14.00">base_catch_rate &gt;= R*</text>
+</g>
+<!-- round_f&#45;&gt;base_catch_rate -->
+<g id="edge30" class="edge"><title>round_f&#45;&gt;base_catch_rate</title>
+<path fill="none" stroke="black" d="M255.453,-1819.81C255.453,-1811.79 255.453,-1802.05 255.453,-1793.07"/>
+<polygon fill="black" stroke="black" points="258.954,-1793.03 255.453,-1783.03 251.954,-1793.03 258.954,-1793.03"/>
+</g>
+<!-- w_init -->
+<g id="node25" class="node"><title>w_init</title>
+<ellipse fill="none" stroke="black" cx="282.453" cy="-1507" rx="106.059" ry="18"/>
+<text text-anchor="middle" x="282.453" y="-1502.8" font-family="Times,serif" font-size="14.00">W = 100 * base_catch_rate</text>
+</g>
+<!-- base_catch_rate&#45;&gt;w_init -->
+<g id="edge31" class="edge"><title>base_catch_rate&#45;&gt;w_init</title>
+<path fill="none" stroke="black" d="M260.216,-1747.64C263.929,-1734.17 268.874,-1714.51 271.453,-1697 279.854,-1639.98 281.907,-1572.39 282.367,-1535.47"/>
+<polygon fill="black" stroke="black" points="285.871,-1535.08 282.464,-1525.04 278.871,-1535.01 285.871,-1535.08"/>
+<text text-anchor="middle" x="286.453" y="-1631.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- r2 -->
+<g id="node26" class="node"><title>r2</title>
+<ellipse fill="none" stroke="black" cx="191.453" cy="-1679" rx="71.1753" ry="18"/>
+<text text-anchor="middle" x="191.453" y="-1674.8" font-family="Times,serif" font-size="14.00">R2 = rand(0,255)</text>
+</g>
+<!-- base_catch_rate&#45;&gt;r2 -->
+<g id="edge32" class="edge"><title>base_catch_rate&#45;&gt;r2</title>
+<path fill="none" stroke="black" d="M243.715,-1748.59C234.451,-1736.43 221.338,-1719.22 210.565,-1705.08"/>
+<polygon fill="black" stroke="black" points="213.06,-1702.58 204.215,-1696.75 207.491,-1706.83 213.06,-1702.58"/>
+<text text-anchor="middle" x="236.784" y="-1717.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- if_poke_ball_2 -->
+<g id="node28" class="node"><title>if_poke_ball_2</title>
+<polygon fill="none" stroke="black" points="282.453,-1452 213.801,-1434 282.453,-1416 351.106,-1434 282.453,-1452"/>
+<text text-anchor="middle" x="282.453" y="-1429.8" font-family="Times,serif" font-size="14.00">Poké Ball?</text>
+</g>
+<!-- w_init&#45;&gt;if_poke_ball_2 -->
+<g id="edge36" class="edge"><title>w_init&#45;&gt;if_poke_ball_2</title>
+<path fill="none" stroke="black" d="M282.453,-1488.81C282.453,-1480.79 282.453,-1471.05 282.453,-1462.07"/>
+<polygon fill="black" stroke="black" points="285.954,-1462.03 282.453,-1452.03 278.954,-1462.03 285.954,-1462.03"/>
+</g>
+<!-- r2_and_f -->
+<g id="node27" class="node"><title>r2_and_f</title>
+<polygon fill="none" stroke="black" points="191.453,-1611 135.046,-1593 191.453,-1575 247.861,-1593 191.453,-1611"/>
+<text text-anchor="middle" x="191.453" y="-1588.8" font-family="Times,serif" font-size="14.00">R2 &lt;= F</text>
+</g>
+<!-- r2&#45;&gt;r2_and_f -->
+<g id="edge33" class="edge"><title>r2&#45;&gt;r2_and_f</title>
+<path fill="none" stroke="black" d="M191.453,-1660.6C191.453,-1649.26 191.453,-1634.23 191.453,-1621.32"/>
+<polygon fill="black" stroke="black" points="194.954,-1621.1 191.453,-1611.1 187.954,-1621.1 194.954,-1621.1"/>
+</g>
+<!-- r2_and_f&#45;&gt;caught -->
+<g id="edge34" class="edge"><title>r2_and_f&#45;&gt;caught</title>
+<path fill="none" stroke="black" d="M178.61,-1579C164.695,-1563.48 144.453,-1536.07 144.453,-1508 144.453,-1508 144.453,-1508 144.453,-90 144.453,-70.7141 131.811,-53.1854 118.994,-40.3698"/>
+<polygon fill="black" stroke="black" points="121.218,-37.6585 111.521,-33.3911 116.441,-42.7745 121.218,-37.6585"/>
+<text text-anchor="middle" x="153.784" y="-896.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- r2_and_f&#45;&gt;w_init -->
+<g id="edge35" class="edge"><title>r2_and_f&#45;&gt;w_init</title>
+<path fill="none" stroke="black" d="M205.274,-1579.24C218.777,-1566.78 239.668,-1547.49 256.311,-1532.13"/>
+<polygon fill="black" stroke="black" points="259.116,-1534.31 264.09,-1524.95 254.368,-1529.16 259.116,-1534.31"/>
+<text text-anchor="middle" x="249.453" y="-1545.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- if_great_ball_3 -->
+<g id="node29" class="node"><title>if_great_ball_3</title>
+<polygon fill="none" stroke="black" points="369.453,-1366 297.781,-1348 369.453,-1330 441.126,-1348 369.453,-1366"/>
+<text text-anchor="middle" x="369.453" y="-1343.8" font-family="Times,serif" font-size="14.00">Great Ball?</text>
+</g>
+<!-- if_poke_ball_2&#45;&gt;if_great_ball_3 -->
+<g id="edge37" class="edge"><title>if_poke_ball_2&#45;&gt;if_great_ball_3</title>
+<path fill="none" stroke="black" d="M296.431,-1419.5C310.301,-1406.11 331.752,-1385.4 347.821,-1369.89"/>
+<polygon fill="black" stroke="black" points="350.458,-1372.21 355.221,-1362.74 345.596,-1367.17 350.458,-1372.21"/>
+<text text-anchor="middle" x="338.453" y="-1386.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- w_255 -->
+<g id="node30" class="node"><title>w_255</title>
+<ellipse fill="none" stroke="black" cx="265.453" cy="-1176" rx="43.3593" ry="18"/>
+<text text-anchor="middle" x="265.453" y="-1171.8" font-family="Times,serif" font-size="14.00">W /= 255</text>
+</g>
+<!-- if_poke_ball_2&#45;&gt;w_255 -->
+<g id="edge38" class="edge"><title>if_poke_ball_2&#45;&gt;w_255</title>
+<path fill="none" stroke="black" d="M281.338,-1416.2C278.463,-1372.91 270.781,-1257.22 267.261,-1204.21"/>
+<polygon fill="black" stroke="black" points="270.75,-1203.94 266.595,-1194.19 263.766,-1204.4 270.75,-1203.94"/>
+<text text-anchor="middle" x="283.784" y="-1300.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_200 -->
+<g id="node31" class="node"><title>w_200</title>
+<ellipse fill="none" stroke="black" cx="370.453" cy="-1176" rx="43.3593" ry="18"/>
+<text text-anchor="middle" x="370.453" y="-1171.8" font-family="Times,serif" font-size="14.00">W /= 200</text>
+</g>
+<!-- if_great_ball_3&#45;&gt;w_200 -->
+<g id="edge39" class="edge"><title>if_great_ball_3&#45;&gt;w_200</title>
+<path fill="none" stroke="black" d="M369.555,-1329.76C369.729,-1300.16 370.086,-1239.43 370.294,-1204.11"/>
+<polygon fill="black" stroke="black" points="373.794,-1204.05 370.353,-1194.03 366.794,-1204.01 373.794,-1204.05"/>
+<text text-anchor="middle" x="379.784" y="-1257.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- if_ultra_ball_2 -->
+<g id="node32" class="node"><title>if_ultra_ball_2</title>
+<polygon fill="none" stroke="black" points="475.453,-1280 405.933,-1262 475.453,-1244 544.974,-1262 475.453,-1280"/>
+<text text-anchor="middle" x="475.453" y="-1257.8" font-family="Times,serif" font-size="14.00">Ultra Ball?</text>
+</g>
+<!-- if_great_ball_3&#45;&gt;if_ultra_ball_2 -->
+<g id="edge40" class="edge"><title>if_great_ball_3&#45;&gt;if_ultra_ball_2</title>
+<path fill="none" stroke="black" d="M386.016,-1333.88C403.441,-1320.07 431.049,-1298.19 450.985,-1282.39"/>
+<polygon fill="black" stroke="black" points="453.344,-1284.99 459.007,-1276.03 448.996,-1279.5 453.344,-1284.99"/>
+<text text-anchor="middle" x="435.453" y="-1300.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- w_overflow -->
+<g id="node34" class="node"><title>w_overflow</title>
+<polygon fill="none" stroke="black" points="370.453,-1121 312.565,-1103 370.453,-1085 428.341,-1103 370.453,-1121"/>
+<text text-anchor="middle" x="370.453" y="-1098.8" font-family="Times,serif" font-size="14.00">W &gt; 255</text>
+</g>
+<!-- w_255&#45;&gt;w_overflow -->
+<g id="edge44" class="edge"><title>w_255&#45;&gt;w_overflow</title>
+<path fill="none" stroke="black" d="M287.21,-1160.29C303.885,-1149.01 326.95,-1133.42 344.573,-1121.5"/>
+<polygon fill="black" stroke="black" points="346.907,-1124.15 353.231,-1115.65 342.986,-1118.35 346.907,-1124.15"/>
+</g>
+<!-- w_200&#45;&gt;w_overflow -->
+<g id="edge43" class="edge"><title>w_200&#45;&gt;w_overflow</title>
+<path fill="none" stroke="black" d="M370.453,-1157.81C370.453,-1149.79 370.453,-1140.05 370.453,-1131.07"/>
+<polygon fill="black" stroke="black" points="373.954,-1131.03 370.453,-1121.03 366.954,-1131.03 373.954,-1131.03"/>
+</g>
+<!-- w_150 -->
+<g id="node33" class="node"><title>w_150</title>
+<ellipse fill="none" stroke="black" cx="475.453" cy="-1176" rx="43.3593" ry="18"/>
+<text text-anchor="middle" x="475.453" y="-1171.8" font-family="Times,serif" font-size="14.00">W /= 150</text>
+</g>
+<!-- if_ultra_ball_2&#45;&gt;w_150 -->
+<g id="edge41" class="edge"><title>if_ultra_ball_2&#45;&gt;w_150</title>
+<path fill="none" stroke="black" d="M475.453,-1243.6C475.453,-1232.26 475.453,-1217.23 475.453,-1204.32"/>
+<polygon fill="black" stroke="black" points="478.954,-1204.1 475.453,-1194.1 471.954,-1204.1 478.954,-1204.1"/>
+<text text-anchor="middle" x="484.784" y="-1214.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_150&#45;&gt;w_overflow -->
+<g id="edge42" class="edge"><title>w_150&#45;&gt;w_overflow</title>
+<path fill="none" stroke="black" d="M453.697,-1160.29C437.022,-1149.01 413.957,-1133.42 396.333,-1121.5"/>
+<polygon fill="black" stroke="black" points="397.921,-1118.35 387.676,-1115.65 394,-1124.15 397.921,-1118.35"/>
+</g>
+<!-- wobble_3 -->
+<g id="node35" class="node"><title>wobble_3</title>
+<ellipse fill="none" stroke="black" cx="360.453" cy="-91" rx="65.3003" ry="18"/>
+<text text-anchor="middle" x="360.453" y="-86.8" font-family="Times,serif" font-size="14.00">Wobble 3 times</text>
+</g>
+<!-- w_overflow&#45;&gt;wobble_3 -->
+<g id="edge45" class="edge"><title>w_overflow&#45;&gt;wobble_3</title>
+<path fill="none" stroke="black" d="M367.966,-1085.63C365.618,-1068.73 362.453,-1041.59 362.453,-1018 362.453,-1018 362.453,-1018 362.453,-198 362.453,-171.232 361.808,-140.669 361.25,-119.261"/>
+<polygon fill="black" stroke="black" points="364.749,-119.158 360.979,-109.257 357.752,-119.348 364.749,-119.158"/>
+<text text-anchor="middle" x="371.784" y="-571.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_by_f -->
+<g id="node36" class="node"><title>w_by_f</title>
+<ellipse fill="none" stroke="black" cx="430.453" cy="-1017" rx="37.0949" ry="18"/>
+<text text-anchor="middle" x="430.453" y="-1012.8" font-family="Times,serif" font-size="14.00">W *= F</text>
+</g>
+<!-- w_overflow&#45;&gt;w_by_f -->
+<g id="edge46" class="edge"><title>w_overflow&#45;&gt;w_by_f</title>
+<path fill="none" stroke="black" d="M380.632,-1087.75C389.463,-1075.39 402.444,-1057.21 412.941,-1042.52"/>
+<polygon fill="black" stroke="black" points="415.82,-1044.51 418.785,-1034.34 410.124,-1040.44 415.82,-1044.51"/>
+<text text-anchor="middle" x="410.453" y="-1055.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- shoot -->
+<g id="node50" class="node"><title>shoot</title>
+<ellipse fill="none" stroke="black" cx="255.453" cy="-18" rx="107.236" ry="18"/>
+<text text-anchor="middle" x="255.453" y="-13.8" font-family="Times,serif" font-size="14.00">&#39;Shoot! It was so close too!&#39;</text>
+</g>
+<!-- wobble_3&#45;&gt;shoot -->
+<g id="edge63" class="edge"><title>wobble_3&#45;&gt;shoot</title>
+<path fill="none" stroke="black" d="M336.889,-74.0662C322.605,-64.4071 304.164,-51.9376 288.444,-41.3078"/>
+<polygon fill="black" stroke="black" points="290.278,-38.3233 280.034,-35.6211 286.357,-44.122 290.278,-38.3233"/>
+</g>
+<!-- w_mod_255 -->
+<g id="node37" class="node"><title>w_mod_255</title>
+<ellipse fill="none" stroke="black" cx="465.453" cy="-944" rx="43.3593" ry="18"/>
+<text text-anchor="middle" x="465.453" y="-939.8" font-family="Times,serif" font-size="14.00">W /= 255</text>
+</g>
+<!-- w_by_f&#45;&gt;w_mod_255 -->
+<g id="edge47" class="edge"><title>w_by_f&#45;&gt;w_mod_255</title>
+<path fill="none" stroke="black" d="M438.748,-999.174C442.932,-990.686 448.099,-980.206 452.769,-970.732"/>
+<polygon fill="black" stroke="black" points="455.936,-972.222 457.218,-961.705 449.658,-969.127 455.936,-972.222"/>
+</g>
+<!-- if_asleep_or_frozen_2 -->
+<g id="node38" class="node"><title>if_asleep_or_frozen_2</title>
+<polygon fill="none" stroke="black" points="564.453,-876 456.559,-826 564.453,-776 672.348,-826 564.453,-876"/>
+<text text-anchor="middle" x="564.453" y="-835.8" font-family="Times,serif" font-size="14.00">Target Pokémon</text>
+<text text-anchor="middle" x="564.453" y="-821.8" font-family="Times,serif" font-size="14.00">asleep</text>
+<text text-anchor="middle" x="564.453" y="-807.8" font-family="Times,serif" font-size="14.00">or frozen?</text>
+</g>
+<!-- w_mod_255&#45;&gt;if_asleep_or_frozen_2 -->
+<g id="edge48" class="edge"><title>w_mod_255&#45;&gt;if_asleep_or_frozen_2</title>
+<path fill="none" stroke="black" d="M479.219,-926.871C491.695,-912.252 510.657,-890.034 527.53,-870.263"/>
+<polygon fill="black" stroke="black" points="530.29,-872.421 534.12,-862.543 524.966,-867.877 530.29,-872.421"/>
+</g>
+<!-- if_poisoned_burned_or_paralyzed_2 -->
+<g id="node39" class="node"><title>if_poisoned_burned_or_paralyzed_2</title>
+<polygon fill="none" stroke="black" points="638.453,-640 530.559,-576 638.453,-512 746.348,-576 638.453,-640"/>
+<text text-anchor="middle" x="638.453" y="-592.8" font-family="Times,serif" font-size="14.00">Target Pokémon</text>
+<text text-anchor="middle" x="638.453" y="-578.8" font-family="Times,serif" font-size="14.00">poisoned,</text>
+<text text-anchor="middle" x="638.453" y="-564.8" font-family="Times,serif" font-size="14.00">burned, or</text>
+<text text-anchor="middle" x="638.453" y="-550.8" font-family="Times,serif" font-size="14.00"> frozen?</text>
+</g>
+<!-- if_asleep_or_frozen_2&#45;&gt;if_poisoned_burned_or_paralyzed_2 -->
+<g id="edge49" class="edge"><title>if_asleep_or_frozen_2&#45;&gt;if_poisoned_burned_or_paralyzed_2</title>
+<path fill="none" stroke="black" d="M562.423,-776.886C562.61,-750.682 564.971,-717.987 573.453,-690 579.744,-669.246 590.431,-648.197 601.344,-629.982"/>
+<polygon fill="black" stroke="black" points="604.438,-631.632 606.7,-621.281 598.477,-627.962 604.438,-631.632"/>
+<text text-anchor="middle" x="580.453" y="-703.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- w_plus_10 -->
+<g id="node40" class="node"><title>w_plus_10</title>
+<ellipse fill="none" stroke="black" cx="638.453" cy="-708" rx="41.5766" ry="18"/>
+<text text-anchor="middle" x="638.453" y="-703.8" font-family="Times,serif" font-size="14.00">W += 10</text>
+</g>
+<!-- if_asleep_or_frozen_2&#45;&gt;w_plus_10 -->
+<g id="edge50" class="edge"><title>if_asleep_or_frozen_2&#45;&gt;w_plus_10</title>
+<path fill="none" stroke="black" d="M588.684,-787.017C599.748,-769.674 612.548,-749.608 622.397,-734.17"/>
+<polygon fill="black" stroke="black" points="625.392,-735.983 627.819,-725.67 619.49,-732.218 625.392,-735.983"/>
+<text text-anchor="middle" x="623.784" y="-746.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_plus_5 -->
+<g id="node41" class="node"><title>w_plus_5</title>
+<ellipse fill="none" stroke="black" cx="707.453" cy="-444" rx="37.2334" ry="18"/>
+<text text-anchor="middle" x="707.453" y="-439.8" font-family="Times,serif" font-size="14.00">W += 5</text>
+</g>
+<!-- if_poisoned_burned_or_paralyzed_2&#45;&gt;w_plus_5 -->
+<g id="edge52" class="edge"><title>if_poisoned_burned_or_paralyzed_2&#45;&gt;w_plus_5</title>
+<path fill="none" stroke="black" d="M663.95,-526.962C673.997,-508.035 685.138,-487.044 693.63,-471.044"/>
+<polygon fill="black" stroke="black" points="696.945,-472.263 698.542,-461.789 690.762,-468.981 696.945,-472.263"/>
+<text text-anchor="middle" x="695.784" y="-482.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_less_than_10 -->
+<g id="node42" class="node"><title>w_less_than_10</title>
+<polygon fill="none" stroke="black" points="707.453,-389 655.571,-371 707.453,-353 759.336,-371 707.453,-389"/>
+<text text-anchor="middle" x="707.453" y="-366.8" font-family="Times,serif" font-size="14.00">W &lt; 10</text>
+</g>
+<!-- if_poisoned_burned_or_paralyzed_2&#45;&gt;w_less_than_10 -->
+<g id="edge54" class="edge"><title>if_poisoned_burned_or_paralyzed_2&#45;&gt;w_less_than_10</title>
+<path fill="none" stroke="black" d="M631.904,-515.802C631.226,-487.356 634.175,-453.547 647.453,-426 654.771,-410.819 668.452,-397.986 680.905,-388.643"/>
+<polygon fill="black" stroke="black" points="683.095,-391.381 689.236,-382.747 679.051,-385.667 683.095,-391.381"/>
+<text text-anchor="middle" x="654.453" y="-439.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- w_plus_10&#45;&gt;if_poisoned_burned_or_paralyzed_2 -->
+<g id="edge51" class="edge"><title>w_plus_10&#45;&gt;if_poisoned_burned_or_paralyzed_2</title>
+<path fill="none" stroke="black" d="M638.453,-689.737C638.453,-679.299 638.453,-665.201 638.453,-650.513"/>
+<polygon fill="black" stroke="black" points="641.954,-650.288 638.453,-640.288 634.954,-650.288 641.954,-650.288"/>
+<text text-anchor="middle" x="645.453" y="-660.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- w_plus_5&#45;&gt;w_less_than_10 -->
+<g id="edge53" class="edge"><title>w_plus_5&#45;&gt;w_less_than_10</title>
+<path fill="none" stroke="black" d="M707.453,-425.813C707.453,-417.789 707.453,-408.047 707.453,-399.069"/>
+<polygon fill="black" stroke="black" points="710.954,-399.029 707.453,-389.029 703.954,-399.029 710.954,-399.029"/>
+</g>
+<!-- w_less_than_30 -->
+<g id="node43" class="node"><title>w_less_than_30</title>
+<polygon fill="none" stroke="black" points="707.453,-303 655.571,-285 707.453,-267 759.336,-285 707.453,-303"/>
+<text text-anchor="middle" x="707.453" y="-280.8" font-family="Times,serif" font-size="14.00">W &lt; 30</text>
+</g>
+<!-- w_less_than_10&#45;&gt;w_less_than_30 -->
+<g id="edge55" class="edge"><title>w_less_than_10&#45;&gt;w_less_than_30</title>
+<path fill="none" stroke="black" d="M707.453,-352.595C707.453,-341.257 707.453,-326.227 707.453,-313.315"/>
+<polygon fill="black" stroke="black" points="710.954,-313.095 707.453,-303.095 703.954,-313.095 710.954,-313.095"/>
+<text text-anchor="middle" x="714.453" y="-323.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- missed -->
+<g id="node44" class="node"><title>missed</title>
+<ellipse fill="none" stroke="black" cx="1066.45" cy="-18" rx="129.928" ry="18"/>
+<text text-anchor="middle" x="1066.45" y="-13.8" font-family="Times,serif" font-size="14.00">&#39;The ball missed the POKéMON!&#39;</text>
+</g>
+<!-- w_less_than_10&#45;&gt;missed -->
+<g id="edge56" class="edge"><title>w_less_than_10&#45;&gt;missed</title>
+<path fill="none" stroke="black" d="M753.286,-368.82C850.068,-365.081 1066.45,-349.61 1066.45,-286 1066.45,-286 1066.45,-286 1066.45,-90 1066.45,-75.6513 1066.45,-59.6715 1066.45,-46.5107"/>
+<polygon fill="black" stroke="black" points="1069.95,-46.2164 1066.45,-36.2164 1062.95,-46.2164 1069.95,-46.2164"/>
+<text text-anchor="middle" x="1075.78" y="-194.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_less_than_70 -->
+<g id="node45" class="node"><title>w_less_than_70</title>
+<polygon fill="none" stroke="black" points="509.453,-217 457.571,-199 509.453,-181 561.336,-199 509.453,-217"/>
+<text text-anchor="middle" x="509.453" y="-194.8" font-family="Times,serif" font-size="14.00">W &lt; 70</text>
+</g>
+<!-- w_less_than_30&#45;&gt;w_less_than_70 -->
+<g id="edge57" class="edge"><title>w_less_than_30&#45;&gt;w_less_than_70</title>
+<path fill="none" stroke="black" d="M685.125,-274.527C649.901,-259.584 581.311,-230.485 541.047,-213.403"/>
+<polygon fill="black" stroke="black" points="542.273,-210.121 531.7,-209.438 539.539,-216.566 542.273,-210.121"/>
+<text text-anchor="middle" x="626.453" y="-237.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- wobble_1 -->
+<g id="node46" class="node"><title>wobble_1</title>
+<ellipse fill="none" stroke="black" cx="763.453" cy="-145" rx="65.3003" ry="18"/>
+<text text-anchor="middle" x="763.453" y="-140.8" font-family="Times,serif" font-size="14.00">Wobble 1 times</text>
+</g>
+<!-- w_less_than_30&#45;&gt;wobble_1 -->
+<g id="edge58" class="edge"><title>w_less_than_30&#45;&gt;wobble_1</title>
+<path fill="none" stroke="black" d="M713.553,-268.969C722.935,-245.848 741.04,-201.233 752.669,-172.575"/>
+<polygon fill="black" stroke="black" points="755.971,-173.747 756.488,-163.165 749.485,-171.115 755.971,-173.747"/>
+<text text-anchor="middle" x="735.784" y="-237.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- w_less_than_70&#45;&gt;wobble_3 -->
+<g id="edge60" class="edge"><title>w_less_than_70&#45;&gt;wobble_3</title>
+<path fill="none" stroke="black" d="M493.224,-186.454C468.818,-169.092 422.231,-135.949 391.247,-113.907"/>
+<polygon fill="black" stroke="black" points="393.13,-110.951 382.953,-108.006 389.073,-116.655 393.13,-110.951"/>
+<text text-anchor="middle" x="463.453" y="-140.8" font-family="Times,serif" font-size="14.00">no</text>
+</g>
+<!-- wobble_2 -->
+<g id="node47" class="node"><title>wobble_2</title>
+<ellipse fill="none" stroke="black" cx="509.453" cy="-91" rx="65.3003" ry="18"/>
+<text text-anchor="middle" x="509.453" y="-86.8" font-family="Times,serif" font-size="14.00">Wobble 2 times</text>
+</g>
+<!-- w_less_than_70&#45;&gt;wobble_2 -->
+<g id="edge59" class="edge"><title>w_less_than_70&#45;&gt;wobble_2</title>
+<path fill="none" stroke="black" d="M509.453,-180.969C509.453,-164.378 509.453,-138.883 509.453,-119.431"/>
+<polygon fill="black" stroke="black" points="512.954,-119.341 509.453,-109.341 505.954,-119.341 512.954,-119.341"/>
+<text text-anchor="middle" x="518.784" y="-140.8" font-family="Times,serif" font-size="14.00">yes</text>
+</g>
+<!-- broke_free -->
+<g id="node48" class="node"><title>broke_free</title>
+<ellipse fill="none" stroke="black" cx="783.453" cy="-18" rx="135.353" ry="18"/>
+<text text-anchor="middle" x="783.453" y="-13.8" font-family="Times,serif" font-size="14.00">&#39;Darn! The POKéMON broke free!&#39;</text>
+</g>
+<!-- wobble_1&#45;&gt;broke_free -->
+<g id="edge61" class="edge"><title>wobble_1&#45;&gt;broke_free</title>
+<path fill="none" stroke="black" d="M766.192,-126.881C769.51,-106.146 775.141,-70.9525 779.066,-46.4215"/>
+<polygon fill="black" stroke="black" points="782.559,-46.7404 780.683,-36.313 775.647,-45.6344 782.559,-46.7404"/>
+</g>
+<!-- appeared_to_be_caught -->
+<g id="node49" class="node"><title>appeared_to_be_caught</title>
+<ellipse fill="none" stroke="black" cx="505.453" cy="-18" rx="124.893" ry="18"/>
+<text text-anchor="middle" x="505.453" y="-13.8" font-family="Times,serif" font-size="14.00">&#39;Aww! It appeared to be caught!&#39;</text>
+</g>
+<!-- wobble_2&#45;&gt;appeared_to_be_caught -->
+<g id="edge62" class="edge"><title>wobble_2&#45;&gt;appeared_to_be_caught</title>
+<path fill="none" stroke="black" d="M508.485,-72.8129C508.033,-64.7895 507.484,-55.0475 506.978,-46.0691"/>
+<polygon fill="black" stroke="black" points="510.47,-45.8161 506.413,-36.0288 503.481,-46.2099 510.47,-45.8161"/>
+</g>
+</g>
+</svg>
diff --git a/website/static/media/rainbow_box.123dx b/website/static/media/rainbow_box.123dx
new file mode 100644
index 0000000..4434bc4
--- /dev/null
+++ b/website/static/media/rainbow_box.123dx
Binary files differ
diff --git a/website/static/media/rainbow_box_intro.gif b/website/static/media/rainbow_box_intro.gif
new file mode 100644
index 0000000..8de5a5c
--- /dev/null
+++ b/website/static/media/rainbow_box_intro.gif
Binary files differ
diff --git a/website/static/media/rainbow_box_intro.mp4 b/website/static/media/rainbow_box_intro.mp4
new file mode 100644
index 0000000..5c4c3ec
--- /dev/null
+++ b/website/static/media/rainbow_box_intro.mp4
Binary files differ
diff --git a/website/static/media/rainbow_box_model_screenshot.png b/website/static/media/rainbow_box_model_screenshot.png
new file mode 100644
index 0000000..dae70c1
--- /dev/null
+++ b/website/static/media/rainbow_box_model_screenshot.png
Binary files differ
diff --git a/website/static/media/rainbow_box_wiring.png b/website/static/media/rainbow_box_wiring.png
new file mode 100644
index 0000000..d766791
--- /dev/null
+++ b/website/static/media/rainbow_box_wiring.png
Binary files differ
diff --git a/website/static/media/rainbow_box_wiring.svg b/website/static/media/rainbow_box_wiring.svg
new file mode 100644
index 0000000..9e58b8f
--- /dev/null
+++ b/website/static/media/rainbow_box_wiring.svg
@@ -0,0 +1,626 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Fritzing (http://www.fritzing.org/) -->
+<svg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' version='1.2' baseProfile='tiny' x='0in' y='0in' viewBox='0 0 336.419 218.071' >
+<g partID='22070'><g transform='translate(76.1759,51.3489)' ><g id="schematic">
+<rect width="78.3" class="interior rect" x="14.85" stroke-width="0.9" y="14.85" stroke="#000000" stroke-linecap="round" height="135.9" fill="#FFFFFF"/>
+<line y1="36" y2="36" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector33pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="36.6999" stroke="none" text-anchor="end" fill="#8c8c8c">D13/SCK</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="35.6499" stroke="none" height="0.699999" fill="none" id="connector33terminal"/>
+<line y1="43.2" y2="43.2" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector34pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="43.8999" stroke="none" text-anchor="end" fill="#8c8c8c">D12/MISO</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="42.8499" stroke="none" height="0.699999" fill="none" id="connector34terminal"/>
+<line y1="50.4" y2="50.4" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector35pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="51.0999" stroke="none" text-anchor="end" fill="#8c8c8c">D11 PWM/MOSI</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="50.0499" stroke="none" height="0.699999" fill="none" id="connector35terminal"/>
+<line y1="57.6" y2="57.6" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector36pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="58.2999" stroke="none" text-anchor="end" fill="#8c8c8c">D10 PWM/SS</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="57.2499" stroke="none" height="0.699999" fill="none" id="connector36terminal"/>
+<line y1="72" y2="72" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector37pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="72.6999" stroke="none" text-anchor="end" fill="#8c8c8c">D9 PWM</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="71.6499" stroke="none" height="0.699999" fill="none" id="connector37terminal"/>
+<line y1="79.2" y2="79.2" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector38pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="79.8999" stroke="none" text-anchor="end" fill="#8c8c8c">D8</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="78.8499" stroke="none" height="0.699999" fill="none" id="connector38terminal"/>
+<line y1="86.4" y2="86.4" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector39pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="87.0999" stroke="none" text-anchor="end" fill="#8c8c8c">D7</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="86.0499" stroke="none" height="0.699999" fill="none" id="connector39terminal"/>
+<line y1="93.6" y2="93.6" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector40pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="94.2999" stroke="none" text-anchor="end" fill="#8c8c8c">D6 PWM</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="93.2499" stroke="none" height="0.699999" fill="none" id="connector40terminal"/>
+<line y1="100.8" y2="100.8" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector41pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="101.5" stroke="none" text-anchor="end" fill="#8c8c8c">D5 PWM</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="100.45" stroke="none" height="0.699999" fill="none" id="connector41terminal"/>
+<line y1="108" y2="108" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector42pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="108.7" stroke="none" text-anchor="end" fill="#8c8c8c">D4</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="107.65" stroke="none" height="0.699999" fill="none" id="connector42terminal"/>
+<line y1="115.2" y2="115.2" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector43pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="115.9" stroke="none" text-anchor="end" fill="#8c8c8c">D3 PWM</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="114.85" stroke="none" height="0.699999" fill="none" id="connector43terminal"/>
+<line y1="122.4" y2="122.4" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector44pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="123.1" stroke="none" text-anchor="end" fill="#8c8c8c">D2</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="122.05" stroke="none" height="0.699999" fill="none" id="connector44terminal"/>
+<line y1="129.6" y2="129.6" x1="93.2499" x2="107.65" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector16pin"/>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="129.25" stroke="none" height="0.699999" fill="none" id="connector16terminal"/>
+<line y1="129.6" y2="129.6" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector47pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="130.3" stroke="none" text-anchor="end" fill="#8c8c8c">D1/RX</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="129.25" stroke="none" height="0.699999" fill="none" id="connector47terminal"/>
+<line y1="136.8" y2="136.8" x1="93.2499" x2="107.65" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector15pin"/>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="136.45" stroke="none" height="0.699999" fill="none" id="connector15terminal"/>
+<line y1="136.8" y2="136.8" x1="93.2499" x2="107.65" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector48pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="91.8499" y="137.5" stroke="none" text-anchor="end" fill="#8c8c8c">D0/TX</text>
+<g width="0.699999" class="terminal" x="107.65" stroke-width="0" y="136.45" stroke="none" height="0.699999" fill="none" id="connector48terminal"/>
+<line y1="36" y2="36" x1="0.349999" x2="14.75" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector27pin"/>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="35.6499" stroke="none" height="0.699999" fill="none" id="connector27terminal"/>
+<line y1="36" y2="36" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector46pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="36.6999" stroke="none" text-anchor="start" fill="#8c8c8c">RESET</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="35.6499" stroke="none" height="0.699999" fill="none" id="connector46terminal"/>
+<line y1="43.2" y2="43.2" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector14pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="43.8999" stroke="none" text-anchor="start" fill="#8c8c8c">DTR</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="42.8499" stroke="none" height="0.699999" fill="none" id="connector14terminal"/>
+<line y1="57.6" y2="57.6" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector32pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="58.2999" stroke="none" text-anchor="start" fill="#8c8c8c">A0</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="57.2499" stroke="none" height="0.699999" fill="none" id="connector32terminal"/>
+<line y1="64.8" y2="64.8" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector31pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="65.4999" stroke="none" text-anchor="start" fill="#8c8c8c">A1</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="64.4499" stroke="none" height="0.699999" fill="none" id="connector31terminal"/>
+<line y1="72" y2="72" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector30pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="72.6999" stroke="none" text-anchor="start" fill="#8c8c8c">A2</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="71.6499" stroke="none" height="0.699999" fill="none" id="connector30terminal"/>
+<line y1="79.2" y2="79.2" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector29pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="79.8999" stroke="none" text-anchor="start" fill="#8c8c8c">A3</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="78.8499" stroke="none" height="0.699999" fill="none" id="connector29terminal"/>
+<line y1="86.4" y2="86.4" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector20pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="87.0999" stroke="none" text-anchor="start" fill="#8c8c8c">A4</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="86.0499" stroke="none" height="0.699999" fill="none" id="connector20terminal"/>
+<line y1="93.6" y2="93.6" x1="0.349999" x2="14.75" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector21pin"/>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="16.15" y="94.2999" stroke="none" text-anchor="start" fill="#8c8c8c">A5</text>
+<g width="0.699999" class="terminal" x="-0.349999" stroke-width="0" y="93.2499" stroke="none" height="0.699999" fill="none" id="connector21terminal"/>
+<line y1="150.85" y2="165.25" x1="57.6" x2="57.6" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector26pin"/>
+<g width="0.699999" class="terminal" x="57.2499" stroke-width="0" y="165.25" stroke="none" height="0.699999" fill="none" id="connector26terminal"/>
+<line y1="150.85" y2="165.25" x1="57.6" x2="57.6" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector18pin"/>
+<g width="0.699999" class="terminal" x="57.2499" stroke-width="0" y="165.25" stroke="none" height="0.699999" fill="none" id="connector18terminal"/>
+<line y1="150.85" y2="165.25" x1="57.6" x2="57.6" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector19pin"/>
+<g width="0.699999" class="terminal" x="57.2499" stroke-width="0" y="165.25" stroke="none" height="0.699999" fill="none" id="connector19terminal"/>
+<line y1="150.85" y2="165.25" x1="57.6" x2="57.6" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector45pin"/>
+<g transform="matrix(1, 0, 0, 1, 58.2999, 149.45)">
+<g>
+<g transform="rotate(270)">
+<g>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="0" y="0" stroke="none" text-anchor="start" fill="#8c8c8c">GND</text>
+</g>
+</g>
+</g>
+</g>
+<g width="0.699999" class="terminal" x="57.2499" stroke-width="0" y="165.25" stroke="none" height="0.699999" fill="none" id="connector45terminal"/>
+<line y1="0.349999" y2="14.75" x1="43.2" x2="43.2" class="pin" stroke-width="0" stroke="none" stroke-linecap="round" fill="none" id="connector17pin"/>
+<g width="0.699999" class="terminal" x="42.8499" stroke-width="0" y="-0.349999" stroke="none" height="0.699999" fill="none" id="connector17terminal"/>
+<line y1="0.349999" y2="14.75" x1="43.2" x2="43.2" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector28pin"/>
+<g transform="matrix(1, 0, 0, 1, 43.8999, 16.15)">
+<g>
+<g transform="rotate(270)">
+<g>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="0" y="0" stroke="none" text-anchor="end" fill="#8c8c8c">VCC</text>
+</g>
+</g>
+</g>
+</g>
+<g width="0.699999" class="terminal" x="42.8499" stroke-width="0" y="-0.349999" stroke="none" height="0.699999" fill="none" id="connector28terminal"/>
+<line y1="0.349999" y2="14.75" x1="57.6" x2="57.6" class="pin" stroke-width="0.699999" stroke="#787878" stroke-linecap="round" fill="none" id="connector25pin"/>
+<g transform="matrix(1, 0, 0, 1, 58.2999, 16.15)">
+<g>
+<g transform="rotate(270)">
+<g>
+<text font-size="3.49999" font-family="'Droid Sans'" class="text" stroke-width="0" x="0" y="0" stroke="none" text-anchor="end" fill="#8c8c8c">RAW</text>
+</g>
+</g>
+</g>
+</g>
+<g width="0.699999" class="terminal" x="57.2499" stroke-width="0" y="-0.349999" stroke="none" height="0.699999" fill="none" id="connector25terminal"/>
+<text font-size="4.25001" font-family="'Droid Sans'" class="text" stroke-width="0" x="54.4501" y="74.183" stroke="none" text-anchor="middle" fill="#000000" id="label">Arduino</text>
+<text font-size="4.25001" font-family="'Droid Sans'" class="text" stroke-width="0" x="54.4501" y="78.7164" stroke="none" text-anchor="middle" fill="#000000" id="label">Pro</text>
+<text font-size="4.25001" font-family="'Droid Sans'" class="text" stroke-width="0" x="54.4501" y="83.2501" stroke="none" text-anchor="middle" fill="#000000" id="label">Mini</text>
+<text font-size="4.25001" font-family="'Droid Sans'" class="text" stroke-width="0" x="54.4501" y="87.7836" stroke="none" text-anchor="middle" fill="#000000" id="label">v13</text>
+</g>
+</g></g><g partID='29620'><g transform='translate(32.6257,112.189)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='23420'><g transform='translate(241.426,25.7888)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='29630'><g transform='translate(241.426,11.3888)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='29640'><g transform='translate(32.6257,104.989)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='29400'><g transform='translate(241.426,54.5888)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='23450'><g transform='translate(241.426,40.1888)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.96" y2="3.96" x1="20.1501" x2="21.9501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.96" y2="0.36" x1="7.55002" x2="20.1501" class="other" stroke-width="0.720003" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="7.55002" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="21.9501" r="0.360001" cy="3.96" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="3.96" y2="3.96" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="3.96" y2="3.96" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.96" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector2terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.90999" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+</g>
+</g></g><g partID='25350'><g transform='translate(2.86999,130.899)' ><g transform='matrix(0,-1,1,0,0,0)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="8.50619" y2="4.9062" x1="7.54999" x2="14.75" class="other" stroke-width="0.72" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="15.7062" y2="15.7062" x1="14.75" x2="16.55" class="other" stroke-width="0.36" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="1.3062" y2="1.3062" x1="14.75" x2="16.55" class="other" stroke-width="0.432" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<circle cx="14.75" r="1.0182" cy="1.3062" class="other" stroke-width="0.576" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="14.75" r="1.0182" cy="15.7062" class="other" stroke-width="0.576" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<circle cx="7.54999" r="1.0182" cy="8.50619" class="other" stroke-width="0.576" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="none"/>
+<line y1="8.50619" y2="8.50619" connectorname="P" x1="0.349999" x2="7.54999" class="pin" stroke-width="0.699999" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283465" class="terminal" x="0.349999" stroke-width="0" y="8.50619" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283464" fill="none" id="connector1terminal"/>
+<text font-size="2.5" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.94999" y="7.45618" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="15.7062" y2="15.7062" connectorname="S" x1="21.95" x2="14.75" class="pin" stroke-width="0.699999" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector2pin"/>
+<g width="0.000283465" class="terminal" x="21.95" stroke-width="0" y="15.7062" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283464" fill="none" id="connector2terminal"/>
+<text font-size="2.5" font-family="'Droid Sans'" class="text" stroke-width="0" x="18.35" y="14.6562" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">3</text>
+<line y1="1.3062" y2="1.3062" connectorname="O" x1="21.95" x2="14.75" class="pin" stroke-width="0.699999" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283465" class="terminal" x="21.95" stroke-width="0" y="1.3062" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283464" fill="none" id="connector0terminal"/>
+<text font-size="2.5" font-family="'Droid Sans'" class="text" stroke-width="0" x="18.35" y="0.256206" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g></g><g partID='26430'><g transform='translate(22.752,137.399)' ><g transform='matrix(0,1,-1,0,0,0)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="0.576" y2="22.176" x1="11.15" x2="11.15" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="7.776" y2="14.976" x1="14.75" x2="14.75" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.576" y2="22.176" x1="18.3501" x2="18.3501" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="7.776" y2="14.976" x1="21.9501" x2="21.9501" class="other" stroke-width="1.152" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="11.376" y2="11.376" x1="7.55002" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="11.376" y2="11.376" connectorname="-" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="11.376" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="10.326" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+<line y1="11.376" y2="11.376" connectorname="+" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="11.376" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="10.326" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+</g>
+</g></g></g><g partID='27620'><g transform='translate(241.426,103.416)' ><g id="schematic">
+<rect width="72" x="14.75" y="5.533" fill="#FFFFFF" height="86.398"/>
+<rect width="72" x="14.75" y="5.533" fill="#FFFFFF" height="86.398"/>
+<rect width="72" x="14.75" y="5.533" fill="#FFFFFF" height="86.398"/>
+<g transform="matrix(1, 0, 0, 1, 20.4324, 11.9033)">
+<text font-size="4.25" font-family="'DroidSans'" id="label_4_">7 SEGMENT</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 28.7244, 16.4375)">
+<text font-size="4.25" font-family="'DroidSans'" id="label_5_">1"</text>
+</g>
+<line y1="91.934" y2="5.533" x1="14.75" x2="14.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="5.533" y2="5.533" x1="14.75" x2="86.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="5.533" y2="91.934" x1="86.75" x2="86.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="91.934" y2="91.934" x1="14.75" x2="86.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="12.734" y2="9.133" x1="47.15" x2="50.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="9.133" y2="9.133" x1="50.75" x2="72.351" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="9.133" y2="12.734" x1="72.351" x2="75.95" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="12.734" y2="16.333" x1="75.95" x2="72.351" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="16.333" y2="16.333" x1="72.351" x2="50.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="16.333" y2="12.734" x1="50.75" x2="47.15" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="19.933" y2="41.533" x1="73.069" x2="69.47" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="41.533" y2="45.133" x1="69.47" x2="73.069" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="45.133" y2="41.533" x1="73.069" x2="76.67" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="41.533" y2="19.933" x1="76.67" x2="80.271" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="19.933" y2="16.333" x1="80.271" x2="76.67" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="16.333" y2="19.933" x1="76.67" x2="73.069" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="19.213" y2="40.813" x1="42.11" x2="38.51" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="40.813" y2="44.413" x1="38.51" x2="42.11" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="44.413" y2="40.813" x1="42.11" x2="45.71" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="40.813" y2="19.213" x1="45.71" x2="49.31" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="19.213" y2="15.614" x1="49.31" x2="45.71" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="15.614" y2="19.213" x1="45.71" x2="42.11" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="47.293" y2="43.694" x1="42.83" x2="46.43" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="43.694" y2="43.694" x1="46.43" x2="68.03" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="43.694" y2="47.293" x1="68.03" x2="71.63" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="47.293" y2="50.893" x1="71.63" x2="68.03" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="50.893" y2="50.893" x1="68.03" x2="46.43" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="50.893" y2="47.293" x1="46.43" x2="42.83" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="53.053" y2="74.654" x1="37.79" x2="34.19" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="74.654" y2="78.253" x1="34.19" x2="37.79" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="78.253" y2="74.654" x1="37.79" x2="41.39" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="74.654" y2="53.053" x1="41.39" x2="44.99" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="53.053" y2="49.453" x1="44.99" x2="41.39" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="49.453" y2="53.053" x1="41.39" x2="37.79" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="53.773" y2="75.373" x1="68.75" x2="65.149" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="75.373" y2="78.973" x1="65.149" x2="68.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="78.973" y2="75.373" x1="68.75" x2="72.351" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="75.373" y2="53.773" x1="72.351" x2="75.95" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="53.773" y2="50.173" x1="75.95" x2="72.351" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="50.173" y2="53.773" x1="72.351" x2="68.75" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="81.133" y2="77.533" x1="38.51" x2="42.11" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="77.533" y2="77.533" x1="42.11" x2="63.71" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="77.533" y2="81.133" x1="63.71" x2="67.31" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="81.133" y2="84.732" x1="67.31" x2="63.71" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="84.732" y2="84.732" x1="63.71" x2="42.11" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<line y1="84.732" y2="81.133" x1="42.11" x2="38.51" stroke-width="0.9" stroke="#000000" stroke-linecap="round" fill="none"/>
+<circle cx="79.55" r="3.6" cy="84.733" stroke-width="0.508" stroke="#000000" fill="none"/>
+<g transform="matrix(1, 0, 0, 1, 60.1086, 14.1709)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">A</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 73.7883, 32.1709)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">B</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 69.4709, 66.7324)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">C</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 51.47, 82.5723)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">D</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 38.51, 65.292)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">E</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 42.8293, 31.4521)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">F</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 55.7883, 48.7314)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">G</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 77.3372, 86.1719)">
+<text font-size="3.744" font-family="'DroidSans'" fill="#505050">DP</text>
+</g>
+<line y1="19.933" y2="19.933" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector6pin"/>
+<g width="0" x="0.35" y="19.933" fill="none" height="0.001" id="connector6terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 18.8818)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">7</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 20.6318)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">A</text>
+</g>
+<line y1="27.133" y2="27.133" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector5pin"/>
+<g points="0.35,27.133,0.35,27.133,0.35,27.133" fill="none" id="connector5terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 26.082)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">6</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 27.832)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">B</text>
+</g>
+<line y1="34.333" y2="34.333" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector3pin"/>
+<g points="0.35,34.333,0.35,34.333,0.35,34.333" fill="none" id="connector3terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 33.2822)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">4</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 35.0322)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">C</text>
+</g>
+<line y1="41.533" y2="41.533" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector1pin"/>
+<g points="0.35,41.533,0.35,41.533,0.35,41.533" fill="none" id="connector1terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 40.4824)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">2</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 42.2324)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">D</text>
+</g>
+<line y1="48.732" y2="48.732" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector0pin"/>
+<g width="0" x="0.35" y="48.732" fill="none" height="0.002" id="connector0terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 47.6826)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">1</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 49.4307)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">E</text>
+</g>
+<line y1="55.934" y2="55.934" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector8pin"/>
+<g width="0" x="0.35" y="55.934" fill="none" height="0" id="connector8terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 54.8828)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">9</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 56.6318)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">F</text>
+</g>
+<line y1="63.133" y2="63.133" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector9pin"/>
+<g points="0.35,63.133,0.35,63.133,0.35,63.133" fill="none" id="connector9terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.1731, 62.082)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">10</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 63.832)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">G</text>
+</g>
+<line y1="70.333" y2="70.333" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector4pin"/>
+<g points="0.35,70.333,0.35,70.333,0.35,70.333" fill="none" id="connector4terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 69.2832)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">5</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 71.0322)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">DP</text>
+</g>
+<line y1="77.533" y2="77.533" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector2pin"/>
+<g points="0.35,77.533,0.35,77.533,0.35,77.533" fill="none" id="connector2terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 76.4814)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">3</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 78.2314)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">G1</text>
+</g>
+<line y1="84.732" y2="84.732" x1="0.35" x2="14.75" stroke-width="0.75" stroke="#787878" stroke-linecap="round" fill="none" id="connector7pin"/>
+<g width="0" x="0.35" y="84.732" fill="none" height="0.002" id="connector7terminal"/>
+<g transform="matrix(1, 0, 0, 1, 6.8606, 83.6826)">
+<text font-size="2.5" font-family="'DroidSans'" fill="#8C8C8C">8</text>
+</g>
+<g transform="matrix(1, 0, 0, 1, 16.8499, 85.4307)">
+<text font-size="3.5" font-family="'DroidSans'" fill="#787878">G2</text>
+</g>
+</g>
+</g></g><g partID='43110'><g transform='translate(205.426,149.053)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='42910'><g transform='translate(205.426,127.453)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='42710'><g transform='translate(205.426,141.853)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='43210'><g transform='translate(205.426,163.453)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='43410'><g transform='translate(205.426,134.653)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='42810'><g transform='translate(205.426,120.253)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='43010'><g transform='translate(205.426,156.253)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='43310'><g transform='translate(205.426,170.653)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='29670'><g transform='translate(64.872,144.599)' ><g transform='matrix(0,1,-1,0,0,0)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g></g><g partID='29660'><g transform='translate(191.026,12.2528)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='29650'><g transform='translate(72.072,144.599)' ><g transform='matrix(0,1,-1,0,0,0)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g></g><g partID='29410'><g transform='translate(191.026,55.4528)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='28740'><g transform='translate(191.026,41.0528)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='28720'><g transform='translate(191.026,26.6528)' ><g xmlns="http://www.w3.org/2000/svg" id="schematic">
+<line y1="3.096" y2="0.216" x1="7.55002" x2="8.63003" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="8.63003" x2="10.43" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="10.43" x2="12.23" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="12.23" x2="14.03" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="14.03" x2="15.8301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="15.8301" x2="17.6301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="0.216" x1="17.6301" x2="19.4301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="0.216" y2="5.976" x1="19.4301" x2="21.2301" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="5.976" y2="3.096" x1="21.2301" x2="21.9501" class="other" stroke-width="0.432002" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-linecap="round"/>
+<line y1="3.096" y2="3.096" connectorname="2" x1="29.1502" x2="21.9501" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector1pin"/>
+<g width="0.000283466" class="terminal" x="29.1502" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector1terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="25.5501" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">2</text>
+<line y1="3.096" y2="3.096" connectorname="1" x1="0.350001" x2="7.55002" class="pin" stroke-width="0.700001" xmlns="http://www.w3.org/2000/svg" stroke="#787878" stroke-linecap="round" id="connector0pin"/>
+<g width="0.000283466" class="terminal" x="0.350001" stroke-width="0" y="3.096" xmlns="http://www.w3.org/2000/svg" stroke="none" height="0.000283465" fill="none" id="connector0terminal"/>
+<text font-size="2.50001" font-family="'Droid Sans'" class="text" stroke-width="0" x="3.95001" y="2.046" xmlns="http://www.w3.org/2000/svg" stroke="none" text-anchor="middle" fill="#8c8c8c">1</text>
+</g>
+</g></g><g partID='26530'><line stroke-linecap='round' stroke='#404040' x1='11.3763' y1='130.549' x2='11.3759' y2='137.749' stroke-width='0.699998' /></g><g partID='26760'><line stroke-linecap='round' stroke='#404040' x1='11.4113' y1='216.945' x2='11.3759' y2='166.549' stroke-width='0.699998' /></g><g partID='26600'><line stroke-linecap='round' stroke='#404040' x1='133.776' y1='216.949' x2='69.0738' y2='216.945' stroke-width='0.699998' /></g><circle fill="black" cx="133.776" cy="216.949" r="1.44" stroke-width="0" stroke="none" /><g partID='35680'><line stroke-linecap='round' stroke='#404040' x1='69.0738' y1='216.945' x2='62.2632' y2='216.945' stroke-width='0.699998' /></g><circle fill="black" cx="69.0738" cy="216.945" r="1.44" stroke-width="0" stroke="none" /><g partID='35330'><line stroke-linecap='round' stroke='#404040' x1='62.2632' y1='216.945' x2='11.4113' y2='216.945' stroke-width='0.699998' /></g><circle fill="black" cx="62.2632" cy="216.945" r="1.44" stroke-width="0" stroke="none" /><g partID='26820'><line stroke-linecap='round' stroke='#404040' x1='18.6759' y1='87.3177' x2='18.5763' y2='108.949' stroke-width='0.699998' /></g><g partID='26880'><line stroke-linecap='round' stroke='#404040' x1='18.6759' y1='36.9199' x2='18.6759' y2='87.3177' stroke-width='0.699998' /></g><g partID='26690'><line stroke-linecap='round' stroke='#404040' x1='133.812' y1='36.5651' x2='18.6759' y2='36.9199' stroke-width='0.699998' /></g><g partID='26940'><line stroke-linecap='round' stroke='#404040' x1='133.812' y1='36.5651' x2='133.776' y2='51.3489' stroke-width='0.699998' /></g><g partID='42190'><line stroke-linecap='round' stroke='#404040' x1='227.078' y1='29.8823' x2='220.176' y2='29.7489' stroke-width='0.699998' /></g><circle fill="black" cx="227.078" cy="29.8823" r="1.44" stroke-width="0" stroke="none" /><g partID='28760'><line stroke-linecap='round' stroke='#404040' x1='241.776' y1='29.7489' x2='227.078' y2='29.8823' stroke-width='0.699998' /></g><g partID='29700'><line stroke-linecap='round' stroke='#404040' x1='241.776' y1='15.3489' x2='220.176' y2='15.3489' stroke-width='0.699998' /></g><circle fill="black" cx="220.176" cy="15.3489" r="1.44" stroke-width="0" stroke="none" /><g partID='30200'><line stroke-linecap='round' stroke='#404040' x1='133.776' y1='216.949' x2='241.153' y2='216.264' stroke-width='0.699998' /></g><g partID='30620'><line stroke-linecap='round' stroke='#404040' x1='241.153' y1='216.264' x2='241.776' y2='188.149' stroke-width='0.699998' /></g><circle fill="black" cx="241.153" cy="216.264" r="1.44" stroke-width="0" stroke="none" /><g partID='30760'><line stroke-linecap='round' stroke='#404040' x1='234.683' y1='180.995' x2='248.976' y2='180.949' stroke-width='0.699998' /></g><g partID='30900'><line stroke-linecap='round' stroke='#404040' x1='234.683' y1='217.021' x2='234.683' y2='180.995' stroke-width='0.699998' /></g><g partID='30450'><line stroke-linecap='round' stroke='#404040' x1='133.776' y1='216.949' x2='234.683' y2='217.021' stroke-width='0.699998' /></g><circle fill="black" cx="133.776" cy="216.949" r="1.44" stroke-width="0" stroke="none" /><g partID='31040'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='173.749' x2='248.976' y2='173.749' stroke-width='0.699998' /></g><g partID='31110'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='173.749' x2='205.776' y2='173.749' stroke-width='0.699998' /></g><g partID='31180'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='166.549' x2='248.976' y2='166.549' stroke-width='0.699998' /></g><g partID='31250'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='166.549' x2='205.776' y2='166.549' stroke-width='0.699998' /></g><g partID='31320'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='159.349' x2='205.776' y2='159.349' stroke-width='0.699998' /></g><g partID='31390'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='159.349' x2='248.976' y2='159.35' stroke-width='0.699998' /></g><g partID='31520'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='152.149' x2='241.776' y2='152.149' stroke-width='0.699998' /></g><g partID='31630'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='144.949' x2='248.976' y2='144.949' stroke-width='0.699998' /></g><g partID='31700'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='137.749' x2='248.976' y2='137.749' stroke-width='0.699998' /></g><g partID='31770'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='130.549' x2='248.976' y2='130.549' stroke-width='0.699998' /></g><g partID='31840'><line stroke-linecap='round' stroke='#404040' x1='234.576' y1='123.349' x2='241.776' y2='123.349' stroke-width='0.699998' /></g><g partID='31910'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='123.349' x2='205.776' y2='123.349' stroke-width='0.699998' /></g><g partID='31980'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='130.549' x2='205.776' y2='130.549' stroke-width='0.699998' /></g><g partID='32050'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='137.749' x2='205.776' y2='137.749' stroke-width='0.699998' /></g><g partID='32120'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='144.949' x2='205.776' y2='144.949' stroke-width='0.699998' /></g><g partID='32190'><line stroke-linecap='round' stroke='#404040' x1='184.176' y1='152.149' x2='205.776' y2='152.149' stroke-width='0.699998' /></g><g partID='33340'><line stroke-linecap='round' stroke='#404040' x1='241.776' y1='58.5489' x2='220.176' y2='58.5489' stroke-width='0.699998' /></g><circle fill="black" cx="241.776" cy="58.5489" r="1.44" stroke-width="0" stroke="none" /><g partID='33630'><line stroke-linecap='round' stroke='#404040' x1='241.776' y1='44.1489' x2='234.569' y2='44.1844' stroke-width='0.699998' /></g><g partID='42050'><line stroke-linecap='round' stroke='#404040' x1='234.569' y1='44.1844' x2='220.176' y2='44.1489' stroke-width='0.699998' /></g><circle fill="black" cx="234.569" cy="44.1844" r="1.44" stroke-width="0" stroke="none" /><g partID='34680'><line stroke-linecap='round' stroke='#404040' x1='61.7759' y1='144.949' x2='61.776' y2='116.149' stroke-width='0.699998' /></g><circle fill="black" cx="61.776" cy="116.149" r="1.44" stroke-width="0" stroke="none" /><g partID='34750'><line stroke-linecap='round' stroke='#404040' x1='68.9759' y1='144.949' x2='69.0738' y2='108.884' stroke-width='0.699998' /></g><g partID='35030'><line stroke-linecap='round' stroke='#404040' x1='69.0738' y1='108.884' x2='61.776' y2='108.949' stroke-width='0.699998' /></g><circle fill="black" cx="69.0738" cy="108.884" r="1.44" stroke-width="0" stroke="none" /><g partID='35090'><line stroke-linecap='round' stroke='#404040' x1='69.0738' y1='108.884' x2='76.1759' y2='108.949' stroke-width='0.699998' /></g><g partID='35200'><line stroke-linecap='round' stroke='#404040' x1='61.776' y1='116.149' x2='76.1759' y2='116.149' stroke-width='0.699998' /></g><circle fill="black" cx="61.776" cy="116.149" r="1.44" stroke-width="0" stroke="none" /><g partID='35470'><line stroke-linecap='round' stroke='#404040' x1='62.2632' y1='216.945' x2='61.7759' y2='173.749' stroke-width='0.699998' /></g><g partID='35860'><line stroke-linecap='round' stroke='#404040' x1='69.0738' y1='216.945' x2='68.9759' y2='173.749' stroke-width='0.699998' /></g><g partID='36180'><line stroke-linecap='round' stroke='#404040' x1='32.978' y1='51.449' x2='119.376' y2='51.3489' stroke-width='0.699998' /></g><circle fill="black" cx="119.376" cy="51.3489" r="1.44" stroke-width="0" stroke="none" /><g partID='36110'><line stroke-linecap='round' stroke='#404040' x1='32.9759' y1='108.949' x2='32.978' y2='51.449' stroke-width='0.699998' /></g><g partID='36240'><line stroke-linecap='round' stroke='#404040' x1='119.376' y1='51.3489' x2='32.978' y2='51.449' stroke-width='0.699998' /></g><circle fill="black" cx="119.376" cy="51.3489" r="1.44" stroke-width="0" stroke="none" /><g partID='36350'><line stroke-linecap='round' stroke='#404040' x1='32.978' y1='51.449' x2='32.9759' y2='116.149' stroke-width='0.699998' /></g><g partID='37500'><line stroke-linecap='round' stroke='#404040' x1='335.365' y1='216.945' x2='335.365' y2='65.7511' stroke-width='0.699998' /></g><g partID='37240'><line stroke-linecap='round' stroke='#404040' x1='335.365' y1='65.7511' x2='184.172' y2='65.7511' stroke-width='0.699998' /></g><g partID='36980'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='65.7511' x2='184.172' y2='58.4865' stroke-width='0.699998' /></g><circle fill="black" cx="184.172" cy="58.4865" r="1.44" stroke-width="0" stroke="none" /><g partID='36720'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='58.4865' x2='191.376' y2='58.5489' stroke-width='0.699998' /></g><g partID='36450'><line stroke-linecap='round' stroke='#404040' x1='241.153' y1='216.264' x2='335.365' y2='216.945' stroke-width='0.699998' /></g><g partID='38070'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='44.1844' x2='191.376' y2='44.1489' stroke-width='0.699998' /></g><circle fill="black" cx="184.172" cy="44.1844" r="1.44" stroke-width="0" stroke="none" /><g partID='37760'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='58.4865' x2='184.172' y2='44.1844' stroke-width='0.699998' /></g><g partID='38720'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='29.6553' x2='191.376' y2='29.7489' stroke-width='0.699998' /></g><circle fill="black" cx="184.172" cy="29.6553" r="1.44" stroke-width="0" stroke="none" /><g partID='38370'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='44.1844' x2='184.172' y2='29.6553' stroke-width='0.699998' /></g><g partID='39060'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='29.6553' x2='184.172' y2='15.5802' stroke-width='0.699998' /></g><g partID='39410'><line stroke-linecap='round' stroke='#404040' x1='184.172' y1='15.5802' x2='191.376' y2='15.3489' stroke-width='0.699998' /></g><g partID='40040'><line stroke-linecap='round' stroke='#404040' x1='277.703' y1='1.0511' x2='277.703' y2='15.3532' stroke-width='0.699998' /></g><g partID='39750'><line stroke-linecap='round' stroke='#404040' x1='119.376' y1='51.3489' x2='119.472' y2='1.0511' stroke-width='0.699998' /></g><circle fill="black" cx="119.376" cy="51.3489" r="1.44" stroke-width="0" stroke="none" /><g partID='39900'><line stroke-linecap='round' stroke='#404040' x1='119.472' y1='1.0511' x2='277.703' y2='1.0511' stroke-width='0.699998' /></g><g partID='40180'><line stroke-linecap='round' stroke='#404040' x1='277.703' y1='15.3532' x2='270.576' y2='15.3489' stroke-width='0.699998' /></g><circle fill="black" cx="277.703" cy="15.3532" r="1.44" stroke-width="0" stroke="none" /><g partID='40320'><line stroke-linecap='round' stroke='#404040' x1='277.703' y1='15.3532' x2='277.801' y2='29.6553' stroke-width='0.699998' /></g><g partID='40510'><line stroke-linecap='round' stroke='#404040' x1='277.801' y1='29.6553' x2='270.576' y2='29.7489' stroke-width='0.699998' /></g><circle fill="black" cx="277.801" cy="29.6553" r="1.44" stroke-width="0" stroke="none" /><g partID='40690'><line stroke-linecap='round' stroke='#404040' x1='277.801' y1='29.6553' x2='277.801' y2='44.1844' stroke-width='0.699998' /></g><g partID='40920'><line stroke-linecap='round' stroke='#404040' x1='277.801' y1='44.1844' x2='270.576' y2='44.1489' stroke-width='0.699998' /></g><circle fill="black" cx="277.801" cy="44.1844" r="1.44" stroke-width="0" stroke="none" /><g partID='41370'><line stroke-linecap='round' stroke='#404040' x1='278.028' y1='58.7135' x2='270.576' y2='58.5489' stroke-width='0.699998' /></g><g partID='41140'><line stroke-linecap='round' stroke='#404040' x1='277.801' y1='44.1844' x2='278.028' y2='58.7135' stroke-width='0.699998' /></g><g partID='41700'><line stroke-linecap='round' stroke='#404040' x1='241.834' y1='108.884' x2='184.176' y2='108.949' stroke-width='0.699998' /></g><g partID='41590'><line stroke-linecap='round' stroke='#404040' x1='241.776' y1='58.5489' x2='241.834' y2='108.884' stroke-width='0.699998' /></g><circle fill="black" cx="241.776" cy="58.5489" r="1.44" stroke-width="0" stroke="none" /><g partID='41910'><line stroke-linecap='round' stroke='#404040' x1='234.569' y1='101.847' x2='184.176' y2='101.749' stroke-width='0.699998' /></g><g partID='41800'><line stroke-linecap='round' stroke='#404040' x1='234.569' y1='44.1844' x2='234.569' y2='101.847' stroke-width='0.699998' /></g><g partID='42360'><line stroke-linecap='round' stroke='#404040' x1='227.305' y1='94.5823' x2='184.176' y2='94.5489' stroke-width='0.699998' /></g><g partID='42250'><line stroke-linecap='round' stroke='#404040' x1='227.078' y1='29.8823' x2='227.305' y2='94.5823' stroke-width='0.699998' /></g><g partID='42460'><line stroke-linecap='round' stroke='#404040' x1='220.176' y1='15.3489' x2='220.267' y2='87.3177' stroke-width='0.699998' /></g><circle fill="black" cx="220.176" cy="15.3489" r="1.44" stroke-width="0" stroke="none" /><g partID='42570'><line stroke-linecap='round' stroke='#404040' x1='220.267' y1='87.3177' x2='184.176' y2='87.3489' stroke-width='0.699998' /></g><g partID='23420' id='partLabel'><g transform='translate(248.467,20.4172)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>yellow</text></g></g></g><g partID='29620' id='partLabel'><g transform='translate(37.0954,118.999)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>submit</text></g></g></g><g partID='29640' id='partLabel'><g transform='translate(41.3422,99.9978)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>blue</text></g></g></g><g partID='23450' id='partLabel'><g transform='translate(248.011,34.5888)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>orange</text></g></g></g><g partID='29400' id='partLabel'><g transform='translate(250.827,49.4456)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>red</text></g></g></g><g partID='29630' id='partLabel'><g transform='translate(249.153,6.09332)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>green</text></g></g></g><g partID='26430' id='partLabel'><g transform='translate(28.352,145.105)' ><g transform='matrix(0,1,-1,0,0,0)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>4x AA</text></g></g></g></g><g partID='29410' id='partLabel'><g transform='translate(189.532,49.5273)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g><g partID='28740' id='partLabel'><g transform='translate(189.558,35.2799)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g><g partID='28720' id='partLabel'><g transform='translate(188.297,19.6443)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g><g partID='29670' id='partLabel'><g transform='translate(66.9866,166.615)' ><g transform='matrix(0,1,-1,0,0,0)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g></g><g partID='29650' id='partLabel'><g transform='translate(74.3615,166.968)' ><g transform='matrix(0,1,-1,0,0,0)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g></g><g partID='29660' id='partLabel'><g transform='translate(188.751,6.90791)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>10k&#x3a9;</text></g></g></g><g partID='42710' id='partLabel'><g transform='translate(232.201,139.247)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='42810' id='partLabel'><g transform='translate(232.429,116.739)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='42910' id='partLabel'><g transform='translate(232.429,124.847)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='43010' id='partLabel'><g transform='translate(232.883,153.874)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='43110' id='partLabel'><g transform='translate(232.429,146.674)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='43210' id='partLabel'><g transform='translate(232.883,160.847)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='43310' id='partLabel'><g transform='translate(232.883,168.501)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g><g partID='43410' id='partLabel'><g transform='translate(232.201,132.501)' ><g font-size='5' font-style='normal' font-weight='normal' fill='#000000' font-family="'DroidSans'" id='schematicLabel' fill-opacity='1' stroke='none' ><text x='0' y='3.75'>220&#x3a9;</text></g></g></g></svg>
diff --git a/website/static/media/rampantmonkey.ascii.txt b/website/static/media/rampantmonkey.ascii.txt
new file mode 100644
index 0000000..5b1fb29
--- /dev/null
+++ b/website/static/media/rampantmonkey.ascii.txt
@@ -0,0 +1,51 @@
+ ,,,
+ ,:::::::::::::,
+ ::::::::::::::::::::,
+ ,~~+?IIII?+~~ ,,::::::::::::::::::::::::, :=+?+?++==:
+ =IIIIIIIIIIIII?, ,,::::::::::::::::::::::::::::::, ++IIIIIIIIIII?,
+ +IIIIIIIIIIIIIIII,:::::::::::::::::::::::::::::::::,+IIIIIIIIIIIIIII~~
+ :~IIIIIIIIIIIIIIII+:::::::::::::::::::::::::::::::::::+IIIIIIIIIIIIIIIII,
+ +IIIIIIIIIIIIIIIII::::::::::::::::::::::::::::::::~:::::::IIIIIIIIIIIIIIII=
+ ,IIIIIIIIIIIIIIII=~:::==?IIII+~:::::~===~::::::++IIIII?=:::~IIIIIIIIIIIIIIII
+ =IIIIIIIIIIIIIII?:::~?IIIIIIIII+==?IIIIIII?I=~?IIIIIIIII?~::?IIIIIIIIIIIIIII~
+ ?IIIIIIIIIIIIIII::::IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII??::IIIIIIIIIIIIIII+
+,IIIIIIIIIIIIIII~:++IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~~IIIIIIIIIIIIIII,,
+,IIIIIIIIIIIIII+:~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII:++IIIIIIIIIIIII,,
+,IIIIIIIIIIIIII~:=IIIIIIII+ ,,~+?IIIIIIIIIIIII?+~~, +IIIIIIIII~~~IIIIIIIIIIIII,,
+,IIIIIIIIIIII??::?IIIIIII+ :IIIIIII:: ++IIIIIII=::IIIIIIIIIIIII,,
+ ~IIIIIIIIIII~~:=IIIIIIIIIIIII ~ =IIIIIII=~ ~ IIIIIIIIIIIII::~IIIIIIIIIII=
+ IIIIIIIIIII:::+IIIIIIIIIII?? 7~~+IIIIIII++~ ?IIIIIIIIIIII~~:IIIIIIIIIII,
+ :IIIIIIIII?:::+IIIIIIIIIII== ,7==~IIIIIII~== , =IIIIIIIIIIII~~:?IIIIIIIII=
+ ::IIIIIII+:::+IIIIIIIIIII~~ 7~~:IIIIIII::~7 ~IIIIIIIIIIII~~:+IIIIIIII~
+ , ::::+IIIIIIIIIII++ +IIIIIII=+ +IIIIIIIIIIII~~:::==~
+ ::::+IIIIIIIIIIIII ?IIIIIII?I IIIIIIIIIIIII~~::
+ ::::+IIIIIIIIIIIII: ,,IIIIIIIIII, ::IIIIIIIIIIIII::::
+ ::::~IIIIIIIIIIIIII::??IIIIIIIIII?::IIIIIIIIIIIIII?::::
+ :::::+IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~::::
+ :::::=IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII:::::
+ ::::::IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?:::::
+ ::::::++IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~:::::
+ ::::::::=IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?I:::::::
+ ,::::::::?IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~~::::::,
+ ,:::::==?IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII??=:::::,
+ :::~?IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?~:::
+ ++IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
+ ~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+==IIIIIIIIIII~
+ :IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?==: IIIIIIIIIIII~
+ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?=~: :=: ?IIIIIIIIIIII
+ IIIIIIIIIIIIIIIIIIIIII?==: :,~?7 777I =IIIIIIIIIIIIII
+ , IIIIIIIIIIIIIIIII?==: ?777777777777777 ~IIIIIIIIIIIIII,
+ ::IIIIIIIIIIIII??:, ~7I77777777== ,: :IIIIIIIIIIIIII:
+ ~:IIIIIIIIIIIIIII?+=~~:,, ,=77777777+ ,IIIIIIIIIIIIII~
+ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~ ,+ 7777I,, IIIIIIIIIIIIII
+ +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII~~ ,?+77777 ?IIIIIIIIIII++
+ ,IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?~ ,?7 7 +IIIIIIIIIII,,
+ +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?:: :?+,=IIIIIIIIII?
+ ,IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?:: ~IIIIIIIII,
+ ,,?IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?IIIIIII??,
+ +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII=
+ ,~~=IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII++~,
+ :+=IIIIIIIIIIIIIIIIIIIIIIIIIIIIII+:
+ :=??IIIIIIIIIIIIIIIIIIII?=:
+ ,:~~==+++++===~:,
+
diff --git a/website/static/media/reading_list.png b/website/static/media/reading_list.png
new file mode 100644
index 0000000..44bb3bb
--- /dev/null
+++ b/website/static/media/reading_list.png
Binary files differ
diff --git a/website/static/media/reading_list.svg b/website/static/media/reading_list.svg
new file mode 100644
index 0000000..803b62b
--- /dev/null
+++ b/website/static/media/reading_list.svg
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.34.0 (20131023.2356)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="892pt" height="310pt"
+ viewBox="0.00 0.00 892.00 310.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 306)">
+<title>G</title>
+<polygon fill="white" stroke="white" points="-4,4 -4,-306 888,-306 888,4 -4,4"/>
+<!-- learn_you_some_erlang -->
+<g id="node1" class="node"><title>learn_you_some_erlang</title>
+<polygon fill="none" stroke="black" points="154.052,-68 3.94758,-68 3.94758,-32 154.052,-32 154.052,-68"/>
+<text text-anchor="middle" x="79" y="-44.4" font-family="Times,serif" font-size="14.00">Learn You Some Erlang</text>
+</g>
+<!-- programming_erlang -->
+<g id="node2" class="node"><title>programming_erlang</title>
+<polygon fill="none" stroke="black" points="371.811,-97 238.189,-97 238.189,-61 371.811,-61 371.811,-97"/>
+<text text-anchor="middle" x="305" y="-73.4" font-family="Times,serif" font-size="14.00">Programming Erlang</text>
+</g>
+<!-- learn_you_some_erlang&#45;&gt;programming_erlang -->
+<g id="edge1" class="edge"><title>learn_you_some_erlang&#45;&gt;programming_erlang</title>
+<path fill="none" stroke="black" d="M154.278,-59.6163C177.901,-62.6747 204.061,-66.0614 227.817,-69.137"/>
+<polygon fill="black" stroke="black" points="227.47,-72.6212 237.836,-70.4342 228.369,-65.6791 227.47,-72.6212"/>
+</g>
+<!-- building_web_applications -->
+<g id="node3" class="node"><title>building_web_applications</title>
+<polygon fill="none" stroke="black" points="388.854,-41.6019 221.146,-41.6019 221.146,-0.398095 388.854,-0.398095 388.854,-41.6019"/>
+<text text-anchor="middle" x="305" y="-23.8" font-family="Times,serif" font-size="14.00">Building Web Applications</text>
+<text text-anchor="middle" x="305" y="-7" font-family="Times,serif" font-size="14.00">with Erlang</text>
+</g>
+<!-- learn_you_some_erlang&#45;&gt;building_web_applications -->
+<g id="edge4" class="edge"><title>learn_you_some_erlang&#45;&gt;building_web_applications</title>
+<path fill="none" stroke="black" d="M154.278,-40.3837C172.413,-38.0358 192.043,-35.4944 210.933,-33.0488"/>
+<polygon fill="black" stroke="black" points="211.565,-36.4963 221.033,-31.7412 210.667,-29.5542 211.565,-36.4963"/>
+</g>
+<!-- distributed_algorithms -->
+<g id="node6" class="node"><title>distributed_algorithms</title>
+<polygon fill="none" stroke="black" points="631.508,-97 486.492,-97 486.492,-61 631.508,-61 631.508,-97"/>
+<text text-anchor="middle" x="559" y="-73.4" font-family="Times,serif" font-size="14.00">Distributed Algorithms</text>
+</g>
+<!-- programming_erlang&#45;&gt;distributed_algorithms -->
+<g id="edge5" class="edge"><title>programming_erlang&#45;&gt;distributed_algorithms</title>
+<path fill="none" stroke="black" d="M371.881,-79C403.731,-79 442.276,-79 476.008,-79"/>
+<polygon fill="black" stroke="black" points="476.309,-82.5001 486.309,-79 476.309,-75.5001 476.309,-82.5001"/>
+</g>
+<!-- seven_databases -->
+<g id="node4" class="node"><title>seven_databases</title>
+<polygon fill="none" stroke="black" points="614.467,-40.6019 503.533,-40.6019 503.533,0.601905 614.467,0.601905 614.467,-40.6019"/>
+<text text-anchor="middle" x="559" y="-22.8" font-family="Times,serif" font-size="14.00">Seven Databases</text>
+<text text-anchor="middle" x="559" y="-6" font-family="Times,serif" font-size="14.00">in Seven Weeks</text>
+</g>
+<!-- building_web_applications&#45;&gt;seven_databases -->
+<g id="edge2" class="edge"><title>building_web_applications&#45;&gt;seven_databases</title>
+<path fill="none" stroke="black" d="M388.863,-20.6712C422.907,-20.5361 461.729,-20.382 493.586,-20.2556"/>
+<polygon fill="black" stroke="black" points="493.683,-23.7554 503.669,-20.2156 493.656,-16.7554 493.683,-23.7554"/>
+</g>
+<!-- seven_concurrency -->
+<g id="node10" class="node"><title>seven_concurrency</title>
+<polygon fill="none" stroke="black" points="878.518,-40.6019 707.482,-40.6019 707.482,0.601905 878.518,0.601905 878.518,-40.6019"/>
+<text text-anchor="middle" x="793" y="-22.8" font-family="Times,serif" font-size="14.00">Seven Concurrency Models</text>
+<text text-anchor="middle" x="793" y="-6" font-family="Times,serif" font-size="14.00">in Seven Weeks</text>
+</g>
+<!-- seven_databases&#45;&gt;seven_concurrency -->
+<g id="edge3" class="edge"><title>seven_databases&#45;&gt;seven_concurrency</title>
+<path fill="none" stroke="black" d="M614.394,-20C638.966,-20 668.733,-20 696.818,-20"/>
+<polygon fill="black" stroke="black" points="697.076,-23.5001 707.076,-20 697.076,-16.5001 697.076,-23.5001"/>
+</g>
+<!-- practical_vim -->
+<g id="node5" class="node"><title>practical_vim</title>
+<polygon fill="none" stroke="black" points="839.283,-162 746.717,-162 746.717,-126 839.283,-126 839.283,-162"/>
+<text text-anchor="middle" x="793" y="-138.4" font-family="Times,serif" font-size="14.00">Practical Vim</text>
+</g>
+<!-- dist_alg_mp -->
+<g id="node7" class="node"><title>dist_alg_mp</title>
+<polygon fill="none" stroke="black" points="883.773,-100.602 702.227,-100.602 702.227,-59.3981 883.773,-59.3981 883.773,-100.602"/>
+<text text-anchor="middle" x="793" y="-82.8" font-family="Times,serif" font-size="14.00">Distributed Algorithms</text>
+<text text-anchor="middle" x="793" y="-66" font-family="Times,serif" font-size="14.00">for Message Passing Systems</text>
+</g>
+<!-- distributed_algorithms&#45;&gt;dist_alg_mp -->
+<g id="edge6" class="edge"><title>distributed_algorithms&#45;&gt;dist_alg_mp</title>
+<path fill="none" stroke="black" d="M631.817,-79.3096C650.829,-79.3915 671.703,-79.4815 691.919,-79.5686"/>
+<polygon fill="black" stroke="black" points="692.082,-83.0693 702.097,-79.6125 692.112,-76.0693 692.082,-83.0693"/>
+</g>
+<!-- uml_distilled -->
+<g id="node8" class="node"><title>uml_distilled</title>
+<polygon fill="none" stroke="black" points="128.319,-302 29.6811,-302 29.6811,-266 128.319,-266 128.319,-302"/>
+<text text-anchor="middle" x="79" y="-278.4" font-family="Times,serif" font-size="14.00">UML Distilled</text>
+</g>
+<!-- gof -->
+<g id="node9" class="node"><title>gof</title>
+<polygon fill="none" stroke="black" points="401.025,-302 208.975,-302 208.975,-266 401.025,-266 401.025,-302"/>
+<text text-anchor="middle" x="305" y="-278.4" font-family="Times,serif" font-size="14.00">Design Patterns (Gang of Four)</text>
+</g>
+<!-- uml_distilled&#45;&gt;gof -->
+<g id="edge7" class="edge"><title>uml_distilled&#45;&gt;gof</title>
+<path fill="none" stroke="black" d="M128.329,-284C149.015,-284 174.04,-284 198.637,-284"/>
+<polygon fill="black" stroke="black" points="198.767,-287.5 208.767,-284 198.767,-280.5 198.767,-287.5"/>
+</g>
+<!-- growing_oo -->
+<g id="node16" class="node"><title>growing_oo</title>
+<polygon fill="none" stroke="black" points="666.27,-286 451.73,-286 451.73,-250 666.27,-250 666.27,-286"/>
+<text text-anchor="middle" x="559" y="-262.4" font-family="Times,serif" font-size="14.00">Growing Object&#45;Oriented Software</text>
+</g>
+<!-- gof&#45;&gt;growing_oo -->
+<g id="edge8" class="edge"><title>gof&#45;&gt;growing_oo</title>
+<path fill="none" stroke="black" d="M401.27,-277.951C414.376,-277.119 427.955,-276.257 441.39,-275.404"/>
+<polygon fill="black" stroke="black" points="441.868,-278.881 451.626,-274.754 441.424,-271.895 441.868,-278.881"/>
+</g>
+<!-- ruby_under_a_microscope -->
+<g id="node11" class="node"><title>ruby_under_a_microscope</title>
+<polygon fill="none" stroke="black" points="641.128,-232 476.872,-232 476.872,-196 641.128,-196 641.128,-232"/>
+<text text-anchor="middle" x="559" y="-208.4" font-family="Times,serif" font-size="14.00">Ruby Under a Microscope</text>
+</g>
+<!-- objects_on_rails -->
+<g id="node12" class="node"><title>objects_on_rails</title>
+<polygon fill="none" stroke="black" points="847.046,-259 738.954,-259 738.954,-223 847.046,-223 847.046,-259"/>
+<text text-anchor="middle" x="793" y="-235.4" font-family="Times,serif" font-size="14.00">Objects on Rails</text>
+</g>
+<!-- ruby_under_a_microscope&#45;&gt;objects_on_rails -->
+<g id="edge11" class="edge"><title>ruby_under_a_microscope&#45;&gt;objects_on_rails</title>
+<path fill="none" stroke="black" d="M641.142,-223.443C669.877,-226.787 701.758,-230.498 728.781,-233.643"/>
+<polygon fill="black" stroke="black" points="728.546,-237.139 738.884,-234.818 729.355,-230.186 728.546,-237.139"/>
+</g>
+<!-- workplace_survival -->
+<g id="node13" class="node"><title>workplace_survival</title>
+<polygon fill="none" stroke="black" points="157.511,-164.602 0.4885,-164.602 0.4885,-123.398 157.511,-123.398 157.511,-164.602"/>
+<text text-anchor="middle" x="79" y="-146.8" font-family="Times,serif" font-size="14.00">Asperger&#39;s syndrome</text>
+<text text-anchor="middle" x="79" y="-130" font-family="Times,serif" font-size="14.00">workplace survival guide</text>
+</g>
+<!-- getting_a_job -->
+<g id="node14" class="node"><title>getting_a_job</title>
+<polygon fill="none" stroke="black" points="416.015,-173.401 193.985,-173.401 193.985,-114.599 416.015,-114.599 416.015,-173.401"/>
+<text text-anchor="middle" x="305" y="-155.2" font-family="Times,serif" font-size="14.00">The complete guide</text>
+<text text-anchor="middle" x="305" y="-138.4" font-family="Times,serif" font-size="14.00">to getting a job</text>
+<text text-anchor="middle" x="305" y="-121.6" font-family="Times,serif" font-size="14.00">for people with Asperger&#39;s syndrome</text>
+</g>
+<!-- workplace_survival&#45;&gt;getting_a_job -->
+<g id="edge12" class="edge"><title>workplace_survival&#45;&gt;getting_a_job</title>
+<path fill="none" stroke="black" d="M157.716,-144C166.071,-144 174.709,-144 183.416,-144"/>
+<polygon fill="black" stroke="black" points="183.656,-147.5 193.656,-144 183.656,-140.5 183.656,-147.5"/>
+</g>
+<!-- on_writing_well -->
+<g id="node15" class="node"><title>on_writing_well</title>
+<polygon fill="none" stroke="black" points="613.203,-162 504.797,-162 504.797,-126 613.203,-126 613.203,-162"/>
+<text text-anchor="middle" x="559" y="-138.4" font-family="Times,serif" font-size="14.00">On Writing Well</text>
+</g>
+<!-- getting_a_job&#45;&gt;on_writing_well -->
+<g id="edge13" class="edge"><title>getting_a_job&#45;&gt;on_writing_well</title>
+<path fill="none" stroke="black" d="M416.164,-144C442.93,-144 470.664,-144 494.431,-144"/>
+<polygon fill="black" stroke="black" points="494.707,-147.5 504.707,-144 494.706,-140.5 494.707,-147.5"/>
+</g>
+<!-- on_writing_well&#45;&gt;practical_vim -->
+<g id="edge14" class="edge"><title>on_writing_well&#45;&gt;practical_vim</title>
+<path fill="none" stroke="black" d="M613.225,-144C650.154,-144 699.23,-144 736.62,-144"/>
+<polygon fill="black" stroke="black" points="736.836,-147.5 746.836,-144 736.836,-140.5 736.836,-147.5"/>
+</g>
+<!-- growing_oo&#45;&gt;objects_on_rails -->
+<g id="edge10" class="edge"><title>growing_oo&#45;&gt;objects_on_rails</title>
+<path fill="none" stroke="black" d="M666.155,-255.646C687.495,-253.162 709.282,-250.627 728.601,-248.378"/>
+<polygon fill="black" stroke="black" points="729.232,-251.829 738.76,-247.196 728.423,-244.876 729.232,-251.829"/>
+</g>
+<!-- cucumber -->
+<g id="node17" class="node"><title>cucumber</title>
+<polygon fill="none" stroke="black" points="371.922,-248 238.078,-248 238.078,-212 371.922,-212 371.922,-248"/>
+<text text-anchor="middle" x="305" y="-224.4" font-family="Times,serif" font-size="14.00">The Cucumber Book</text>
+</g>
+<!-- cucumber&#45;&gt;growing_oo -->
+<g id="edge9" class="edge"><title>cucumber&#45;&gt;growing_oo</title>
+<path fill="none" stroke="black" d="M371.881,-239.934C393.19,-243.148 417.496,-246.813 441.353,-250.41"/>
+<polygon fill="black" stroke="black" points="441.129,-253.916 451.54,-251.946 442.173,-246.994 441.129,-253.916"/>
+</g>
+</g>
+</svg>
diff --git a/website/static/media/register_finger.png b/website/static/media/register_finger.png
new file mode 100644
index 0000000..1daabef
--- /dev/null
+++ b/website/static/media/register_finger.png
Binary files differ
diff --git a/website/static/media/rmLogo.svg b/website/static/media/rmLogo.svg
new file mode 100644
index 0000000..07dbe54
--- /dev/null
+++ b/website/static/media/rmLogo.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="720" height="720" viewBox="0 0 720 720">
+
+<g>
+<ellipse cx="175" cy="95" rx="100" ry="125" fill="#ffdab9" transform="rotate(27)" />
+<ellipse cx="465" cy="425" rx="100" ry="125" fill="#ffdab9" transform="rotate(-27)" />
+</g>
+
+<ellipse cx="360" cy="345" rx="250" ry="330" fill="#733e1a" />
+
+<g>
+ <ellipse cx="360" cy="543" rx="275" ry="163" fill="#ffdab9" />
+ <ellipse cx="220" cy="325" rx="113" ry="169" transform="rotate(-8)" fill="#ffdab9" />
+ <ellipse cx="500" cy="222" rx="113" ry="169" transform="rotate(8)" fill="#ffdab9" />
+ <ellipse cx="360" cy="205" rx="100" ry="75" fill="#ffdab9" />
+</g>
+
+<g>
+ <ellipse cx="293" cy="265" rx="30" ry="60" fill="#000000" />
+ <ellipse cx="427" cy="265" rx="30" ry="60" fill="#000000" />
+ <ellipse cx="300" cy="254" rx="10" ry="26" fill="#ffffff" />
+ <ellipse cx="420" cy="254" rx="10" ry="26" fill="#ffffff" />
+</g>
+
+<g>
+ <polygon fill="#000000" points="322,232 247,211 223,220 250,191 327,207" />
+ <polygon fill="#000000" points="398,232 473,211 497,220 470,191 393,207" />
+</g>
+
+<g>
+ <polygon fill="#000000" points="219,536 486,468 495,471 513,625 501,632 351,555 227,542" />
+ <!--Circles are temporary to round out corners of mouth. When a better method is discovered this will be the first place to implement -->
+ <circle fill="#000000" cx="489" cy="474" r="6" />
+ <circle fill="#000000" cx="505" cy="625" r="8" />
+ <polygon fill="#ffffff" points="350,537 350,516 477,487 486,533 436,528 494,576 497,609 377,546" />
+ <circle fill="#ffffff" cx="350" cy="526.5" r="10.5" />
+</g>
+</svg> \ No newline at end of file
diff --git a/website/static/media/rmLogoSleep.svg b/website/static/media/rmLogoSleep.svg
new file mode 100644
index 0000000..d4927b7
--- /dev/null
+++ b/website/static/media/rmLogoSleep.svg
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="720"
+ height="720"
+ viewBox="0 0 720 720"
+ id="svg861"
+ sodipodi:docname="rmLogoSleep.svg"
+ inkscape:version="0.92.2 2405546, 2018-03-11">
+ <metadata
+ id="metadata867">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs865" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="3828"
+ inkscape:window-height="1070"
+ id="namedview863"
+ showgrid="false"
+ inkscape:snap-global="false"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="177.75704"
+ inkscape:cy="176.1413"
+ inkscape:window-x="1925"
+ inkscape:window-y="5"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg861" />
+ <g
+ id="g819">
+ <ellipse
+ cx="175"
+ cy="95"
+ rx="100"
+ ry="125"
+ fill="#ffdab9"
+ transform="rotate(27)"
+ id="ellipse815" />
+ <ellipse
+ cx="465"
+ cy="425"
+ rx="100"
+ ry="125"
+ fill="#ffdab9"
+ transform="rotate(-27)"
+ id="ellipse817" />
+ </g>
+ <ellipse
+ cx="360"
+ cy="345"
+ rx="250"
+ ry="330"
+ fill="#733e1a"
+ id="ellipse821" />
+ <g
+ id="g831">
+ <ellipse
+ cx="360"
+ cy="543"
+ rx="275"
+ ry="163"
+ id="ellipse823"
+ fill="#ffdab9" />
+ <ellipse
+ cx="220"
+ cy="325"
+ rx="113"
+ ry="169"
+ transform="rotate(-8)"
+ id="ellipse825"
+ fill="#ffdab9" />
+ <ellipse
+ cx="500"
+ cy="222"
+ rx="113"
+ ry="169"
+ transform="rotate(8)"
+ id="ellipse827"
+ fill="#ffdab9" />
+ <ellipse
+ cx="360"
+ cy="205"
+ rx="100"
+ ry="75"
+ id="ellipse829"
+ fill="#ffdab9" />
+ </g>
+ <g
+ id="g841"
+ transform="matrix(1,0,0,0.18185234,0,268.10842)">
+ <ellipse
+ cx="293"
+ cy="265"
+ rx="30"
+ ry="60"
+ id="ellipse833"
+ style="fill:#000000" />
+ <ellipse
+ cx="427"
+ cy="265"
+ rx="30"
+ ry="60"
+ id="ellipse835"
+ style="fill:#000000" />
+ <ellipse
+ style="fill:#000000"
+ cx="293.07455"
+ cy="267.70175"
+ rx="30"
+ ry="60"
+ id="ellipse833-3" />
+ </g>
+ <g
+ id="g847">
+ <polygon
+ fill="#000000"
+ points="322,232 247,211 223,220 250,191 327,207"
+ id="polygon843" />
+ <polygon
+ fill="#000000"
+ points="398,232 473,211 497,220 470,191 393,207"
+ id="polygon845" />
+ </g>
+ <g
+ id="g841-5"
+ transform="matrix(1,0,0,0.18185234,-0.089891,263.11403)">
+ <ellipse
+ cx="293.18387"
+ cy="265"
+ rx="32.022472"
+ ry="60"
+ id="ellipse833-6"
+ style="fill:#ffdab9;fill-opacity:1;stroke-width:1.03315806" />
+ <ellipse
+ cx="426.26456"
+ cy="265"
+ rx="31.103167"
+ ry="60"
+ id="ellipse835-2"
+ style="fill:#ffdab9;fill-opacity:1;stroke-width:1.01822007" />
+ </g>
+ <rect
+ style="opacity:0.98000004;fill:#000000;fill-opacity:0;stroke:none"
+ id="rect936"
+ width="548.27374"
+ height="13.605721"
+ x="86.046989"
+ y="539.44843" />
+ <ellipse
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none"
+ id="path944"
+ cx="370.26682"
+ cy="561.38849"
+ rx="128.44931"
+ ry="14.041018" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot946"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="rotate(17.1,441.21122,495.66477)"><flowRegion
+ id="flowRegion948"><rect
+ id="rect950"
+ width="58.244202"
+ height="54.603985"
+ x="503.9165"
+ y="495.34372" /></flowRegion><flowPara
+ id="flowPara952"
+ style="font-size:42.66666794px;fill:#000000;fill-opacity:0.53333297">Z</flowPara></flowRoot> <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:68px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.70000005px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="646.7132"
+ y="390.14642"
+ id="text956"
+ transform="rotate(4)"><tspan
+ sodipodi:role="line"
+ id="tspan954"
+ x="646.7132"
+ y="390.14642"
+ style="fill:#000000;fill-opacity:0.53333285;stroke-width:2.8900001px">Z</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:56.34034729px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.40850866px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="668.729"
+ y="367.12375"
+ id="text960"
+ transform="matrix(0.92784552,0.18430878,-0.16360419,1.045267,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan958"
+ x="668.729"
+ y="367.12375"
+ style="fill:#000000;fill-opacity:0.53333285;stroke-width:1.97191203px">Z</tspan></text>
+</svg>
diff --git a/website/static/media/rmLogoSmall.png b/website/static/media/rmLogoSmall.png
new file mode 100644
index 0000000..d3de84c
--- /dev/null
+++ b/website/static/media/rmLogoSmall.png
Binary files differ
diff --git a/website/static/media/ss-800-3-0-320x192.png b/website/static/media/ss-800-3-0-320x192.png
new file mode 100644
index 0000000..6293050
--- /dev/null
+++ b/website/static/media/ss-800-3-0-320x192.png
Binary files differ
diff --git a/website/static/media/ss-800-4-0-320x192.png b/website/static/media/ss-800-4-0-320x192.png
new file mode 100644
index 0000000..5bd6a16
--- /dev/null
+++ b/website/static/media/ss-800-4-0-320x192.png
Binary files differ
diff --git a/website/static/media/stack_exchange_logo.png b/website/static/media/stack_exchange_logo.png
new file mode 100644
index 0000000..261ca8c
--- /dev/null
+++ b/website/static/media/stack_exchange_logo.png
Binary files differ
diff --git a/website/static/media/starDecomposition.png b/website/static/media/starDecomposition.png
new file mode 100644
index 0000000..22d4e52
--- /dev/null
+++ b/website/static/media/starDecomposition.png
Binary files differ
diff --git a/website/static/media/targaryen_cards.jpg b/website/static/media/targaryen_cards.jpg
new file mode 100644
index 0000000..54a43a4
--- /dev/null
+++ b/website/static/media/targaryen_cards.jpg
Binary files differ
diff --git a/website/static/media/targaryen_cards_744x1052.jpg b/website/static/media/targaryen_cards_744x1052.jpg
new file mode 100644
index 0000000..18b64ef
--- /dev/null
+++ b/website/static/media/targaryen_cards_744x1052.jpg
Binary files differ
diff --git a/website/static/media/test2.jpg b/website/static/media/test2.jpg
new file mode 100644
index 0000000..5223313
--- /dev/null
+++ b/website/static/media/test2.jpg
Binary files differ
diff --git a/website/static/media/tully_cards.jpg b/website/static/media/tully_cards.jpg
new file mode 100644
index 0000000..5562a7c
--- /dev/null
+++ b/website/static/media/tully_cards.jpg
Binary files differ
diff --git a/website/static/media/tully_cards_744x1052.jpg b/website/static/media/tully_cards_744x1052.jpg
new file mode 100644
index 0000000..94830d9
--- /dev/null
+++ b/website/static/media/tully_cards_744x1052.jpg
Binary files differ
diff --git a/website/static/media/vimlogo.png b/website/static/media/vimlogo.png
new file mode 100644
index 0000000..8e7c02b
--- /dev/null
+++ b/website/static/media/vimlogo.png
Binary files differ
diff --git a/website/static/media/whiteboard.svg b/website/static/media/whiteboard.svg
new file mode 100644
index 0000000..8a673c4
--- /dev/null
+++ b/website/static/media/whiteboard.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="640"
+ height="480"
+ id="svg4013"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="whiteboard.svg">
+ <defs
+ id="defs4033" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1152"
+ id="namedview4031"
+ showgrid="false"
+ inkscape:zoom="1.9589326"
+ inkscape:cx="229.38292"
+ inkscape:cy="241.5428"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g4018" />
+ <title
+ id="title4015">white board background</title>
+ <metadata
+ id="metadata7">image/svg+xmlTableau blanc2010-04-22Louis-Martin Proulx<rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+</rdf:RDF>
+</metadata>
+ <g
+ id="g4018"
+ transform="matrix(1.1316378,0,0,1.2526842,-0.1316377,0)">
+ <path
+ d="m 22.1401,3.0415 0,355.2165 523.01291,0 L 548.52698,1 22.139999,3.0415 l 1.01e-4,0 z"
+ id="path2383"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:1" />
+ <path
+ d="m 34.950001,15.909 1.687199,320.51199 496.01881,2.04102 3.37402,-322.553009 -501.07993,0 -9.9e-5,0 z"
+ id="path2385"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:1" />
+ <path
+ d="m 457.79016,348.42645 19.2876,-3.18426 c 1.23489,6.06527 0.22143,12.13049 0,18.19577 l -18.84925,-3.18427 -0.43835,-11.82724 z"
+ id="path2401"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:0;stroke:#733e1a;stroke-width:1.91937232;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.5" />
+ <path
+ d="m 381.88648,343.47809 c -1.45246,8.01291 -1.09656,15.32812 0,20.92511 l 75.20107,0 c 2.11017,-6.4787 2.44208,-12.07575 0,-20.47022 l -75.20107,-0.45489 z"
+ id="path2399"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:0" />
+ <path
+ d="m 477.99304,358.43408 5.36133,0 -0.0892,-8.18808 -5.71143,0 0.4393,8.18808 z"
+ id="path2403"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:0" />
+ <title
+ id="title4025">Layer 1</title>
+ <g
+ id="svg_1">
+ <path
+ id="path2389"
+ d="m 266.77924,346.26965 0,14.54952 c 0.76822,1.42813 0.51333,2.7601 5.285,2.9699 l 74.90572,-2.52009 c 2.87909,-0.1329 8.89412,0.93679 9.01998,-1.70966 l 0.8534,-15.5394 -90.06413,2.24973 z"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#733e1a;stroke:#733e1a;stroke-width:2.1573801;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.5"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ id="path2393"
+ d="m 263.07971,322.93497 0,22.36972 96.71576,-1.31583 0,-21.05386 -96.71576,-3e-5 z"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2.15738010000000013;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:1" />
+ </g>
+ <path
+ d="m 2,357.258 561.32202,-0.124 -5.70105,22.57999 -549.006411,-2.04098 -6.61454,-20.41501 -2e-5,0 z"
+ id="path2387"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;stroke:#733e1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.50000000000000000;fill-opacity:1" />
+ </g>
+</svg>
diff --git a/website/static/media/writing.svg b/website/static/media/writing.svg
new file mode 100644
index 0000000..094fc56
--- /dev/null
+++ b/website/static/media/writing.svg
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="466"
+ height="500"
+ id="svg2"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="writing.svg">
+ <metadata
+ id="metadata3129">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1152"
+ id="namedview3127"
+ showgrid="false"
+ inkscape:zoom="1.8974469"
+ inkscape:cx="235.50036"
+ inkscape:cy="250.89755"
+ inkscape:window-x="7"
+ inkscape:window-y="1"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ id="stop3809"
+ style="stop-color:#733e1a;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3811"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3747">
+ <stop
+ id="stop3749"
+ style="stop-color:#733e1a;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3751"
+ style="stop-color:#fffff4;stop-opacity:0.1254902;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3753"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.2807761,-6.0681998)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3757"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.80778535,0.06799981,-0.06799981,0.80778535,92.948834,-30.386571)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3761"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-41.588467,13.114492)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3765"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99612902,-0.08790323,0.08790323,0.99612902,-76.601193,68.821847)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3769"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2078683,-0.14359658,0.14359658,1.2078683,-185.09348,83.210813)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3773"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1948042,-0.22805408,0.22805408,1.1948042,-219.89779,144.9503)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3777"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1844389,-0.27689399,0.27689399,1.1844389,-255.67758,197.39807)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3781"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99274978,-0.2265088,0.2265088,0.99274978,-215.13931,227.85096)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3785"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98043806,-0.27495376,0.27495376,0.98043806,-234.50997,273.33617)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3789"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98626771,-0.25324763,0.25324763,0.98626771,-254.73176,295.19008)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="407.871"
+ y2="137.12773"
+ id="linearGradient3793"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.97086507,-0.30704948,0.30704948,0.97086507,-271.69778,343.9017)" />
+ <linearGradient
+ x1="313.4856"
+ y1="120.13223"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3797"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.53272633,-0.04287208,0.04287208,0.53272633,208.68605,25.4367)" />
+ <linearGradient
+ x1="423.25778"
+ y1="46.229294"
+ x2="77.674019"
+ y2="318.94135"
+ id="linearGradient3813"
+ xlink:href="#linearGradient3807"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="312.32178"
+ y1="127.23269"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3881"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.19023703,-0.24662968,0.24662968,-0.19023703,347.45474,193.30445)" />
+ <linearGradient
+ x1="312.32178"
+ y1="127.23269"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3885"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.17547051,-0.20943528,0.20943528,-0.17547051,382.40354,164.70846)" />
+ <linearGradient
+ x1="312.32178"
+ y1="127.23269"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3889"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.17702623,-0.30190773,0.30190773,-0.17702623,301.35343,230.30446)" />
+ <linearGradient
+ x1="312.32178"
+ y1="127.23269"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3893"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.15754906,-0.26869057,0.26869057,-0.15754906,268.81314,240.0051)" />
+ <linearGradient
+ x1="324.37042"
+ y1="124.82491"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3897"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1147517,-0.28956584,0.28956584,-0.1147517,221.0918,267.76447)" />
+ <linearGradient
+ x1="312.32178"
+ y1="127.23269"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3924"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.09695032,-0.16534302,0.16534302,-0.09695032,166.92962,284.48216)" />
+ <linearGradient
+ x1="334.60385"
+ y1="121.27324"
+ x2="426.36499"
+ y2="145.49406"
+ id="linearGradient3931"
+ xlink:href="#linearGradient3747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.15754906,-0.26869057,0.26869057,-0.15754906,208.66745,296.32932)" />
+ </defs>
+ <path
+ d="m 251.305,394.23062 c -22.24214,3.07166 -35.76593,22.99219 -51.60014,36.68369 -16.61979,14.37077 -28.57888,40.90408 -52.66114,41.10765 -19.35228,0.16358 -27.47163,-22.30881 -41.37036,-33.25538 -12.738587,-10.03284 -30.901815,-15.3277 -45.278119,-5.50969 -15.921932,10.87357 -31.050332,23.62192 -43.922893,37.09175 -10.3168901,10.79558 18.634698,3.64617 25.702003,1.70854 15.825143,-4.33876 26.152871,-26.28003 43.727957,-20.68653 24.347622,7.74894 34.504442,40.01969 61.450132,43.62223 19.0975,2.55326 29.64692,-16.80332 42.96554,-26.8097 17.72133,-13.31417 27.30477,-35.55547 47.14364,-45.80732 19.04682,-9.84254 11.32886,20.10169 11.1056,30.01083 -0.36419,16.16466 16.75462,28.60943 31.25113,22.04897 34.77978,-15.73975 67.38269,-37.09023 103.02227,-50.33791 13.61559,-5.06109 28.17522,21.87977 39.03272,6.77141 10.16198,-14.14054 -11.55596,-22.72337 -23.38281,-25.59568 -20.59777,-5.00244 -40.46813,3.74367 -56.84155,15.46498 -19.66628,14.07858 -40.09262,34.08975 -65.31157,33.05584 -23.73665,-0.97313 -7.06521,-32.87209 -12.29693,-48.29286 -1.98258,-5.84375 -5.9199,-12.21206 -12.73548,-11.27082 z"
+ id="path3843"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:AlArabiya;-inkscape-font-specification:AlArabiya" />
+ <path
+ d="m 60.576921,378.84616 c 9.591345,-5.55289 115.096149,-18.17308 115.096149,-18.17308 0,0 12.00446,-15.60579 29.88131,-36.69369 1.60431,-1.89248 -33.14092,-3.77344 -36.24212,-5.4945 6.17598,-4.68353 43.05023,-2.4678 43.99744,-3.56285 28.21354,-32.61752 67.06407,-73.87374 97.65183,-92.56626 54.51922,-33.31731 147.40384,-96.92307 147.40384,-96.92307 0.52738,-41.147106 -12.95853,-76.582358 -1.54722,-120.4504455 0,0 -49.94317,25.5466005 -80.23163,34.6331385 -30.28846,9.086538 -50.36318,5.306327 -87.83653,22.211538 C 186.78379,126.87393 103.29043,244.00325 54.461536,356.59616 c -2.019231,12.11538 7.125,20.23077 6.115385,22.25 z m -9.84375,11.3774 c 32.07488,-8.80466 42.204181,0.55504 65.372589,-2.52404 -25.638961,8.95352 -45.96798,13.52311 -74.206723,13.37741"
+ id="path3741"
+ style="color:#000000;fill:#ffffff;stroke:#733e1a;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-opacity:0" />
+ <path
+ d="m 165.65534,216.90728 -11.38264,-22.94579 0.83937,27.2356"
+ id="path3922"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 297.13748,115.32605 107.71781,23.39888 -90.04955,-33.99985"
+ id="path3745"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 332.21423,88.51031 103.9061,29.16485 -89.08095,-37.153326"
+ id="path3755"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 261.29614,138.5472 376.7638,155.2725 274.42113,126.93662"
+ id="path3759"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 233.24418,164.83025 351.94954,175.4913 248.19047,154.42511"
+ id="path3763"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 199.42237,190.88654 334.2133,195.11633 212.94895,175.31505"
+ id="path3767"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 173.89649,220.11272 135.04073,-4.90965 -123.28859,-8.84893"
+ id="path3771"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 140.86946,256.33676 274.073,246.13401 151.14276,240.67381"
+ id="path3775"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 112.51577,285.01632 235.16095,271.93196 124.36087,269.26889"
+ id="path3779"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 99.291969,308.10485 217.41096,295.26618 106.6137,298.04368"
+ id="path3783"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 78.221495,337.31759 196.59507,327.08904 85.763499,327.42048"
+ id="path3787"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 63.067057,367.67355 180.69991,350.95715 70.053935,357.37703"
+ id="path3791"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 377.12755,76.969825 448.83473,86.339188 382.9221,66.971873"
+ id="path3795"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 322.98491,90.094495 -16.05463,-27.61863 8.47964,31.23806"
+ id="path3879"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 354.76714,77.950668 -16.0983,-24.713369 7.57943,30.363257"
+ id="path3883"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 288.66623,111.30584 -14.15785,-32.951706 5.26684,36.395076"
+ id="path3887"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 258.539,130.69758 -13.39052,-30.15109 5.51462,36.09022"
+ id="path3891"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 229.20006,152.54452 -12.68439,-28.18497 4.43463,35.67591"
+ id="path3895"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="m 200.41254,180.96411 -11.19356,-26.20149 -1.18117,38.17609"
+ id="path3899"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ d="M 12.620192,476.27404 40.54257,421.89348 C 82.048684,298.57062 220.24042,162.72046 311.26295,110.2074 352.5764,86.372689 394.64311,78.704862 456.1351,5.2273665 348.50358,94.035131 345.71368,77.741831 313.042,95.623687 218.99014,147.10013 29.429686,314.67462 12.620192,476.27404 z"
+ id="path3739"
+ style="color:#000000;fill:#733e1a;fill-opacity:1;stroke:#733e1a;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+</svg>
diff --git a/website/static/projects/24game b/website/static/projects/24game
new file mode 160000
+Subproject 843ae80903a774383b3614f4a63d24ecf4634a9
diff --git a/website/static/projects/betrayal b/website/static/projects/betrayal
new file mode 160000
+Subproject 05ac1a431b15b31d8f503c9156ff68789031dee
diff --git a/website/static/projects/bingbong/index.html b/website/static/projects/bingbong/index.html
new file mode 100644
index 0000000..8edea34
--- /dev/null
+++ b/website/static/projects/bingbong/index.html
@@ -0,0 +1,244 @@
+<!doctype html>
+ <style>
+ body {
+ background: #2b2b2b;
+ font: 130%/198% sans-serif;
+ color: #f6f6f6;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+ }
+
+ .half {
+ width: 50%;
+ float: left;
+ }
+
+ .full { width: 100%; }
+ #intro p { clear: both; margin: 0.3em; }
+ #intro { margin: 1em; }
+
+ textarea {
+ width: 98%;
+ padding: 0.3em 0;
+ border: 0;
+ margin: 0;
+ height: 15em;
+ background: #f6f6f6;
+ }
+
+ svg {
+ width: 98%;
+ height: 10em;
+ background-color: #f6f6f6;
+ }
+ </style>
+
+ <section id="intro" class="full">
+ <h1>Bing/Bong</h1>
+ <h2>Human interpretable binary encoding</h2>
+ <p>Try entering <code>.</code> or <code>-</code></p>
+ </section>
+ <section id="input" class="half">
+ <h1>Input</h1>
+ <textarea id="renderSource"></textarea>
+ </section>
+ <section id="output" class="half">
+ <h1>Output</h1>
+ <svg id="renderTarget" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
+ </section>
+
+ <script>
+ var svgNS = "http://www.w3.org/2000/svg"
+
+ window.addEventListener("load", function() {
+ var vertexRadius = 10
+ var pointRadius = 2
+ var vertexSpacing = vertexRadius * 4
+
+ var vertexPositionX = function(row, column) { return vertexRadius * 1.5 + column * vertexSpacing; }
+ var vertexPositionY = function(row, column) { return vertexRadius * 1.5 + row * vertexSpacing; }
+ var vertexPositionXTop = function(row, column) { return vertexPositionX(row, column); }
+ var vertexPositionXLeft = function(row, column) { return vertexPositionX(row, column) - vertexRadius/2; }
+ var vertexPositionXRight = function(row, column) { return vertexPositionX(row, column) + vertexRadius/2; }
+ var vertexPositionXBottom = function(row, column) { return vertexPositionX(row, column); }
+ var vertexPositionYTop = function(row, column) { return vertexPositionY(row, column) - vertexRadius/2; }
+ var vertexPositionYLeft = function(row, column) { return vertexPositionY(row, column); }
+ var vertexPositionYRight = function(row, column) { return vertexPositionY(row, column); }
+ var vertexPositionYBottom = function(row, column) { return vertexPositionY(row, column) + vertexRadius/2; }
+
+ var renderVertex = function(x, y, parentEl) {
+ var top = document.createElementNS(svgNS, "circle")
+ top.setAttributeNS(null, "cx", x)
+ top.setAttributeNS(null, "cy", y - vertexRadius/2)
+ top.setAttributeNS(null, "r", pointRadius)
+ top.setAttributeNS(null, "fill", "#b6b6b6")
+ parentEl.appendChild(top)
+
+ var right = document.createElementNS(svgNS, "circle")
+ right.setAttributeNS(null, "cx", x + vertexRadius/2)
+ right.setAttributeNS(null, "cy", y)
+ right.setAttributeNS(null, "r", pointRadius)
+ right.setAttributeNS(null, "fill", "#b6b6b6")
+ parentEl.appendChild(right)
+
+ var left = document.createElementNS(svgNS, "circle")
+ left.setAttributeNS(null, "cx", x - vertexRadius/2)
+ left.setAttributeNS(null, "cy", y)
+ left.setAttributeNS(null, "r", pointRadius)
+ left.setAttributeNS(null, "fill", "#b6b6b6")
+ parentEl.appendChild(left)
+
+ var bot = document.createElementNS(svgNS, "circle")
+ bot.setAttributeNS(null, "cx", x)
+ bot.setAttributeNS(null, "cy", y + vertexRadius/2)
+ bot.setAttributeNS(null, "r", pointRadius)
+ bot.setAttributeNS(null, "fill", "#b6b6b6")
+ parentEl.appendChild(bot)
+
+ }
+
+ var renderGrid = function(rows, columns, parentId) {
+ var parentEl = document.getElementById(parentId)
+ if(parentEl == null) { console.log("could not find parent ", parentId); return; }
+ for(var i = 0; i < rows; i++) {
+ for(var j = 0; j < columns; j++) { // TODO: center this display within the output svg
+ renderVertex(vertexPositionX(i,j), vertexPositionY(i,j), parentEl)
+ }
+ }
+ }
+
+
+ var gridWidth = 4;
+ var gridHeight = 5;
+ renderGrid(gridHeight, gridWidth, "renderTarget")
+
+ var cursorToCoords = function(cursor) {
+ var x, y
+ switch (cursor.vertIdx) {
+ case 0:
+ x = vertexPositionXTop(cursor.row, cursor.column)
+ y = vertexPositionYTop(cursor.row, cursor.column)
+ break
+ case 1:
+ x = vertexPositionXRight(cursor.row, cursor.column)
+ y = vertexPositionYRight(cursor.row, cursor.column)
+ break
+ case 2:
+ x = vertexPositionXBottom(cursor.row, cursor.column)
+ y = vertexPositionYBottom(cursor.row, cursor.column)
+ break
+ case 3:
+ x = vertexPositionXLeft(cursor.row, cursor.column)
+ y = vertexPositionYLeft(cursor.row, cursor.column)
+ break
+ default:
+ console.log("invalid vertIdx " + cursor.vertIdx)
+ }
+
+ return { x: x, y: y }
+ }
+
+ var renderBing = function(cursor) { // TODO return errors
+ var coords0 = cursorToCoords(cursor)
+ cursor.vertIdx = (cursor.vertIdx + 1) % 4
+ var coords1 = cursorToCoords(cursor)
+
+ var bing = document.createElementNS(svgNS, "path")
+ var moves = "M " + coords0.x + " " + coords0.y + " " + "A " + vertexRadius*0.5 + " " + vertexRadius*0.5 + " 0 0 1 " + coords1.x + " " + coords1.y
+ bing.setAttributeNS(null, "d", moves)
+ bing.setAttributeNS(null, "stroke", "red")
+ bing.setAttributeNS(null, "stroke-width", "3")
+ cursor.parentEl.appendChild(bing)
+ cursor = updateCursorPosition(cursor)
+
+ return cursor
+ }
+
+ var renderBong = function(cursor) { // TODO return errors
+ var coords0 = cursorToCoords(cursor)
+ switch (cursor.vertIdx) {
+ case 0: cursor.row -= 1; break;
+ case 1: cursor.column += 1; break;
+ case 2: cursor.row += 1; break;
+ case 3: cursor.column -= 1; break;
+ }
+ if (cursor.row < 0 || cursor.row >= gridHeight || cursor.column < 0 || cursor.column >= gridWidth) {
+ console.log("You're gonna need a bigger grid.")
+ return cursor
+ }
+ cursor.vertIdx = (cursor.vertIdx + 2) % 4
+
+ var coords1 = cursorToCoords(cursor)
+
+ var bong = document.createElementNS(svgNS, "path")
+ var moves = "M " + coords0.x + " " + coords0.y + " L " + coords1.x + " " + coords1.y
+ bong.setAttributeNS(null, "d", moves)
+ bong.setAttributeNS(null, "stroke", "red")
+ bong.setAttributeNS(null, "stroke-width", "3")
+ cursor.parentEl.appendChild(bong)
+ cursor = updateCursorPosition(cursor)
+ return cursor
+ }
+
+ var updateCursorPosition = function(cursor) {
+ var coords = cursorToCoords(cursor)
+ cursor.cursorEl.setAttributeNS(null, "cx", coords.x)
+ cursor.cursorEl.setAttributeNS(null, "cy", coords.y)
+ return cursor
+ }
+
+ var cursor = (function(parentId) {
+ var c = {
+ row: 0,
+ column: 0,
+ vertIdx: 0, // 0 top, 1 right, 2 bottom, 3 left
+ parentEl: document.getElementById(parentId),
+ }
+
+ var cursorEl = document.createElementNS(svgNS, "circle")
+ cursorEl.setAttributeNS(null, "id", "cursor")
+ cursorEl.setAttributeNS(null, "r", pointRadius + 2)
+ cursorEl.setAttributeNS(null, "stroke-width", 1)
+ cursorEl.setAttributeNS(null, "fill", "none")
+ cursorEl.setAttributeNS(null, "stroke", "blue")
+ coords = cursorToCoords(c)
+ cursorEl.setAttributeNS(null, "cx", coords.x)
+ cursorEl.setAttributeNS(null, "cy", coords.y)
+ c.cursorEl = cursorEl
+ c.parentEl.appendChild(cursorEl)
+ return c
+ }("renderTarget"))
+
+ var renderTestSequence = function(inp) {
+ for (var i=0, l = inp.length; i < l; i++) {
+ if(inp[i] === ".") {
+ cursor = renderBing(cursor)
+ } else if (inp[i] === "-") {
+ cursor = renderBong(cursor)
+ } else { // TODO add clear character, 'x' perhaps?
+ console.log("skipping unknown character '" + inp[i] + "'")
+ }
+ }
+ }
+// renderTestSequence(".-..-...-..-...-..-...-..-..")
+
+ renderSourceEl = document.getElementById("renderSource")
+ renderSourceEl.addEventListener("keypress", function(event) {
+ switch(event.keyCode || event.charCode) {
+ case 45: // -
+ cursor = renderBong(cursor)
+ break
+ case 46: // .
+ cursor = renderBing(cursor)
+ break
+ default:
+ renderSourceEl.value = renderSourceEl.value.replace(/[^.-]/, '')
+ break
+ }
+ }, true)
+
+
+
+ }, true)
+ </script>
diff --git a/website/static/projects/energyconversion.html b/website/static/projects/energyconversion.html
new file mode 100644
index 0000000..cf491d3
--- /dev/null
+++ b/website/static/projects/energyconversion.html
@@ -0,0 +1,108 @@
+<html>
+<head>
+ <title>RampantMonk3y-Energy Conversion</title>
+</head>
+
+<body>
+ <script language="JavaScript" >
+ <!--
+ function updt (f,n) {
+ ry2ev=13.6;
+ ev2ry=1/ry2ev;
+ ha2kc=627.5;
+ kc2ha=1/ha2kc;
+ ha2ry=2.0;
+ ry2ha=1/ha2ry;
+ ev2cm=8065.541154;
+ cm2ev=1/ev2cm;
+ ev2ke=11604.5;
+ ke2ev=1/ev2ke;
+ ev2kj=96.4854;
+ kj2ev=1/ev2kj;
+ ev2th=241.7988407662022;
+ th2ev=1/ev2th;
+ hc=1239.84; // h.c in eV * nm
+ eval ("v=new Number(f.field"+n+".value)");
+ if (n==1) { // Input ev
+ ev=v;
+ }
+ if (n==2) { // Input ry
+ ev=v*ry2ev;
+ }
+ if (n==3) { // Input ha
+ ev=v*ha2ry*ry2ev;
+ }
+ if (n==4) { // Input kc
+ ev=v*kc2ha*ha2ry*ry2ev;
+ }
+ if (n==5) { // Input nm
+ ev=hc/v;
+ }
+ if (n==6) { // Input cm-1
+ ev=v*cm2ev;
+ }
+ if (n==7) { // Input K
+ ev=v*ke2ev;
+ }
+ if (n==8) { // Input kj
+ ev=v*kj2ev;
+ }
+ if (n==9) { // Input THz
+ ev=v*th2ev;
+ }
+ f.field1.value=ev;
+ f.field2.value=ev*ev2ry;
+ f.field3.value=ev*ev2ry*ry2ha;
+ f.field4.value=ev*ev2ry*ry2ha*ha2kc;
+ f.field5.value=hc/ev;
+ f.field6.value=ev*ev2cm;
+ f.field7.value=ev*ev2ke;
+ f.field8.value=ev*ev2kj;
+ f.field9.value=ev*ev2th;
+ }
+ // -->
+ </SCRIPT>
+<FORM ACTION="energyconversion.html">
+<TABLE CELLPADDING=5 CELLSPACING=0 BORDER=1><TR><TD BGCOLOR="silver">
+ <TABLE>
+ <TR>
+ <TD ALIGN="center">eV</TD>
+ <TD ALIGN="center">Ry</TD>
+ <TD ALIGN="center">Ha</TD>
+ <TD ALIGN="center">kcal/mol</TD>
+
+ <TD ALIGN="center">nm</TD>
+ <TD ALIGN="center">cm<sup>-1</sup></TD>
+ <TD ALIGN="center">K</TD>
+ <TD ALIGN="center">kJ/mol</TD>
+ <TD ALIGN="center">THz</TD>
+ <TD ALIGN="center"> </TD>
+
+ </TR>
+ <TR>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field1" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,1)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field2" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,2)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field3" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,3)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field4" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,4)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field5" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,5)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field6" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,6)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field7" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,7)"></TD>
+
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field8" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,8)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="text" NAME="field9" SIZE=7 MAXLENGTH=7 onChange="updt (this.form,9)"></TD>
+ <TD ALIGN="center"><INPUT TYPE="reset" VALUE="reset"></TD>
+ </TR>
+ <TR>
+ <TD ALIGN="center" COLSPAN=5>
+ <FONT FACE="arial,helvetica" SIZE=1>Write a value in the suitable input field and press TAB</FONT>
+ </TD>
+
+ </TR>
+ </TABLE>
+</TD>
+</TR>
+</TABLE>
+</FORM>
+
+</body>
+</html>
diff --git a/website/static/projects/gatesoftime/index.html b/website/static/projects/gatesoftime/index.html
new file mode 100644
index 0000000..ca408d0
--- /dev/null
+++ b/website/static/projects/gatesoftime/index.html
@@ -0,0 +1,2217 @@
+<!doctype html>
+<style>
+ body {
+ text-align: center;
+ }
+
+ #success {
+ margin: 2em;
+ }
+
+ table {
+ width: 100%;
+ text-align: center;
+ }
+
+ tr:nth-child(odd) {
+ background: #dddedb;
+ }
+
+ td {
+ width: 33%;
+ }
+
+ button {
+ margin: 3em 1em;
+ }
+</style>
+
+
+<meta charset="UTF-8">
+<meta name="viewport" contents="initial-scale=1.0, width=device-width" />
+<title>Gates of Time</title>
+
+
+<script>
+ (function(){
+ var svgNS = "http://www.w3.org/2000/svg"
+ var typeface =
+ { 1: [0,1,1,0,0,0,0]
+ , 2: [1,1,0,1,1,0,1]
+ , 3: [1,1,1,1,0,0,1]
+ , 4: [0,1,1,0,0,1,1]
+ , 5: [1,0,1,1,0,1,1]
+ , 6: [1,0,1,1,1,1,1]
+ , 7: [1,1,1,0,0,0,0]
+ , 8: [1,1,1,1,1,1,1]
+ , 9: [1,1,1,1,0,1,1]
+ , 0: [1,1,1,1,1,1,0]
+ , a: [1,1,1,0,1,1,1]
+ , b: [0,0,1,1,1,1,1]
+ , c: [1,0,0,1,1,1,0]
+ , d: [0,1,1,1,1,0,1]
+ , e: [1,0,0,1,1,1,1]
+ , f: [1,0,0,0,1,1,1]
+ , g: [1,1,1,1,0,1,1]
+ , h: [0,0,1,0,1,1,1]
+ , i: [0,0,0,0,1,1,0]
+ , j: [0,1,1,1,1,0,0]
+ , k: [0,1,1,0,1,1,1]
+ , l: [0,0,0,1,1,1,0]
+ , m: [0,0,0,0,0,0,0]
+ , n: [0,0,1,0,1,0,1]
+ , o: [1,1,1,1,1,1,0]
+ , p: [1,1,0,0,1,1,1]
+ , q: [1,1,1,0,0,1,1]
+ , r: [0,0,0,0,1,0,1]
+ , s: [1,0,1,1,0,1,1]
+ , t: [0,0,0,1,1,1,1]
+ , u: [0,0,1,1,1,0,0]
+ , v: [0,1,1,1,1,1,0]
+ , w: [0,0,0,0,0,0,0]
+ , x: [0,0,0,0,0,0,0]
+ , y: [0,1,1,1,0,1,1]
+ , z: [1,1,0,1,1,0,1]
+ , dash: [0,0,0,0,0,0,1]}
+
+ function getParameterByName(name, url) {
+ if (!url) url = window.location.href;
+ name = name.replace(/[\[\]]/g, "\\$&");
+ var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
+ results = regex.exec(url);
+ if (!results) return null;
+ if (!results[2]) return '';
+ return decodeURIComponent(results[2].replace(/\+/g, " "));
+ }
+
+ window.addEventListener("load", function(e) {
+ (function(){
+ var addToCanvas = function(canvasId, ledid) {
+ var x = ledid*13;
+ canvasEl = document.getElementById(canvasId)
+ var graph = document.createElementNS(svgNS, "g")
+ graph.setAttributeNS(null, "style", "fill-rule:evenodd; stroke:#ffffff; stroke-width:0.25; stroke-opacity:1; stroke-linecap:butt; stroke-linejoin:miter;")
+
+ var leda = document.createElementNS(svgNS, "polygon")
+ leda.setAttributeNS(null, "id", "led" + ledid + "-a")
+ leda.setAttributeNS(null, "fill", "#dddddd")
+ leda.setAttributeNS(null, "points", " " + (1+x) + ", 1 " + (2+x) + ", 0 " + (8+x) + ", 0 " + (9+x) + ", 1 " + (8+x) + ", 2 " + (2+x) + ", 2")
+ graph.appendChild(leda)
+
+ var ledb = document.createElementNS(svgNS, "polygon")
+ ledb.setAttributeNS(null, "id", "led" + ledid + "-b")
+ ledb.setAttributeNS(null, "fill", "#dddddd")
+ ledb.setAttributeNS(null, "points", " " + (9+x) + ", 1 " + (10+x) + ", 2 " + (10+x) + ", 8 " + (9+x) + ", 9 " + (8+x) + ", 8 " + (8+x) + ", 2")
+ graph.appendChild(ledb)
+
+
+ var ledc = document.createElementNS(svgNS, "polygon")
+ ledc.setAttributeNS(null, "id", "led" + ledid + "-c")
+ ledc.setAttributeNS(null, "fill", "#dddddd")
+ ledc.setAttributeNS(null, "points", " " + (9+x) + ", 9 " + (10+x) + ",10 " + (10+x) + ",16 " + (9+x) + ",17 " + (8+x) + ",16 " + (8+x) + ",10")
+ graph.appendChild(ledc)
+
+
+ var ledd = document.createElementNS(svgNS, "polygon")
+ ledd.setAttributeNS(null, "id", "led" + ledid + "-d")
+ ledd.setAttributeNS(null, "fill", "#dddddd")
+ ledd.setAttributeNS(null, "points", " " + (9+x) + ",17 " + (8+x) + ",18 " + (2+x) + ",18 " + (1+x) + ",17 " + (2+x) + ",16 " + (8+x) + ",16")
+ graph.appendChild(ledd)
+
+
+ var lede = document.createElementNS(svgNS, "polygon")
+ lede.setAttributeNS(null, "id", "led" + ledid + "-e")
+ lede.setAttributeNS(null, "fill", "#dddddd")
+ lede.setAttributeNS(null, "points", " " + (1+x) + ",17 " + (0+x) + ",16 " + (0+x) + ",10 " + (1+x) + ", 9 " + (2+x) + ",10 " + (2+x) + ",16")
+ graph.appendChild(lede)
+
+
+ var ledf = document.createElementNS(svgNS, "polygon")
+ ledf.setAttributeNS(null, "id", "led" + ledid + "-f")
+ ledf.setAttributeNS(null, "fill", "#dddddd")
+ ledf.setAttributeNS(null, "points", " " + (1+x) + ", 9 " + (0+x) + ", 8 " + (0+x) + ", 2 " + (1+x) + ", 1 " + (2+x) + ", 2 " + (2+x) + ", 8")
+ graph.appendChild(ledf)
+
+
+ var ledg = document.createElementNS(svgNS, "polygon")
+ ledg.setAttributeNS(null, "id", "led" + ledid + "-g")
+ ledg.setAttributeNS(null, "fill", "#dddddd")
+ ledg.setAttributeNS(null, "points", " " + (1+x) + ", 9 " + (2+x) + ", 8 " + (8+x) + ", 8 " + (9+x) + ", 9 " + (8+x) + ",10 " + (2+x) + ",10")
+ graph.appendChild(ledg)
+ canvasEl.appendChild(graph)
+ }
+ addToCanvas("display-container", 0)
+ addToCanvas("display-container", 1)
+ addToCanvas("display-container", 2)
+ addToCanvas("display-container", 3)
+ }());
+
+ var segments = (function() {
+ var getElements = function(ledid) {
+ var s = {}
+ s.a = document.getElementById("led"+ledid+"-a")
+ s.b = document.getElementById("led"+ledid+"-b")
+ s.c = document.getElementById("led"+ledid+"-c")
+ s.d = document.getElementById("led"+ledid+"-d")
+ s.e = document.getElementById("led"+ledid+"-e")
+ s.f = document.getElementById("led"+ledid+"-f")
+ s.g = document.getElementById("led"+ledid+"-g")
+ s.h = document.getElementById("led"+ledid+"-h")
+ return s
+ }
+ var s = {}
+ s.s0 = getElements(0)
+ s.s1 = getElements(1)
+ s.s2 = getElements(2)
+ s.s3 = getElements(3)
+ return s
+ }())
+ if(!segments) { return }
+
+ var turnOnSegment = function(idx, letter) {
+ segments["s"+idx][letter].setAttribute("fill", "#ff0000")
+ }
+ var turnOffSegment = function(idx,letter) {
+ segments["s"+idx][letter].setAttribute("fill", "#dddddd")
+ }
+
+ var renderCounter = 0
+ function render(v, transition) {
+ for(var i = 0; i < v.length; ++i) {
+ var leds = typeface[v[i]] || typeface.dash
+ if(leds[0] > 0) { turnOnSegment(i,"a") } else { turnOffSegment(i,"a") }
+ if(leds[1] > 0) { turnOnSegment(i,"b") } else { turnOffSegment(i,"b") }
+ if(leds[2] > 0) { turnOnSegment(i,"c") } else { turnOffSegment(i,"c") }
+ if(leds[3] > 0) { turnOnSegment(i,"d") } else { turnOffSegment(i,"d") }
+ if(leds[4] > 0) { turnOnSegment(i,"e") } else { turnOffSegment(i,"e") }
+ if(leds[5] > 0) { turnOnSegment(i,"f") } else { turnOffSegment(i,"f") }
+ if(leds[6] > 0) { turnOnSegment(i,"g") } else { turnOffSegment(i,"g") }
+ }
+
+ if(transition) {
+ var parent = document.getElementById("path-container")
+ if(transition === "reset") {
+ renderCounter = 0
+ while (parent.hasChildNodes()) { parent.removeChild(parent.lastChild) }
+ }
+ if(v.join("") === "fact" && renderCounter === 11) {
+ var successEl = document.getElementById("success")
+ successEl.innerHTML = "Congrats. The answer is 'deactivates'."
+ }
+ var tr = document.createElement("tr")
+ var tdCounter = document.createElement("td")
+ tdCounter.innerHTML = renderCounter
+ var tdTransform = document.createElement("td")
+ tdTransform.innerHTML = transition
+ var tdWord = document.createElement("td")
+ tdWord.innerHTML = v.join("")
+ tr.appendChild(tdCounter)
+ tr.appendChild(tdTransform)
+ tr.appendChild(tdWord)
+ parent.appendChild(tr)
+ renderCounter += 1
+ }
+ }
+
+ if(getParameterByName("digits") !== null) {
+ (function() {
+ var is_invalid = function(v) {
+ return v.some(function(x) { return x >= 10 })
+ }
+
+ var vals = [2,0,1,7]
+ var lastTransition = "reset"
+ render(vals)
+
+ let btnContainer = document.getElementById("buttons")
+ btnContainer.innerHTML = '<button id="reset">Reset</button>'
+ + '<button id="incrementdigits">Increment Digits</button>'
+ + '<button id="base8">Base 8</button>'
+ + '<button id="product">Product of first half and second half</button>'
+ + '<button id="rotateleftandadd">Rotate left and add</button>'
+ + '<button id="verticalflip">Flip Vertically</button>'
+ + '<button id="numsegments">Number of Segments</button>'
+
+
+ document.getElementById("reset").addEventListener("click", function() {
+ if(lastTransition === "reset") { return }
+ else { lastTransition = "reset" }
+ vals = [2,0,1,7]
+ render(vals, "reset")
+ }, true)
+ document.getElementById("incrementdigits").addEventListener("click", function() {
+ if(lastTransition === "incrementdigits") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "incrementdigits" }
+ vals = vals.map(function(el) { return el + 1 })
+ if(is_invalid(vals)) { vals = [10, 10, 10, 10] }
+ render(vals, "increment digits")
+ }, true)
+ document.getElementById("base8").addEventListener("click", function() {
+ if(lastTransition === "base8") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "base8" }
+ var v = vals[0]*1000 + vals[1]*100 + vals[2]*10 + vals[3]
+ var base8 = parseInt(v.toString(8), 10)
+ if(base8 > 9999) {
+ vals = [10, 10, 10, 10]
+ } else {
+ vals[3] = base8 % 10
+ vals[2] = Math.floor(base8/10)%10
+ vals[1] = Math.floor(base8/100)%10
+ vals[0] = Math.floor(base8/1000)%10
+ }
+ render(vals, "base8")
+ }, true)
+ document.getElementById("product").addEventListener("click", function() {
+ if(lastTransition === "product") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "product" }
+ var left = vals[0]*10 + vals[1]
+ var right = vals[2]*10 + vals[3]
+ var product = left * right
+ if(product > 9999) {
+ vals = [10, 10, 10, 10]
+ } else {
+ vals[3] = product % 10
+ vals[2] = Math.floor(product/10)%10
+ vals[1] = Math.floor(product/100)%10
+ vals[0] = Math.floor(product/1000)%10
+ }
+ render(vals, "product")
+ }, true)
+ document.getElementById("numsegments").addEventListener("click", function() {
+ if(lastTransition == "numsegments") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "numsegments" }
+ vals = vals.map(function(el) {
+ switch(el) {
+ case 0: return 6;
+ case 1: return 2;
+ case 2: return 5;
+ case 3: return 5;
+ case 4: return 4;
+ case 5: return 5;
+ case 6: return 6;
+ case 7: return 3;
+ case 8: return 7;
+ case 9: return 6;
+ default: return 10;
+ }
+ })
+ render(vals, "numsegments")
+ }, true)
+ document.getElementById("rotateleftandadd").addEventListener("click", function() {
+ if(lastTransition === "rotateleftandadd") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "rotateleftandadd" }
+ var tmp = vals.shift()
+ vals.push(tmp)
+ vals = vals.map(function(el) { return el + 1 })
+ if(is_invalid(vals)) { vals = [10, 10, 10, 10] }
+ render(vals, "rotateleftandadd")
+ }, true)
+ document.getElementById("verticalflip").addEventListener("click", function() {
+ if(lastTransition === "verticalflip") { return }
+ else if(is_invalid(vals)) { return }
+ else { lastTransition = "verticalflip" }
+ vals = vals.map(function(el) {
+ switch(el) {
+ case 0: return 0;
+ case 2: return 5;
+ case 5: return 2;
+ case 6: return 9;
+ case 8: return 8;
+ case 9: return 6;
+ default: return 10;
+ }
+ })
+ if(vals.some(function(x) { return x >= 10 })) {
+ vals = [10, 10, 10, 10]
+ }
+ render(vals, "verticalflip")
+ }, true)
+ }());
+ } else {
+ (function() {
+ var dictionary = [
+ , "abbe"
+ , "abbr"
+ , "abed"
+ , "abet"
+ , "able"
+ , "ably"
+ , "abut"
+ , "acct"
+ , "aced"
+ , "aces"
+ , "ache"
+ , "achy"
+ , "acid"
+ , "acne"
+ , "acre"
+ , "acts"
+ , "adds"
+ , "advt"
+ , "adze"
+ , "afar"
+ , "agar"
+ , "aged"
+ , "ages"
+ , "agog"
+ , "ague"
+ , "ahoy"
+ , "aide"
+ , "aids"
+ , "ails"
+ , "airs"
+ , "airy"
+ , "ajar"
+ , "alas"
+ , "ales"
+ , "alga"
+ , "ally"
+ , "aloe"
+ , "alps"
+ , "also"
+ , "alto"
+ , "alts"
+ , "anal"
+ , "anon"
+ , "ante"
+ , "anti"
+ , "ants"
+ , "anus"
+ , "aped"
+ , "apes"
+ , "apps"
+ , "apse"
+ , "aqua"
+ , "arch"
+ , "arcs"
+ , "area"
+ , "aria"
+ , "arid"
+ , "arts"
+ , "arty"
+ , "asap"
+ , "ashy"
+ , "asps"
+ , "assn"
+ , "asst"
+ , "atop"
+ , "attn"
+ , "atty"
+ , "aunt"
+ , "aura"
+ , "auto"
+ , "avdp"
+ , "aver"
+ , "avid"
+ , "ayah"
+ , "ayes"
+ , "baas"
+ , "babe"
+ , "baby"
+ , "bade"
+ , "bags"
+ , "baht"
+ , "bail"
+ , "bait"
+ , "bald"
+ , "bale"
+ , "ball"
+ , "band"
+ , "bane"
+ , "bang"
+ , "bani"
+ , "bans"
+ , "barb"
+ , "bard"
+ , "bare"
+ , "barf"
+ , "barn"
+ , "bars"
+ , "base"
+ , "bash"
+ , "bass"
+ , "bast"
+ , "bate"
+ , "bath"
+ , "bats"
+ , "baud"
+ , "bays"
+ , "bead"
+ , "bean"
+ , "bear"
+ , "beat"
+ , "beau"
+ , "beds"
+ , "beef"
+ , "been"
+ , "beep"
+ , "beer"
+ , "bees"
+ , "beet"
+ , "begs"
+ , "bell"
+ , "belt"
+ , "bend"
+ , "bent"
+ , "berg"
+ , "best"
+ , "beta"
+ , "bets"
+ , "bevy"
+ , "beys"
+ , "bias"
+ , "bibs"
+ , "bide"
+ , "bids"
+ , "bier"
+ , "biff"
+ , "bile"
+ , "bill"
+ , "bind"
+ , "bins"
+ , "biog"
+ , "bios"
+ , "bird"
+ , "bite"
+ , "bits"
+ , "blab"
+ , "blag"
+ , "blah"
+ , "blat"
+ , "bldg"
+ , "bled"
+ , "blip"
+ , "blob"
+ , "bloc"
+ , "blog"
+ , "blot"
+ , "blue"
+ , "blur"
+ , "blvd"
+ , "boar"
+ , "boas"
+ , "boat"
+ , "bobs"
+ , "bode"
+ , "bods"
+ , "body"
+ , "boga"
+ , "bogs"
+ , "boil"
+ , "bold"
+ , "bole"
+ , "boll"
+ , "bolt"
+ , "bond"
+ , "bone"
+ , "bong"
+ , "bony"
+ , "boob"
+ , "boon"
+ , "boor"
+ , "boos"
+ , "boot"
+ , "bops"
+ , "bore"
+ , "born"
+ , "boss"
+ , "both"
+ , "bots"
+ , "bout"
+ , "boys"
+ , "bozo"
+ , "brad"
+ , "brag"
+ , "bran"
+ , "bras"
+ , "brat"
+ , "bray"
+ , "bred"
+ , "brie"
+ , "brig"
+ , "bros"
+ , "bubo"
+ , "bubs"
+ , "buds"
+ , "buff"
+ , "bugs"
+ , "bulb"
+ , "bull"
+ , "bung"
+ , "buns"
+ , "bunt"
+ , "buoy"
+ , "burg"
+ , "burl"
+ , "burn"
+ , "burp"
+ , "burr"
+ , "burs"
+ , "bury"
+ , "bush"
+ , "buss"
+ , "bust"
+ , "busy"
+ , "buts"
+ , "butt"
+ , "buys"
+ , "buzz"
+ , "byes"
+ , "byre"
+ , "byte"
+ , "cabs"
+ , "cads"
+ , "cafe"
+ , "cage"
+ , "calf"
+ , "call"
+ , "cane"
+ , "cans"
+ , "cape"
+ , "caps"
+ , "card"
+ , "care"
+ , "carp"
+ , "cars"
+ , "cart"
+ , "case"
+ , "cash"
+ , "cast"
+ , "cats"
+ , "cave"
+ , "cays"
+ , "ceca"
+ , "cede"
+ , "cell"
+ , "cent"
+ , "cert"
+ , "chad"
+ , "chap"
+ , "char"
+ , "chat"
+ , "chef"
+ , "chge"
+ , "chic"
+ , "chin"
+ , "chip"
+ , "chis"
+ , "chit"
+ , "choc"
+ , "chop"
+ , "chub"
+ , "chug"
+ , "ciao"
+ , "cine"
+ , "cite"
+ , "city"
+ , "clad"
+ , "clan"
+ , "clap"
+ , "clay"
+ , "clef"
+ , "clii"
+ , "clip"
+ , "clod"
+ , "clog"
+ , "clop"
+ , "clot"
+ , "cloy"
+ , "club"
+ , "clue"
+ , "clvi"
+ , "coal"
+ , "coat"
+ , "cobs"
+ , "coda"
+ , "code"
+ , "cods"
+ , "coed"
+ , "cogs"
+ , "coho"
+ , "coif"
+ , "coil"
+ , "coin"
+ , "coir"
+ , "cola"
+ , "cold"
+ , "colt"
+ , "cone"
+ , "conj"
+ , "cons"
+ , "cool"
+ , "coon"
+ , "coop"
+ , "coos"
+ , "coot"
+ , "cope"
+ , "cops"
+ , "copy"
+ , "cord"
+ , "core"
+ , "corn"
+ , "corr"
+ , "cost"
+ , "cote"
+ , "cots"
+ , "coup"
+ , "cove"
+ , "cozy"
+ , "crab"
+ , "crag"
+ , "cray"
+ , "cred"
+ , "crib"
+ , "crop"
+ , "crud"
+ , "cube"
+ , "cubs"
+ , "cuds"
+ , "cued"
+ , "cues"
+ , "cuff"
+ , "cull"
+ , "cult"
+ , "cunt"
+ , "cups"
+ , "curb"
+ , "curd"
+ , "cure"
+ , "curl"
+ , "curs"
+ , "curt"
+ , "cusp"
+ , "cuss"
+ , "cute"
+ , "cuts"
+ , "cyan"
+ , "cyst"
+ , "czar"
+ , "dabs"
+ , "dado"
+ , "dads"
+ , "daft"
+ , "dags"
+ , "dais"
+ , "dale"
+ , "dang"
+ , "dare"
+ , "darn"
+ , "dart"
+ , "dash"
+ , "data"
+ , "date"
+ , "daub"
+ , "days"
+ , "daze"
+ , "dded"
+ , "dead"
+ , "deaf"
+ , "deal"
+ , "dean"
+ , "dear"
+ , "debs"
+ , "debt"
+ , "deed"
+ , "deep"
+ , "deer"
+ , "deft"
+ , "defy"
+ , "deli"
+ , "dell"
+ , "dens"
+ , "dent"
+ , "deny"
+ , "dept"
+ , "derv"
+ , "dial"
+ , "dibs"
+ , "dice"
+ , "dict"
+ , "died"
+ , "dies"
+ , "diet"
+ , "diff"
+ , "digs"
+ , "dill"
+ , "dine"
+ , "ding"
+ , "dins"
+ , "dint"
+ , "dips"
+ , "dire"
+ , "dirt"
+ , "disc"
+ , "dish"
+ , "dist"
+ , "ditz"
+ , "diva"
+ , "dive"
+ , "dobs"
+ , "docs"
+ , "dodo"
+ , "doer"
+ , "does"
+ , "doff"
+ , "doge"
+ , "dogs"
+ , "dole"
+ , "doll"
+ , "dolt"
+ , "done"
+ , "dons"
+ , "door"
+ , "dope"
+ , "dose"
+ , "dote"
+ , "dots"
+ , "dour"
+ , "dove"
+ , "doze"
+ , "dozy"
+ , "drab"
+ , "drag"
+ , "drat"
+ , "drip"
+ , "drop"
+ , "drub"
+ , "drug"
+ , "drys"
+ , "dual"
+ , "dubs"
+ , "duct"
+ , "dude"
+ , "duds"
+ , "duel"
+ , "dues"
+ , "duet"
+ , "duff"
+ , "dull"
+ , "duly"
+ , "dune"
+ , "dung"
+ , "duns"
+ , "duos"
+ , "dupe"
+ , "dust"
+ , "duty"
+ , "dyed"
+ , "dyer"
+ , "dyes"
+ , "each"
+ , "earl"
+ , "earn"
+ , "ears"
+ , "ease"
+ , "east"
+ , "easy"
+ , "eats"
+ , "eave"
+ , "ebbs"
+ , "eccl"
+ , "echo"
+ , "ecol"
+ , "econ"
+ , "ecru"
+ , "ecus"
+ , "eddy"
+ , "edge"
+ , "edgy"
+ , "edit"
+ , "educ"
+ , "eels"
+ , "effs"
+ , "egad"
+ , "eggs"
+ , "egos"
+ , "elan"
+ , "elev"
+ , "ells"
+ , "else"
+ , "encl"
+ , "ency"
+ , "ends"
+ , "envy"
+ , "eons"
+ , "epee"
+ , "epic"
+ , "eras"
+ , "ergo"
+ , "errs"
+ , "erst"
+ , "espy"
+ , "etch"
+ , "euro"
+ , "even"
+ , "ever"
+ , "eves"
+ , "evil"
+ , "eyed"
+ , "eyes"
+ , "face"
+ , "fact"
+ , "fade"
+ , "fads"
+ , "faff"
+ , "fail"
+ , "fain"
+ , "fair"
+ , "fall"
+ , "fang"
+ , "fans"
+ , "fare"
+ , "fart"
+ , "fast"
+ , "fate"
+ , "fats"
+ , "faun"
+ , "fave"
+ , "fays"
+ , "faze"
+ , "fear"
+ , "feat"
+ , "feds"
+ , "feed"
+ , "feel"
+ , "fees"
+ , "feet"
+ , "fell"
+ , "felt"
+ , "fend"
+ , "fens"
+ , "fern"
+ , "fess"
+ , "fest"
+ , "feta"
+ , "fete"
+ , "feud"
+ , "fiat"
+ , "fibs"
+ , "fief"
+ , "fife"
+ , "figs"
+ , "file"
+ , "fill"
+ , "filo"
+ , "find"
+ , "fine"
+ , "fins"
+ , "fire"
+ , "firs"
+ , "fish"
+ , "fist"
+ , "fits"
+ , "five"
+ , "fizz"
+ , "flab"
+ , "flag"
+ , "flan"
+ , "flap"
+ , "flat"
+ , "flay"
+ , "flea"
+ , "fled"
+ , "flee"
+ , "flip"
+ , "flit"
+ , "flog"
+ , "flop"
+ , "flub"
+ , "flue"
+ , "foal"
+ , "fobs"
+ , "foes"
+ , "fogs"
+ , "fogy"
+ , "foil"
+ , "fold"
+ , "foll"
+ , "fond"
+ , "font"
+ , "food"
+ , "fool"
+ , "foot"
+ , "ford"
+ , "fore"
+ , "fort"
+ , "foul"
+ , "four"
+ , "frat"
+ , "fray"
+ , "free"
+ , "freq"
+ , "fret"
+ , "frig"
+ , "frog"
+ , "ftps"
+ , "fuel"
+ , "full"
+ , "fund"
+ , "furl"
+ , "furn"
+ , "furs"
+ , "fury"
+ , "fuse"
+ , "fuss"
+ , "futz"
+ , "fuzz"
+ , "gabs"
+ , "gads"
+ , "gaff"
+ , "gaga"
+ , "gags"
+ , "gain"
+ , "gait"
+ , "gala"
+ , "gale"
+ , "gall"
+ , "gals"
+ , "gang"
+ , "gape"
+ , "gaps"
+ , "garb"
+ , "gars"
+ , "gash"
+ , "gasp"
+ , "gate"
+ , "gave"
+ , "gays"
+ , "gaze"
+ , "gear"
+ , "geed"
+ , "gees"
+ , "geld"
+ , "gels"
+ , "gene"
+ , "gens"
+ , "gent"
+ , "geog"
+ , "gets"
+ , "ghat"
+ , "ghee"
+ , "gibe"
+ , "gift"
+ , "gigs"
+ , "gild"
+ , "gill"
+ , "gilt"
+ , "gins"
+ , "girl"
+ , "giro"
+ , "girt"
+ , "gist"
+ , "gite"
+ , "gits"
+ , "give"
+ , "glad"
+ , "glee"
+ , "glen"
+ , "glib"
+ , "glob"
+ , "glop"
+ , "glue"
+ , "glut"
+ , "gnat"
+ , "gnus"
+ , "goad"
+ , "goal"
+ , "goat"
+ , "gobs"
+ , "gods"
+ , "goer"
+ , "goes"
+ , "gold"
+ , "golf"
+ , "gone"
+ , "gong"
+ , "good"
+ , "goof"
+ , "goon"
+ , "goop"
+ , "gore"
+ , "gory"
+ , "gosh"
+ , "goth"
+ , "gout"
+ , "govt"
+ , "grab"
+ , "grad"
+ , "gran"
+ , "gray"
+ , "grid"
+ , "grin"
+ , "grip"
+ , "grit"
+ , "grog"
+ , "grub"
+ , "grue"
+ , "guff"
+ , "gulf"
+ , "gull"
+ , "gulp"
+ , "guns"
+ , "guru"
+ , "gush"
+ , "gust"
+ , "guts"
+ , "guvs"
+ , "guys"
+ , "gyps"
+ , "gyro"
+ , "gyve"
+ , "haft"
+ , "hail"
+ , "hair"
+ , "hajj"
+ , "hale"
+ , "half"
+ , "hall"
+ , "halo"
+ , "halt"
+ , "hand"
+ , "hang"
+ , "hard"
+ , "hare"
+ , "harp"
+ , "hart"
+ , "hash"
+ , "hasp"
+ , "hate"
+ , "hats"
+ , "haul"
+ , "have"
+ , "hays"
+ , "haze"
+ , "hazy"
+ , "head"
+ , "heal"
+ , "heap"
+ , "hear"
+ , "heat"
+ , "heed"
+ , "heel"
+ , "heft"
+ , "heir"
+ , "held"
+ , "hell"
+ , "help"
+ , "hens"
+ , "herb"
+ , "herd"
+ , "here"
+ , "hero"
+ , "hers"
+ , "hide"
+ , "hied"
+ , "hies"
+ , "high"
+ , "hill"
+ , "hilt"
+ , "hind"
+ , "hing"
+ , "hint"
+ , "hips"
+ , "hire"
+ , "hiss"
+ , "hist"
+ , "hits"
+ , "hive"
+ , "hiya"
+ , "hobo"
+ , "hobs"
+ , "hods"
+ , "hoed"
+ , "hoer"
+ , "hoes"
+ , "hogs"
+ , "hold"
+ , "hole"
+ , "holy"
+ , "hone"
+ , "hood"
+ , "hoof"
+ , "hoop"
+ , "hoot"
+ , "hope"
+ , "hops"
+ , "horn"
+ , "hose"
+ , "host"
+ , "hots"
+ , "hour"
+ , "hove"
+ , "hubs"
+ , "hued"
+ , "hues"
+ , "huff"
+ , "huge"
+ , "hugs"
+ , "hula"
+ , "hull"
+ , "hung"
+ , "hunt"
+ , "hurl"
+ , "hurt"
+ , "hush"
+ , "huts"
+ , "hype"
+ , "hypo"
+ , "ibid"
+ , "ibis"
+ , "iced"
+ , "ices"
+ , "icon"
+ , "idea"
+ , "ides"
+ , "idle"
+ , "idly"
+ , "idol"
+ , "iffy"
+ , "ilea"
+ , "ilia"
+ , "ills"
+ , "inch"
+ , "incl"
+ , "incs"
+ , "info"
+ , "inns"
+ , "inst"
+ , "into"
+ , "ions"
+ , "iota"
+ , "iris"
+ , "iron"
+ , "isle"
+ , "ital"
+ , "itch"
+ , "jabs"
+ , "jade"
+ , "jags"
+ , "jail"
+ , "jape"
+ , "jars"
+ , "jato"
+ , "java"
+ , "jays"
+ , "jazz"
+ , "jean"
+ , "jeep"
+ , "jeer"
+ , "jeez"
+ , "jell"
+ , "jest"
+ , "jets"
+ , "jibe"
+ , "jibs"
+ , "jiff"
+ , "jigs"
+ , "jilt"
+ , "jinn"
+ , "jive"
+ , "jobs"
+ , "joey"
+ , "jogs"
+ , "john"
+ , "join"
+ , "jolt"
+ , "josh"
+ , "jots"
+ , "joys"
+ , "judo"
+ , "jugs"
+ , "jury"
+ , "just"
+ , "jute"
+ , "juts"
+ , "labs"
+ , "lace"
+ , "lacy"
+ , "lade"
+ , "lads"
+ , "lady"
+ , "lags"
+ , "laid"
+ , "lain"
+ , "lair"
+ , "land"
+ , "lane"
+ , "laps"
+ , "lard"
+ , "lase"
+ , "lash"
+ , "lass"
+ , "last"
+ , "late"
+ , "lath"
+ , "lats"
+ , "laud"
+ , "lava"
+ , "lave"
+ , "lavs"
+ , "lays"
+ , "laze"
+ , "lazy"
+ , "lead"
+ , "leaf"
+ , "lean"
+ , "leap"
+ , "leas"
+ , "lech"
+ , "leer"
+ , "lees"
+ , "left"
+ , "legs"
+ , "leis"
+ , "lend"
+ , "lens"
+ , "lent"
+ , "less"
+ , "lest"
+ , "lets"
+ , "levy"
+ , "liar"
+ , "lice"
+ , "lids"
+ , "lied"
+ , "lief"
+ , "lien"
+ , "lies"
+ , "lieu"
+ , "life"
+ , "lift"
+ , "lily"
+ , "line"
+ , "ling"
+ , "lino"
+ , "lint"
+ , "lion"
+ , "lips"
+ , "lira"
+ , "lire"
+ , "lisp"
+ , "list"
+ , "lite"
+ , "live"
+ , "load"
+ , "loaf"
+ , "loan"
+ , "lobe"
+ , "lobs"
+ , "loci"
+ , "loco"
+ , "lode"
+ , "loft"
+ , "loge"
+ , "logo"
+ , "logs"
+ , "logy"
+ , "loin"
+ , "loll"