You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mw...@apache.org on 2017/12/06 16:20:42 UTC

[accumulo-website] branch master updated (3ed7aa9 -> 3376d94)

This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git.


    from 3ed7aa9  Fixed page # on new upgrading page
     new 10215fe  ACCUMULO-4734 Created basic tour structure on website (#32)
     new 8aac928  ACCUMULO-4734 Create a few exercises for the tour
     new 79ad908  ACCUMULO-4734 Updated syntax highlighting (#41)
     new 3353d9b  Correct typo on range-splits page (#42)
     new f225080  ACCUMULO-4734 Changes from review of tour (#43)
     new d9658c5  Removed empty tour pages and fixed home page
     new 3376d94  updated authorizations in tour

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 _config.yml                     |   8 +++
 _data/tour.yml                  |  10 +++
 _includes/nav.html              |   1 +
 _layouts/tour.html              |  55 ++++++++++++++++
 _sass/_syntax-highlighting.scss | 135 +++++++++++++++++++---------------------
 css/accumulo.scss               |   4 ++
 index.html                      |   6 +-
 tour/authorizations-code.md     |  69 ++++++++++++++++++++
 tour/authorizations.md          |  51 +++++++++++++++
 tour/basic-read-write.md        |  58 +++++++++++++++++
 tour/batch-scanner-code.md      |  51 +++++++++++++++
 tour/batch-scanner.md           |  41 ++++++++++++
 tour/conditional-writer.md      |   3 +
 tour/data-model-code.md         |  62 ++++++++++++++++++
 tour/data-model.md              |  28 +++++++++
 tour/getting-started.md         |  32 ++++++++++
 tour/index.md                   |  28 +++++++++
 tour/ranges-splits.md           |  39 ++++++++++++
 tour/using-iterators.md         |   3 +
 19 files changed, 609 insertions(+), 75 deletions(-)
 create mode 100644 _data/tour.yml
 create mode 100644 _layouts/tour.html
 create mode 100644 tour/authorizations-code.md
 create mode 100644 tour/authorizations.md
 create mode 100644 tour/basic-read-write.md
 create mode 100644 tour/batch-scanner-code.md
 create mode 100644 tour/batch-scanner.md
 create mode 100644 tour/conditional-writer.md
 create mode 100644 tour/data-model-code.md
 create mode 100644 tour/data-model.md
 create mode 100644 tour/getting-started.md
 create mode 100644 tour/index.md
 create mode 100644 tour/ranges-splits.md
 create mode 100644 tour/using-iterators.md

-- 
To stop receiving notification emails like this one, please contact
['"commits@accumulo.apache.org" <co...@accumulo.apache.org>'].

[accumulo-website] 04/07: Correct typo on range-splits page (#42)

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit 3353d9be23d2dd3f42055258dca107a33ce6e00e
Author: Mark Owens <jm...@gmail.com>
AuthorDate: Wed Nov 29 10:58:48 2017 -0500

    Correct typo on range-splits page (#42)
---
 tour/ranges-splits.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tour/ranges-splits.md b/tour/ranges-splits.md
index 327d703..3f3bb41 100644
--- a/tour/ranges-splits.md
+++ b/tour/ranges-splits.md
@@ -16,7 +16,7 @@ scanner.setRange(new Range("id0000", "id0010"));  // returns rows from id0000 to
 
 As your data grows larger, Accumulo will split tables into smaller pieces called Tablets.  Tablets can then be distributed across multiple Tablet Servers.  
 By default a table will get split into Tablets on row boundaries, guaranteeing an entire row to be on one Tablet Server.  We have the ability to 
-tell Accumulo were to split tables by setting split points. This is done using _addSplits_ in the [TableOperations] API.  The image below 
+tell Accumulo where to split tables by setting split points. This is done using _addSplits_ in the [TableOperations] API.  The image below 
 demonstrates how Accumulo splits data.  
 
 ![data distribution]({{ site.url }}/images/docs/data_distribution.png)
@@ -33,4 +33,4 @@ Knowing these terms are critical when working closely with Accumulo.  Iterators
 When working with large amounts of data across many Tablet Servers, a simple Scanner might not do the trick. Next lesson we learn about the power of 
 the multi-threaded BatchScanner!  
 
-[TableOperations]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/admin/TableOperations.html
\ No newline at end of file
+[TableOperations]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/admin/TableOperations.html

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 03/07: ACCUMULO-4734 Updated syntax highlighting (#41)

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit 79ad9082ce9da593aa61db214ba3298238925170
Author: Mike Walch <mw...@apache.org>
AuthorDate: Tue Nov 28 16:41:43 2017 -0500

    ACCUMULO-4734 Updated syntax highlighting (#41)
---
 _sass/_syntax-highlighting.scss | 135 +++++++++++++++++++---------------------
 css/accumulo.scss               |   4 ++
 2 files changed, 69 insertions(+), 70 deletions(-)

diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss
index b479b95..a72eb09 100644
--- a/_sass/_syntax-highlighting.scss
+++ b/_sass/_syntax-highlighting.scss
@@ -1,70 +1,65 @@
-/**
- * Syntax highlighting styles
- */
-.highlight {
-    background: #fff;
-
-    .highlighter-rouge & {
-      background: #f5f5f5;
-    }
-
-    .c     { color: #998; font-style: italic } // Comment
-    .err   { color: #a61717; background-color: #e3d2d2 } // Error
-    .k     { font-weight: bold } // Keyword
-    .o     { font-weight: bold } // Operator
-    .cm    { color: #998; font-style: italic } // Comment.Multiline
-    .cp    { color: #999; font-weight: bold } // Comment.Preproc
-    .c1    { color: #998; font-style: italic } // Comment.Single
-    .cs    { color: #999; font-weight: bold; font-style: italic } // Comment.Special
-    .gd    { color: #000; background-color: #fdd } // Generic.Deleted
-    .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
-    .ge    { font-style: italic } // Generic.Emph
-    .gr    { color: #a00 } // Generic.Error
-    .gh    { color: #999 } // Generic.Heading
-    .gi    { color: #000; background-color: #dfd } // Generic.Inserted
-    .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
-    .go    { color: #888 } // Generic.Output
-    .gp    { color: #555 } // Generic.Prompt
-    .gs    { font-weight: bold } // Generic.Strong
-    .gu    { color: #aaa } // Generic.Subheading
-    .gt    { color: #a00 } // Generic.Traceback
-    .kc    { font-weight: bold } // Keyword.Constant
-    .kd    { font-weight: bold } // Keyword.Declaration
-    .kp    { font-weight: bold } // Keyword.Pseudo
-    .kr    { font-weight: bold } // Keyword.Reserved
-    .kt    { color: #458; font-weight: bold } // Keyword.Type
-    .m     { color: #099 } // Literal.Number
-    .s     { color: #d14 } // Literal.String
-    .na    { color: #008080 } // Name.Attribute
-    .nb    { color: #0086B3 } // Name.Builtin
-    .nc    { color: #458; font-weight: bold } // Name.Class
-    .no    { color: #008080 } // Name.Constant
-    .ni    { color: #800080 } // Name.Entity
-    .ne    { color: #900; font-weight: bold } // Name.Exception
-    .nf    { color: #900; font-weight: bold } // Name.Function
-    .nn    { color: #555 } // Name.Namespace
-    .nt    { color: #000080 } // Name.Tag
-    .nv    { color: #008080 } // Name.Variable
-    .ow    { font-weight: bold } // Operator.Word
-    .w     { color: #bbb } // Text.Whitespace
-    .mf    { color: #099 } // Literal.Number.Float
-    .mh    { color: #099 } // Literal.Number.Hex
-    .mi    { color: #099 } // Literal.Number.Integer
-    .mo    { color: #099 } // Literal.Number.Oct
-    .sb    { color: #d14 } // Literal.String.Backtick
-    .sc    { color: #d14 } // Literal.String.Char
-    .sd    { color: #d14 } // Literal.String.Doc
-    .s2    { color: #d14 } // Literal.String.Double
-    .se    { color: #d14 } // Literal.String.Escape
-    .sh    { color: #d14 } // Literal.String.Heredoc
-    .si    { color: #d14 } // Literal.String.Interpol
-    .sx    { color: #d14 } // Literal.String.Other
-    .sr    { color: #009926 } // Literal.String.Regex
-    .s1    { color: #d14 } // Literal.String.Single
-    .ss    { color: #990073 } // Literal.String.Symbol
-    .bp    { color: #999 } // Name.Builtin.Pseudo
-    .vc    { color: #008080 } // Name.Variable.Class
-    .vg    { color: #008080 } // Name.Variable.Global
-    .vi    { color: #008080 } // Name.Variable.Instance
-    .il    { color: #099 } // Literal.Number.Integer.Long
-}
+.highlight .hll { background-color: #d6d6d6 }
+.highlight  { background: #f5f5f5; color: #4d4d4c }
+.highlight .c { color: #8e908c } /* Comment */
+.highlight .err { color: #c82829 } /* Error */
+.highlight .k { color: #8959a8 } /* Keyword */
+.highlight .l { color: #f5871f } /* Literal */
+.highlight .n { color: #4d4d4c } /* Name */
+.highlight .o { color: #3e999f } /* Operator */
+.highlight .p { color: #4d4d4c } /* Punctuation */
+.highlight .cm { color: #8e908c } /* Comment.Multiline */
+.highlight .cp { color: #8e908c } /* Comment.Preproc */
+.highlight .c1 { color: #8e908c } /* Comment.Single */
+.highlight .cs { color: #8e908c } /* Comment.Special */
+.highlight .gd { color: #c82829 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gh { color: #4d4d4c; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #718c00 } /* Generic.Inserted */
+.highlight .gp { color: #8e908c; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #3e999f; font-weight: bold } /* Generic.Subheading */
+.highlight .kc { color: #8959a8 } /* Keyword.Constant */
+.highlight .kd { color: #8959a8 } /* Keyword.Declaration */
+.highlight .kn { color: #3e999f } /* Keyword.Namespace */
+.highlight .kp { color: #8959a8 } /* Keyword.Pseudo */
+.highlight .kr { color: #8959a8 } /* Keyword.Reserved */
+.highlight .kt { color: #917f0d } /* Keyword.Type */
+.highlight .ld { color: #718c00 } /* Literal.Date */
+.highlight .m { color: #f5871f } /* Literal.Number */
+.highlight .s { color: #718c00 } /* Literal.String */
+.highlight .na { color: #4271ae } /* Name.Attribute */
+.highlight .nb { color: #4d4d4c } /* Name.Builtin */
+.highlight .nc { color: #917f0d } /* Name.Class */
+.highlight .no { color: #c82829 } /* Name.Constant */
+.highlight .nd { color: #3e999f } /* Name.Decorator */
+.highlight .ni { color: #4d4d4c } /* Name.Entity */
+.highlight .ne { color: #c82829 } /* Name.Exception */
+.highlight .nf { color: #4271ae } /* Name.Function */
+.highlight .nl { color: #4d4d4c } /* Name.Label */
+.highlight .nn { color: #917f0d } /* Name.Namespace */
+.highlight .nx { color: #4271ae } /* Name.Other */
+.highlight .py { color: #4d4d4c } /* Name.Property */
+.highlight .nt { color: #3e999f } /* Name.Tag */
+.highlight .nv { color: #c82829 } /* Name.Variable */
+.highlight .ow { color: #3e999f } /* Operator.Word */
+.highlight .w { color: #4d4d4c } /* Text.Whitespace */
+.highlight .mf { color: #f5871f } /* Literal.Number.Float */
+.highlight .mh { color: #f5871f } /* Literal.Number.Hex */
+.highlight .mi { color: #f5871f } /* Literal.Number.Integer */
+.highlight .mo { color: #f5871f } /* Literal.Number.Oct */
+.highlight .sb { color: #718c00 } /* Literal.String.Backtick */
+.highlight .sc { color: #4d4d4c } /* Literal.String.Char */
+.highlight .sd { color: #8e908c } /* Literal.String.Doc */
+.highlight .s2 { color: #718c00 } /* Literal.String.Double */
+.highlight .se { color: #f5871f } /* Literal.String.Escape */
+.highlight .sh { color: #718c00 } /* Literal.String.Heredoc */
+.highlight .si { color: #f5871f } /* Literal.String.Interpol */
+.highlight .sx { color: #718c00 } /* Literal.String.Other */
+.highlight .sr { color: #718c00 } /* Literal.String.Regex */
+.highlight .s1 { color: #718c00 } /* Literal.String.Single */
+.highlight .ss { color: #718c00 } /* Literal.String.Symbol */
+.highlight .bp { color: #4d4d4c } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #c82829 } /* Name.Variable.Class */
+.highlight .vg { color: #c82829 } /* Name.Variable.Global */
+.highlight .vi { color: #c82829 } /* Name.Variable.Instance */
+.highlight .il { color: #f5871f } /* Literal.Number.Integer.Long */
diff --git a/css/accumulo.scss b/css/accumulo.scss
index a032242..86a8e81 100644
--- a/css/accumulo.scss
+++ b/css/accumulo.scss
@@ -41,6 +41,10 @@ body {
   font-size: 14px;
 }
 
+pre code {
+  font-size: 14px;
+}
+
 code {
   background-color: #f5f5f5;
   color: #555;

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 01/07: ACCUMULO-4734 Created basic tour structure on website (#32)

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit 10215fe34205112fe80c88c1c567d31b43af387a
Author: Mike Walch <mw...@apache.org>
AuthorDate: Thu Nov 2 17:05:31 2017 -0400

    ACCUMULO-4734 Created basic tour structure on website (#32)
    
    * Content still needs to be created
---
 _config.yml                |  7 ++++++
 _data/tour.yml             |  6 +++++
 _includes/nav.html         |  1 +
 _layouts/tour.html         | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 index.html                 |  6 +----
 tour/basic-read-write.md   |  5 +++++
 tour/batch-scanner.md      |  3 +++
 tour/conditional-writer.md |  3 +++
 tour/getting-started.md    |  5 +++++
 tour/index.md              | 29 ++++++++++++++++++++++++
 tour/using-iterators.md    |  3 +++
 11 files changed, 118 insertions(+), 5 deletions(-)

diff --git a/_config.yml b/_config.yml
index bcad220..3ad02d8 100644
--- a/_config.yml
+++ b/_config.yml
@@ -51,6 +51,13 @@ defaults:
       permalink: "/:categories/:title/"
   -
     scope:
+      path: "tour"
+      type: "pages"
+    values:
+      layout: "tour"
+      permalink: "/tour/:basename/"
+  -
+    scope:
       path: ""
       type: "docs-2-0"
     values:
diff --git a/_data/tour.yml b/_data/tour.yml
new file mode 100644
index 0000000..d84b5bb
--- /dev/null
+++ b/_data/tour.yml
@@ -0,0 +1,6 @@
+docs:
+ - getting-started
+ - basic-read-write
+ - batch-scanner
+ - conditional-writer
+ - using-iterators
diff --git a/_includes/nav.html b/_includes/nav.html
index f7891cf..c913889 100644
--- a/_includes/nav.html
+++ b/_includes/nav.html
@@ -13,6 +13,7 @@
     <div class="collapse navbar-collapse" id="navbar-items">
       <ul class="nav navbar-nav">
         <li class="nav-link"><a href="{{ site.baseurl }}/downloads">Download</a></li>
+        <li class="nav-link"><a href="{{ site.baseurl }}/tour">Tour</a></li>
         <li class="dropdown">
           <a class="dropdown-toggle" data-toggle="dropdown" href="#">Releases<span class="caret"></span></a>
           <ul class="dropdown-menu">
diff --git a/_layouts/tour.html b/_layouts/tour.html
new file mode 100644
index 0000000..eee83cb
--- /dev/null
+++ b/_layouts/tour.html
@@ -0,0 +1,55 @@
+---
+layout: default
+---
+{% assign tour_pages = site.data.tour.docs %}
+{% for p in tour_pages %}
+  {% assign doc_url = p | prepend: '/tour/' | append: '/' %}
+  {% if doc_url == page.url %}
+    {% assign tour_num = forloop.index %}
+    {% if forloop.first %}
+      {% assign previous = -1 %}
+    {% else %}
+      {% assign previous = forloop.index0 | minus: 1 %}
+      {% assign previous_page = tour_pages[previous] | prepend:"/tour/" | append:"/" %}
+    {% endif %}
+    {% if forloop.last %}
+      {% assign next = 0 %}
+    {% else %}
+      {% assign next = forloop.index0 | plus: 1 %}
+      {% assign next_page = tour_pages[next] | prepend:"/tour/" | append:"/" %}
+    {% endif %}
+  {% endif %}
+{% endfor %}
+
+<div id="tour-header">
+  <h2><a href="/tour/">Accumulo Tour</a>: {{ page.title }}</h2>
+  <p class="text-muted">Tour page {{ tour_num }} of {{ tour_pages.size }}</p>
+</div>
+<div id="tour-content">
+  {{ content }}
+</div>
+
+<script>
+document.body.onkeyup = function(e){
+{% if previous >= 0 %}
+if (e.keyCode == '37') { window.location = '{{previous_page}}'; }
+{% endif %}
+
+{% if next > 0 %}
+if (e.keyCode == '39') { window.location = '{{next_page}}'; }
+{% endif %}
+};
+</script>
+
+<div class="text-center">
+  <h2>
+    {% if previous >= 0 %}
+    <a href="{{ previous_page }}">&lt;</a>
+    {% endif %}
+
+    {{ tour_num }} / {{ tour_pages.size }}
+    {% if next > 0 %}
+    <a href="{{ next_page }}">&gt;</a>
+    {% endif %}
+  </h2>
+</div>
diff --git a/index.html b/index.html
index 2777df1..6713e2e 100644
--- a/index.html
+++ b/index.html
@@ -10,6 +10,7 @@ legal_notice: Apache Accumulo, Apache Hadoop, and the Accumulo project logo are
       <a class="btn btn-success" href="downloads/" role="button"><i class="fa fa-download fa-lg"></i> Download</a>
     </div>
     <p id="home-description">Apache Accumulo is a key/value store based on the design of Google's <a href="https://research.google.com/archive/bigtable.html">BigTable</a>. Accumulo stores its data in <a href="https://hadoop.apache.org">Apache Hadoop</a>'s HDFS and uses <a href="https://zookeeper.apache.org">Apache Zookeeper</a> for consensus. While many users interact directly with Accumulo, several <a href="/related-projects">open source projects</a> use Accumulo as their underlying store.</p>
+    <p id="home-description">To learn more about Accumulo, take the <a href="/tour">Accumulo tour</a>, read the <a href="/{{ site.latest_minor_release }}/accumulo_user_manual.html">user manual</a> and run the Accumulo <a href="https://github.com/apache/accumulo-examples">example code</a>. Also, join our <a href="/mailing_list">mailing list</a> and see how you can <a href="/get_involved">get involved</a>.
 
     <h3>Major Features</h3>
 
@@ -33,11 +34,6 @@ legal_notice: Apache Accumulo, Apache Hadoop, and the Accumulo project logo are
         <p>Accumulo has a stable <a href="/latest/apidocs">client API</a> that follows <a href="https://semver.org">semantic versioning</a>. Each Accumulo release goes through <a href="/features/#testing">extensive testing</a>.</p>
       </div>
     </div>
-    <div class="row">
-      <div class="col-md-12">  
-        <p id="home-description">To learn more about Accumulo, read the <a href="/{{ site.latest_minor_release }}/accumulo_user_manual.html">user manual</a> and run the Accumulo <a href="https://github.com/apache/accumulo-examples">example code</a>. Also, join our <a href="/mailing_list">mailing list</a> and see how you can <a href="/get_involved">get involved</a>.
-      </div>
-    </div>
   </div>
   <div class="col-md-4" id="sidebar">
     <div class="row">
diff --git a/tour/basic-read-write.md b/tour/basic-read-write.md
new file mode 100644
index 0000000..6eb1c5c
--- /dev/null
+++ b/tour/basic-read-write.md
@@ -0,0 +1,5 @@
+---
+title: Basic Reading & Writing
+---
+
+Talk about reading and writing.
diff --git a/tour/batch-scanner.md b/tour/batch-scanner.md
new file mode 100644
index 0000000..2eb8eb1
--- /dev/null
+++ b/tour/batch-scanner.md
@@ -0,0 +1,3 @@
+---
+title: Batch Scanner
+---
diff --git a/tour/conditional-writer.md b/tour/conditional-writer.md
new file mode 100644
index 0000000..83d468c
--- /dev/null
+++ b/tour/conditional-writer.md
@@ -0,0 +1,3 @@
+---
+title: Conditional Writer
+---
diff --git a/tour/getting-started.md b/tour/getting-started.md
new file mode 100644
index 0000000..0b076c1
--- /dev/null
+++ b/tour/getting-started.md
@@ -0,0 +1,5 @@
+---
+title: Getting Started
+---
+
+Talk about how to get started.
diff --git a/tour/index.md b/tour/index.md
new file mode 100644
index 0000000..9217637
--- /dev/null
+++ b/tour/index.md
@@ -0,0 +1,29 @@
+---
+title: Accumulo Tour
+layout: page
+permalink: /tour/
+skiph1fortitle: true
+---
+
+{% assign tour_pages = site.data.tour.docs %}
+{% assign first_url = tour_pages[0] | prepend: '/tour/' | append: '/' %}
+{% assign first_page = site.pages | where:'url',first_url | first %}
+
+Welcome to the Accumulo tour! The tour offers a hands on introduction to Accumulo, broken down into
+independent steps and an exercise. The exercise gives you a chance to apply what you have learned.
+The tour starts with a [{{ first_page.title }}]({{ first_url }}) page that will help you set up
+the exercise on your machine.
+
+We recommend following the tour in order. However, all pages are listed below for review.  When on a
+tour page, the left and right keys on the keyboard can be used to navigate. If you have any questions
+or suggestions while going through the tour, please send an email to our [mailing list][mlist]
+or [create an issue][issue].
+
+{% for p in tour_pages %}
+  {% assign doc_url = p | prepend: '/tour/' | append: '/' %}
+  {% assign link_to_page = site.pages | where:'url',doc_url | first %}
+  1. [{{ link_to_page.title }}]({{ doc_url }})
+{% endfor %}
+
+[mlist]: /mailing_list/
+[issue]: https://issues.apache.org/jira/projects/ACCUMULO
diff --git a/tour/using-iterators.md b/tour/using-iterators.md
new file mode 100644
index 0000000..7ae8ceb
--- /dev/null
+++ b/tour/using-iterators.md
@@ -0,0 +1,3 @@
+---
+title: Using Iterators
+---

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 05/07: ACCUMULO-4734 Changes from review of tour (#43)

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit f2250803cd248137b900705803e44b508fa4574a
Author: Mike Walch <mw...@apache.org>
AuthorDate: Fri Dec 1 14:58:34 2017 -0500

    ACCUMULO-4734 Changes from review of tour (#43)
---
 _config.yml                 |  1 +
 tour/authorizations-code.md | 91 ++++++++++++++++++++++++---------------------
 tour/authorizations.md      | 47 ++++++++++++-----------
 tour/basic-read-write.md    | 73 +++++++++++++++++++-----------------
 tour/batch-scanner-code.md  | 75 +++++++++++++++++++++----------------
 tour/batch-scanner.md       | 49 ++++++++++++------------
 tour/data-model-code.md     | 78 ++++++++++++++++++++------------------
 tour/getting-started.md     | 16 ++++----
 tour/ranges-splits.md       | 17 +++++----
 9 files changed, 241 insertions(+), 206 deletions(-)

diff --git a/_config.yml b/_config.yml
index 3ad02d8..3a2ab10 100644
--- a/_config.yml
+++ b/_config.yml
@@ -17,6 +17,7 @@ exclude: [vendor]
 latest_minor_release: 1.8
 latest_release: 1.8.1
 num_home_posts: 5
+javadoc_core: "https://static.javadoc.io/org.apache.accumulo/accumulo-core/1.8.1"
 
 # Build settings
 markdown: kramdown
diff --git a/tour/authorizations-code.md b/tour/authorizations-code.md
index 04ea47b..9858780 100644
--- a/tour/authorizations-code.md
+++ b/tour/authorizations-code.md
@@ -1,64 +1,69 @@
 ---
 title: Authorizations Code
 ---
+
+Below is a solution for the exercise.
+
 ```java
-        // start writing your code here
-        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
-        Connector conn = mac.getConnector("root", "tourguide");
-        conn.tableOperations().create("GothamPD");
+static void exercise(MiniAccumuloCluster mac) throws Exception {
+    // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+    Connector conn = mac.getConnector("root", "tourguide");
+    conn.tableOperations().create("GothamPD");
 
-        // Create a "secretIdentity" authorization & visibility
-        final String secId = "secretIdentity";
-        Authorizations auths = new Authorizations(secId);
-        ColumnVisibility visibility = new ColumnVisibility(secId);
+    // Create a "secretId" authorization & visibility
+    final String secretId = "secretId";
+    Authorizations auths = new Authorizations(secretId);
+    ColumnVisibility colVis = new ColumnVisibility(secretId);
 
-        // Create a user with the "secretIdentity" authorization and grant him read permissions on our table
-        conn.securityOperations().createLocalUser("commissioner", new PasswordToken("gordanrocks"));
-        conn.securityOperations().changeUserAuthorizations("commissioner", auths);
-        conn.securityOperations().grantTablePermission("commissioner", "GothamPD", TablePermission.READ);
+    // Create a user with the "secretId" authorization and grant him read permissions on our table
+    conn.securityOperations().createLocalUser("commissioner", new PasswordToken("gordanrocks"));
+    conn.securityOperations().changeUserAuthorizations("commissioner", auths);
+    conn.securityOperations().grantTablePermission("commissioner", "GothamPD", TablePermission.READ);
 
-        // Create 3 Mutation objects, securing the proper columns.
-        Mutation mutation1 = new Mutation("id0001");
-        mutation1.put("hero","alias", "Batman");
-        mutation1.put("hero","name", visibility, "Bruce Wayne");
-        mutation1.put("hero","wearsCape?", "true");
-        Mutation mutation2 = new Mutation("id0002");
-        mutation2.put("hero","alias", "Robin");
-        mutation2.put("hero","name", visibility,"Dick Grayson");
-        mutation2.put("hero","wearsCape?", "true");
-        Mutation mutation3 = new Mutation("id0003");
-        mutation3.put("villain","alias", "Joker");
-        mutation3.put("villain","name", "Unknown");
-        mutation3.put("villain","wearsCape?", "false");
+    // Create 3 Mutation objects, securing the proper columns.
+    Mutation mutation1 = new Mutation("id0001");
+    mutation1.put("hero","alias", "Batman");
+    mutation1.put("hero","name", colVis, "Bruce Wayne");
+    mutation1.put("hero","wearsCape?", "true");
+    Mutation mutation2 = new Mutation("id0002");
+    mutation2.put("hero","alias", "Robin");
+    mutation2.put("hero","name", colVis,"Dick Grayson");
+    mutation2.put("hero","wearsCape?", "true");
+    Mutation mutation3 = new Mutation("id0003");
+    mutation3.put("villain","alias", "Joker");
+    mutation3.put("villain","name", "Unknown");
+    mutation3.put("villain","wearsCape?", "false");
 
-        // Create a BatchWriter to the GothamPD table and add your mutations to it.
-        // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
-        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
-            writer.addMutation(mutation1);
-            writer.addMutation(mutation2);
-            writer.addMutation(mutation3);
-        }
+    // Create a BatchWriter to the GothamPD table and add your mutations to it.
+    // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
+    try (BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+        writer.addMutation(mutation1);
+        writer.addMutation(mutation2);
+        writer.addMutation(mutation3);
+    }
 
-        // Read and print all rows of the commissioner can see. Pass Scanner proper authorizations
-        Connector commishConn = mac.getConnector("commissioner", "gordanrocks");
-        try(Scanner scan = commishConn.createScanner("GothamPD", auths)) {
-            System.out.println("Gotham Police Department Persons of Interest:");
-            for (Map.Entry<Key, Value> entry : scan) {
-                System.out.printf("Key : %-60s  Value : %s\n", entry.getKey(), entry.getValue());
-            }
+    // Read and print all rows of the commissioner can see. Pass Scanner proper authorizations
+    Connector commishConn = mac.getConnector("commissioner", "gordanrocks");
+    try (Scanner scan = commishConn.createScanner("GothamPD", auths)) {
+        System.out.println("Gotham Police Department Persons of Interest:");
+        for (Map.Entry<Key, Value> entry : scan) {
+            System.out.printf("Key : %-60s  Value : %s\n", entry.getKey(), entry.getValue());
         }
+    }
+}
 ```
 
-The code above will print (timestamp will differ):
+The solution above will print (timestamp will differ):
+
 ```commandline
 Gotham Police Department Persons of Interest:
 Key : id0001 hero:alias [] 1511900180231 false                      Value : Batman
-Key : id0001 hero:name [secretIdentity] 1511900180231 false         Value : Bruce Wayne
+Key : id0001 hero:name [secretId] 1511900180231 false               Value : Bruce Wayne
 Key : id0001 hero:wearsCape? [] 1511900180231 false                 Value : true
 Key : id0002 hero:alias [] 1511900180231 false                      Value : Robin
-Key : id0002 hero:name [secretIdentity] 1511900180231 false         Value : Dick Grayson
+Key : id0002 hero:name [secretId] 1511900180231 false               Value : Dick Grayson
 Key : id0002 hero:wearsCape? [] 1511900180231 false                 Value : true
 Key : id0003 villain:alias [] 1511900180231 false                   Value : Joker
 Key : id0003 villain:name [] 1511900180231 false                    Value : Unknown
 Key : id0003 villain:wearsCape? [] 1511900180231 false              Value : false
-```
\ No newline at end of file
+```
diff --git a/tour/authorizations.md b/tour/authorizations.md
index ac45ffe..8dbb8c8 100644
--- a/tour/authorizations.md
+++ b/tour/authorizations.md
@@ -1,46 +1,51 @@
 ---
 title: Authorizations
 ---
-Authorizations are a set of Strings that enable a user to read protected data. A column visibility is a boolean expression 
-that is evaluated using the authorizations provided by a scanner. If it evaluates to true, then the data is visible. 
+
+[Authorizations] are a set of Strings that enable a user to read protected data. Users are granted authorizations
+and choose which ones to use when scanning a table. The chosen authorizations are evaluated against the [ColumnVisibility]
+of each Accumulo key in the scan. If the boolean expression of the ColumnVisibility evaluates to true, the data will be
+visible to the user.
 
 For example:
-* Bob scans with authorizations = { IT, User }
-* Tina scans with authorizations = { Admin, IT, User }
-* Row1:family1:qualifier1 has Visibility = { Admin && IT && User }
-* Bob will **not** see Row1:family1:qualifier1
-* Tina will see Row1:family1:qualifier1
+* Bob has authorizations `User, Manager`
+* Tina has authorizations `User, Admin`
+* The key `row1:family1:qualifier1` has visibility `Admin && User`
+* When Bob scans with all of his authorizations, he will **not** see `row1:family1:qualifier1`
+* When Tina scans with all of her authorizations, she will see `row1:family1:qualifier1`
 
 We now want to secure our secret identities of the heroes so that only users with the proper authorizations can read their names.
 
 1. Using the code from the previous exercise, add the following to the beginning of the _exercise_ method (after we get the Connector).
 ```java
-        // Create a "secretIdentity" authorization & visibility
-        final String secId = "secretIdentity";
-        Authorizations auths = new Authorizations(secId);
-        ColumnVisibility visibility = new ColumnVisibility(secId);
+        // Create a "secretId" authorization & visibility
+        final String secretId = "secretId";
+        Authorizations auths = new Authorizations(secretId);
+        ColumnVisibility colVis = new ColumnVisibility(secretId);
         
-        // Create a user with the "secretIdentity" authorization and grant him read permissions on our table
+        // Create a user with the "secretId" authorization and grant him read permissions on our table
         conn.securityOperations().createLocalUser("commissioner", new PasswordToken("gordanrocks"));
         conn.securityOperations().changeUserAuthorizations("commissioner", auths);
         conn.securityOperations().grantTablePermission("commissioner", "GothamPD", TablePermission.READ);
-``` 
+```
 
-2. The Mutation API allows you to set the visibility on a column. Find the proper method for setting a column visibility in 
-the [Mutation API][mut] and modify the code so the visibility created above will secure the two "name" columns. 
+2. The [Mutation] API allows you to set the `secretId` visibility on a column. Find the proper method for setting a column visibility in
+the Mutation API and modify the code so the `colVis` variable created above secures the "name" columns.
 
 3. Build and run.  What data do you see?
-* You should see all of the data except the secret identities of Batman and Robin.  This is because the Scanner was created
- from the root user Connector.  
-* Replace the _Authorizations.EMPTY_ in the Scanner with the _auths_ created above and run it again.
+* You should see all of the data except the secret identities of Batman and Robin. This is because the Scanner was created
+ from the root user which doesn't have the `secretId` authorization.
+* Replace the `Authorizations.EMPTY` in the Scanner with the `auths` variable created above and run it again.
 * This should result in an error since the root user doesn't have the authorizations we tried to pass to the Scanner.
 
 4. Get a connector for the "commissioner" and from it create a Scanner with the authorizations needed to view the secret identities.
 
 5. Build and run.  You should see all the rows in the GothamPD table printed, including these secured key/value pairs:
 ```commandline
-Key : id0001 hero:name [secretIdentity] 1511900180231 false         Value : Bruce Wayne
-Key : id0002 hero:name [secretIdentity] 1511900180231 false         Value : Dick Grayson
+Key : id0001 hero:name [secretId] 1511900180231 false         Value : Bruce Wayne
+Key : id0002 hero:name [secretId] 1511900180231 false         Value : Dick Grayson
 ```
 
-[mut]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/data/Mutation.html
\ No newline at end of file
+[Authorizations]: {{ site.javadoc_core }}/org/apache/accumulo/core/security/Authorizations.html
+[ColumnVisibility]: {{ site.javadoc_core }}/org/apache/accumulo/core/security/ColumnVisibility.html
+[Mutation]: {{ site.javadoc_core }}/org/apache/accumulo/core/data/Mutation.html
diff --git a/tour/basic-read-write.md b/tour/basic-read-write.md
index a9f1451..028bbf0 100644
--- a/tour/basic-read-write.md
+++ b/tour/basic-read-write.md
@@ -1,53 +1,58 @@
 ---
 title: Writing and Reading
 ---
-Accumulo is a big data key/value store.  Writing data to Accumulo is flexible and fast.  Like any database, Accumulo stores
-data in tables and rows.  Each row in an Accumulo table can hold many key/value pairs.  
+Accumulo is a big key/value store.  Writing data to Accumulo is flexible and fast.  Like any database, Accumulo stores
+data in tables and rows.  Each row in an Accumulo table can hold many key/value pairs. Our next exercise shows how to
+write and read from a table.
 
-Here are the steps for writing to a table and then reading from it. Copy and paste the code below into the _exercise_  method.  Note each step is commented. 
 ```java
-        // 1. Connect to Mini Accumulo as the root user and create a table called "GothamPD".
-        Connector conn = mac.getConnector("root", "tourguide");
-        conn.tableOperations().create("GothamPD");
-
-        // 2. Create a Mutation object to hold all changes to a row in a table.  Each row has a unique row ID.
-        Mutation mutation = new Mutation("id0001");
-
-        // 3. Create key/value pairs for Batman.  Put them in the "hero" family.
-        mutation.put("hero","alias", "Batman");
-        mutation.put("hero","name", "Bruce Wayne");
-        mutation.put("hero","wearsCape?", "true");
-
-        // 4. Create a BatchWriter to the GothamPD table and add your mutation to it.  Try w/ resources will close for us.
-        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
-            writer.addMutation(mutation);
-        }
-
-        // 5. Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
-        try(Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
-            System.out.println("Gotham Police Department Persons of Interest:");
-            // A Scanner is an extension of java.lang.Iterable so behaves just like one.
-            for (Map.Entry<Key, Value> entry : scan) {
-                System.out.println("Key:" + entry.getKey());
-                System.out.println("Value:" + entry.getValue());
-            }
+static void exercise(MiniAccumuloCluster mac) {
+    // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+    Connector conn = mac.getConnector("root", "tourguide");
+    conn.tableOperations().create("GothamPD");
+
+    // Create a Mutation object to hold all changes to a row in a table.  Each row has a unique row ID.
+    Mutation mutation = new Mutation("id0001");
+
+    // Create key/value pairs for Batman.  Put them in the "hero" family.
+    mutation.put("hero","alias", "Batman");
+    mutation.put("hero","name", "Bruce Wayne");
+    mutation.put("hero","wearsCape?", "true");
+
+    // Create a BatchWriter to the GothamPD table and add your mutation to it. Try w/ resources will close for us.
+    try (BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+        writer.addMutation(mutation);
+    }
+
+    // Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
+    try (Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
+        System.out.println("Gotham Police Department Persons of Interest:");
+        // A Scanner is an extension of java.lang.Iterable so behaves just like one.
+        for (Map.Entry<Key, Value> entry : scan) {
+            System.out.printf("Key : %-50s  Value : %s\n", entry.getKey(), entry.getValue());
         }
+    }
+}
 ```
 
-Build and run your code
+Copy this code into your `exercise` method and run it using the command below.
+
 ```commandline
 mvn -q clean compile exec:java
 ``` 
 
-Good job!  That is all it takes to write and read from Accumulo.  
+Good job! That is all it takes to write and read from Accumulo.
 
 Notice a lot of other information was printed from the Keys we created. Accumulo is flexible because hidden within its 
-Key is a rich data model that can be broken up into different parts.  We will cover the [Data Model][dmodel] in the next lesson.
+[Key] is a rich data model that can be broken up into different parts.  We will cover the [Data Model][dmodel] in the next lesson.
+
+### But wait... I thought Accumulo was all about Security?
 
-### But wait... I thought Accumulo was all about Security?  
-Spoiler Alert: it is!  Did you notice the _Authorizations.EMPTY_ we passed to the Scanner on step 5?  The data
+Spoiler Alert: it is!  Did you notice the `Authorizations.EMPTY` we passed in when creating a [Scanner]?  The data
 we created in this first lesson was not secured with Authorizations so the Scanner didn't require any Authorizations 
 to read it.  More to come later in the [Authorizations][auths] lesson! 
 
 [dmodel]: /tour/data-model
-[auths]: /tour/authorizations
\ No newline at end of file
+[auths]: /tour/authorizations
+[Key]: {{ site.javadoc_core }}/org/apache/accumulo/core/data/Key.html
+[Scanner]: {{ site.javadoc_core }}/org/apache/accumulo/core/client/Scanner.html
diff --git a/tour/batch-scanner-code.md b/tour/batch-scanner-code.md
index bb06de4..bc7722c 100644
--- a/tour/batch-scanner-code.md
+++ b/tour/batch-scanner-code.md
@@ -1,42 +1,51 @@
 ---
 title: Batch Scanner Code
 ---
+
+Below is a solution to the exercise.
+
 ```java
-        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
-        Connector conn = mac.getConnector("root", "tourguide");
-        conn.tableOperations().create("GothamPD");
-
-        // Generate 10,000 rows of henchman data
-        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
-            for(int i = 0; i < 10_000; i++) {
-                Mutation m = new Mutation(String.format("id%04d", i));
-                m.put("villain", "alias", "henchman" + i);
-                m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
-                m.put("villain", "wearsCape?", "false");
-                writer.addMutation(m);
-            }
+static void exercise(MiniAccumuloCluster mac) throws Exception {
+    // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+    Connector conn = mac.getConnector("root", "tourguide");
+    conn.tableOperations().create("GothamPD");
+
+    // Generate 10,000 rows of henchman data
+    try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+        for(int i = 0; i < 10_000; i++) {
+            Mutation m = new Mutation(String.format("id%04d", i));
+            m.put("villain", "alias", "henchman" + i);
+            m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
+            m.put("villain", "wearsCape?", "false");
+            writer.addMutation(m);
         }
+    }
+
+    // 1. Create a BatchScanner with 5 query threads
+    try(BatchScanner batchScanner = conn.createBatchScanner("GothamPD", Authorizations.EMPTY, 5)) {
+        // 2. Create a collection of 2 sample ranges and set it to the batchScanner
+        List ranges = new ArrayList<Range>();
+        ranges.add(new Range("id1000", "id1999"));
+        ranges.add(new Range("id9000", "id9999"));
+        batchScanner.setRanges(ranges);
 
-        // 1. Create a BatchScanner with 5 query threads
-        try(BatchScanner batchScanner = conn.createBatchScanner("GothamPD", Authorizations.EMPTY, 5)) {
-            // 2. Create a collection of 2 sample ranges and set it to the batchScanner
-            List ranges = new ArrayList<Range>();
-            ranges.add(new Range("id1000", "id1999"));
-            ranges.add(new Range("id9000", "id9999"));
-            batchScanner.setRanges(ranges);
-
-            // 3. Fetch just the columns we want
-            batchScanner.fetchColumn(new Text("villain"), new Text("yearsOfService"));
-
-            // 4. Calculate average years of service
-            Long totalYears = 0L;
-            Long entriesRead = 0L;
-            for (Map.Entry<Key, Value> entry : batchScanner) {
-                totalYears += Long.valueOf(entry.getValue().toString());
-                entriesRead++;
-            }
-            System.out.println("Out of " + entriesRead + " entries, average years of a henchman: " + totalYears / entriesRead);
+        // 3. Fetch just the columns we want
+        batchScanner.fetchColumn(new Text("villain"), new Text("yearsOfService"));
+
+        // 4. Calculate average years of service
+        Long totalYears = 0L;
+        Long entriesRead = 0L;
+        for (Map.Entry<Key, Value> entry : batchScanner) {
+            totalYears += Long.valueOf(entry.getValue().toString());
+            entriesRead++;
         }
+        System.out.println("The average years of service of " + entriesRead + " villians is " + totalYears / entriesRead);
+    }
+}
 ```
 
-The average years of a henchman should be 24.
\ No newline at end of file
+Running the solution above should print output similar to below:
+
+```
+The average years of service of 2000 villians is 24
+```
diff --git a/tour/batch-scanner.md b/tour/batch-scanner.md
index 21a15f3..a388ce6 100644
--- a/tour/batch-scanner.md
+++ b/tour/batch-scanner.md
@@ -4,35 +4,38 @@ title: Batch Scanner
 Running on a single thread, a Scanner will retrieve a single Range of data and return Keys in sorted order. A [BatchScanner] 
 will retrieve multiple Ranges of data using multiple threads.  A BatchScanner can be more efficient but does not guarantee Keys will be returned in sorted order.
 
-For this exercise, we need to generate a bunch of data to test BatchScanner.  Copy the code below into the _exercise_ method.
+For this exercise, we need to generate a bunch of data to test BatchScanner.  Copy the code below into your `exercise` method.
 ```java
-        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
-        Connector conn = mac.getConnector("root", "tourguide");
-        conn.tableOperations().create("GothamPD");
-
-        // Generate 10,000 rows of henchman data, each with a different number yearsOfService
-        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
-            for(int i = 0; i < 10_000; i++) {
-                Mutation m = new Mutation(String.format("id%04d", i));
-                m.put("villain", "alias", "henchman" + i);
-                m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
-                m.put("villain", "wearsCape?", "false");
-                writer.addMutation(m);
-            }
+static void exercise(MiniAccumuloCluster mac) throws Exception {
+    // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+    Connector conn = mac.getConnector("root", "tourguide");
+    conn.tableOperations().create("GothamPD");
+
+    // Generate 10,000 rows of henchman data, each with a different number yearsOfService
+    try (BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+        for (int i = 0; i < 10_000; i++) {
+            Mutation m = new Mutation(String.format("id%04d", i));
+            m.put("villain", "alias", "henchman" + i);
+            m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
+            m.put("villain", "wearsCape?", "false");
+            writer.addMutation(m);
         }
+    }
+}
 ```
-We want to calculate the average years of service of a sample of the henchman data.  A BatchScanner would be good for this task because we 
-don't need the returned keys to be sorted.  Follow these steps to efficiently scan the table with 10,000 entries.
+
+We want to calculate the average years of service from a sample of 2000 villians. A BatchScanner would be good for this task because we
+don't need the returned keys to be sorted. Follow these steps to efficiently scan the table with 10,000 entries.
 
 1. After the above code, create a BatchScanner with 5 query threads.  Similar to a Scanner, use the [createBatchScanner] method.
 
-2. Create an ArrayList of 2 sample Ranges (id1000 to id1999 and id9000 to id9999) and set the ranges of the BatchScanner using _setRanges_.
+2. Create an ArrayList of 2 sample Ranges (`id1000` to `id1999` and `id9000` to `id9999`) and set the ranges of the [BatchScanner] using `setRanges`.
 
-3. We can make the scan more efficient by only bringing back the columns we want.  Use [fetchColumn] to get the "villain" family 
-and "yearsOfService" qualifier.
+3. We can make the scan more efficient by only bringing back the columns we want.  Use [fetchColumn] to get the `villain` family
+and `yearsOfService` qualifier.
 
-4. Finally, use the BatchScanner to calculate the average years of service of the henchmen.
+4. Finally, use the BatchScanner to calculate the average years of service of 2000 villians.
 
-[BatchScanner]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/BatchScanner.html
-[createBatchScanner]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/Connector.html#createBatchScanner(java.lang.String,%20org.apache.accumulo.core.security.Authorizations,%20int)
-[fetchColumn]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/ScannerBase.html#fetchColumn(org.apache.hadoop.io.Text,%20org.apache.hadoop.io.Text)
\ No newline at end of file
+[BatchScanner]: {{ site.javadoc_core }}/org/apache/accumulo/core/client/BatchScanner.html
+[createBatchScanner]: {{ site.javadoc_core }}/org/apache/accumulo/core/client/Connector.html#createBatchScanner(java.lang.String,%20org.apache.accumulo.core.security.Authorizations,%20int)
+[fetchColumn]: {{ site.javadoc_core }}/org/apache/accumulo/core/client/ScannerBase.html#fetchColumn(org.apache.hadoop.io.Text,%20org.apache.hadoop.io.Text)
diff --git a/tour/data-model-code.md b/tour/data-model-code.md
index 4a0d0e8..31c9da5 100644
--- a/tour/data-model-code.md
+++ b/tour/data-model-code.md
@@ -2,45 +2,49 @@
 title: Data Model Code
 ---
 
+Below is the solution for the exercise.
+
 ```java
-        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
-        Connector conn = mac.getConnector("root", "tourguide");
-        conn.tableOperations().create("GothamPD");
-
-        // Create a row for Batman
-        Mutation mutation1 = new Mutation("id0001");
-        mutation1.put("hero","alias", "Batman");
-        mutation1.put("hero","name", "Bruce Wayne");
-        mutation1.put("hero","wearsCape?", "true");
-
-        // Create a row for Robin
-        Mutation mutation2 = new Mutation("id0002");
-        mutation2.put("hero","alias", "Robin");
-        mutation2.put("hero","name", "Dick Grayson");
-        mutation2.put("hero","wearsCape?", "true");
-
-        // Create a row for Joker
-        Mutation mutation3 = new Mutation("id0003");
-        mutation3.put("villain","alias", "Joker");
-        mutation3.put("villain","name", "Unknown");
-        mutation3.put("villain","wearsCape?", "false");
-
-        // Create a BatchWriter to the GothamPD table and add your mutations to it.  
-        // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
-        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
-            writer.addMutation(mutation1);
-            writer.addMutation(mutation2);
-            writer.addMutation(mutation3);
-        }
+static void exercise(MiniAccumuloCluster mac) {
+    // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+    Connector conn = mac.getConnector("root", "tourguide");
+    conn.tableOperations().create("GothamPD");
+
+    // Create a row for Batman
+    Mutation mutation1 = new Mutation("id0001");
+    mutation1.put("hero","alias", "Batman");
+    mutation1.put("hero","name", "Bruce Wayne");
+    mutation1.put("hero","wearsCape?", "true");
+
+    // Create a row for Robin
+    Mutation mutation2 = new Mutation("id0002");
+    mutation2.put("hero","alias", "Robin");
+    mutation2.put("hero","name", "Dick Grayson");
+    mutation2.put("hero","wearsCape?", "true");
+
+    // Create a row for Joker
+    Mutation mutation3 = new Mutation("id0003");
+    mutation3.put("villain","alias", "Joker");
+    mutation3.put("villain","name", "Unknown");
+    mutation3.put("villain","wearsCape?", "false");
+
+    // Create a BatchWriter to the GothamPD table and add your mutations to it.
+    // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
+    try (BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+        writer.addMutation(mutation1);
+        writer.addMutation(mutation2);
+        writer.addMutation(mutation3);
+    }
 
-        // Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
-        try(Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
-            System.out.println("Gotham Police Department Persons of Interest:");
-            // A Scanner is an extension of java.lang.Iterable so behaves just like one.
-            for (Map.Entry<Key, Value> entry : scan) {
-                System.out.printf("Key : %30s  Value : %s\n", entry.getKey(), entry.getValue());
-            }
+    // Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
+    try (Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
+        System.out.println("Gotham Police Department Persons of Interest:");
+        // A Scanner is an extension of java.lang.Iterable so behaves just like one.
+        for (Map.Entry<Key, Value> entry : scan) {
+            System.out.printf("Key : %-50s  Value : %s\n", entry.getKey(), entry.getValue());
         }
+    }
+}
 ```
 
 The code above will print (timestamp will differ):
@@ -55,4 +59,4 @@ Key : id0002 hero:wearsCape? [] 1511306370025 false       Value : true
 Key : id0003 villain:alias [] 1511306370025 false         Value : Joker
 Key : id0003 villain:name [] 1511306370025 false          Value : Unknown
 Key : id0003 villain:wearsCape? [] 1511306370025 false    Value : false
-``` 
\ No newline at end of file
+``` 
diff --git a/tour/getting-started.md b/tour/getting-started.md
index 50bc980..b443cb4 100644
--- a/tour/getting-started.md
+++ b/tour/getting-started.md
@@ -4,7 +4,7 @@ title: Getting Started
 
 First make sure you have Java, Maven and Git installed on your machine.  Oh you are already rocking? OK let's go!
 
-1. Clone the tour onto your machine:
+1. Clone the code repository for the tour onto your machine:
 ```commandline
 git clone -b tour https://github.com/apache/accumulo-website.git tour
 cd tour
@@ -15,15 +15,15 @@ vim ./src/main/java/tour/Main.java
 ```
 Notice the main method creates a MiniAccumuloCluster with a root password of "tourguide".  MiniAccumuloCluster is a mini
 version of Accumulo that runs on your local filesystem.  It should only be used for development purposes but will work
-great here on the tour.  Files and logs used by MiniAccumuloCluster can be seen in the _target/mac######_ directory. 
+great here on the tour.  Files and logs used by MiniAccumuloCluster can be seen in the `target/mac######` directory. 
 
 3. Modify the _exercise_ method to print a hello message. You will put your code in this method for each lesson.
-```java
-private static void exercise(MiniAccumuloCluster mac) {
-    // start writing your code here
-    System.out.println("Hello world");
-}
-```
+    ```java
+    static void exercise(MiniAccumuloCluster mac) {
+        // start writing your code here
+        System.out.println("Hello world");
+    }
+    ```
 4. Build and run to make sure everything is cool.
 ```commandline
 mvn -q clean compile exec:java
diff --git a/tour/ranges-splits.md b/tour/ranges-splits.md
index 3f3bb41..07386d4 100644
--- a/tour/ranges-splits.md
+++ b/tour/ranges-splits.md
@@ -2,21 +2,23 @@
 title: Ranges and Splits
 ---
 
-A Range is a specified group of Keys. There are many different ways to create a Range.  Here are a few examples:
+A [Range] is a specified group of Keys. There are many different ways to create a Range.  Here are a few examples:
+
 ```java
-new Range(Key startKey, Key endKey)  // Creates a range from startKey inclusive to endKey inclusive.
-new Range(CharSequence row)  // Creates a range that covers an entire row.
-new Range(CharSequence startRow, CharSequence endRow) // Creates a range from startRow inclusive to endRow inclusive.
+Range r1 = new Range(startKey, endKey);  // Creates a range from startKey inclusive to endKey inclusive.
+Range r2 = new Range(row);               // Creates a range that covers an entire row.
+Range r3 = new Range(startRow, endRow);  // Creates a range from startRow inclusive to endRow inclusive.
 ```
 
 A Scanner by default will scan all Keys in a table but this can be inefficient. It is a good practice to set a range on a Scanner.
+
 ```java
 scanner.setRange(new Range("id0000", "id0010"));  // returns rows from id0000 to id0010
 ```
 
 As your data grows larger, Accumulo will split tables into smaller pieces called Tablets.  Tablets can then be distributed across multiple Tablet Servers.  
-By default a table will get split into Tablets on row boundaries, guaranteeing an entire row to be on one Tablet Server.  We have the ability to 
-tell Accumulo where to split tables by setting split points. This is done using _addSplits_ in the [TableOperations] API.  The image below 
+By default, a table will get split into Tablets on row boundaries, guaranteeing an entire row to be on one Tablet Server.  We have the ability to 
+tell Accumulo where to split tables by setting split points. This is done using `addSplits` in the [TableOperations] API.  The image below 
 demonstrates how Accumulo splits data.  
 
 ![data distribution]({{ site.url }}/images/docs/data_distribution.png)
@@ -33,4 +35,5 @@ Knowing these terms are critical when working closely with Accumulo.  Iterators
 When working with large amounts of data across many Tablet Servers, a simple Scanner might not do the trick. Next lesson we learn about the power of 
 the multi-threaded BatchScanner!  
 
-[TableOperations]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/admin/TableOperations.html
+[Range]: {{ site.javadoc_core }}/org/apache/accumulo/core/data/Range.html
+[TableOperations]: {{ site.javadoc_core }}/org/apache/accumulo/core/client/admin/TableOperations.html

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 06/07: Removed empty tour pages and fixed home page

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit d9658c556699e26697ff69eaae632d52dbf23992
Author: Mike Walch <mw...@apache.org>
AuthorDate: Wed Dec 6 10:53:28 2017 -0500

    Removed empty tour pages and fixed home page
---
 _data/tour.yml | 2 --
 index.html     | 2 +-
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/_data/tour.yml b/_data/tour.yml
index c7de9ed..c15d2c1 100644
--- a/_data/tour.yml
+++ b/_data/tour.yml
@@ -8,5 +8,3 @@ docs:
  - ranges-splits
  - batch-scanner
  - batch-scanner-code
- - conditional-writer
- - using-iterators
diff --git a/index.html b/index.html
index 6713e2e..f902a80 100644
--- a/index.html
+++ b/index.html
@@ -10,7 +10,7 @@ legal_notice: Apache Accumulo, Apache Hadoop, and the Accumulo project logo are
       <a class="btn btn-success" href="downloads/" role="button"><i class="fa fa-download fa-lg"></i> Download</a>
     </div>
     <p id="home-description">Apache Accumulo is a key/value store based on the design of Google's <a href="https://research.google.com/archive/bigtable.html">BigTable</a>. Accumulo stores its data in <a href="https://hadoop.apache.org">Apache Hadoop</a>'s HDFS and uses <a href="https://zookeeper.apache.org">Apache Zookeeper</a> for consensus. While many users interact directly with Accumulo, several <a href="/related-projects">open source projects</a> use Accumulo as their underlying store.</p>
-    <p id="home-description">To learn more about Accumulo, take the <a href="/tour">Accumulo tour</a>, read the <a href="/{{ site.latest_minor_release }}/accumulo_user_manual.html">user manual</a> and run the Accumulo <a href="https://github.com/apache/accumulo-examples">example code</a>. Also, join our <a href="/mailing_list">mailing list</a> and see how you can <a href="/get_involved">get involved</a>.
+    <p id="home-description">To learn more about Accumulo, take the <a href="/tour">Accumulo tour</a>, read the <a href="/{{ site.latest_minor_release }}/accumulo_user_manual.html">user manual</a> and run the Accumulo <a href="https://github.com/apache/accumulo-examples">example code</a>. Feel free to <a href="/contact-us">contact us</a> if you have any questions.
 
     <h3>Major Features</h3>
 

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 07/07: updated authorizations in tour

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit 3376d943b71e9700b82f75d14dae256a08ab040c
Author: Mike Walch <mw...@apache.org>
AuthorDate: Wed Dec 6 11:03:30 2017 -0500

    updated authorizations in tour
---
 tour/authorizations.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tour/authorizations.md b/tour/authorizations.md
index 8dbb8c8..5b66c89 100644
--- a/tour/authorizations.md
+++ b/tour/authorizations.md
@@ -8,9 +8,9 @@ of each Accumulo key in the scan. If the boolean expression of the ColumnVisibil
 visible to the user.
 
 For example:
-* Bob has authorizations `User, Manager`
-* Tina has authorizations `User, Admin`
-* The key `row1:family1:qualifier1` has visibility `Admin && User`
+* Bob has authorizations `product, sales`
+* Tina has authorizations `sales, employee`
+* The key `row1:family1:qualifier1` has visibility `sales && employee`
 * When Bob scans with all of his authorizations, he will **not** see `row1:family1:qualifier1`
 * When Tina scans with all of her authorizations, she will see `row1:family1:qualifier1`
 

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.

[accumulo-website] 02/07: ACCUMULO-4734 Create a few exercises for the tour

Posted by mw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git

commit 8aac928989901c3cb84941ee0b41bcaacf943e23
Author: Mike Miller <mm...@apache.org>
AuthorDate: Tue Nov 28 15:25:03 2017 -0500

    ACCUMULO-4734 Create a few exercises for the tour
---
 _data/tour.yml              |  6 +++++
 tour/authorizations-code.md | 64 +++++++++++++++++++++++++++++++++++++++++++++
 tour/authorizations.md      | 46 ++++++++++++++++++++++++++++++++
 tour/basic-read-write.md    | 52 ++++++++++++++++++++++++++++++++++--
 tour/batch-scanner-code.md  | 42 +++++++++++++++++++++++++++++
 tour/batch-scanner.md       | 35 +++++++++++++++++++++++++
 tour/data-model-code.md     | 58 ++++++++++++++++++++++++++++++++++++++++
 tour/data-model.md          | 28 ++++++++++++++++++++
 tour/getting-started.md     | 29 +++++++++++++++++++-
 tour/index.md               | 11 ++++----
 tour/ranges-splits.md       | 36 +++++++++++++++++++++++++
 11 files changed, 398 insertions(+), 9 deletions(-)

diff --git a/_data/tour.yml b/_data/tour.yml
index d84b5bb..c7de9ed 100644
--- a/_data/tour.yml
+++ b/_data/tour.yml
@@ -1,6 +1,12 @@
 docs:
  - getting-started
  - basic-read-write
+ - data-model
+ - data-model-code
+ - authorizations
+ - authorizations-code
+ - ranges-splits
  - batch-scanner
+ - batch-scanner-code
  - conditional-writer
  - using-iterators
diff --git a/tour/authorizations-code.md b/tour/authorizations-code.md
new file mode 100644
index 0000000..04ea47b
--- /dev/null
+++ b/tour/authorizations-code.md
@@ -0,0 +1,64 @@
+---
+title: Authorizations Code
+---
+```java
+        // start writing your code here
+        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+        Connector conn = mac.getConnector("root", "tourguide");
+        conn.tableOperations().create("GothamPD");
+
+        // Create a "secretIdentity" authorization & visibility
+        final String secId = "secretIdentity";
+        Authorizations auths = new Authorizations(secId);
+        ColumnVisibility visibility = new ColumnVisibility(secId);
+
+        // Create a user with the "secretIdentity" authorization and grant him read permissions on our table
+        conn.securityOperations().createLocalUser("commissioner", new PasswordToken("gordanrocks"));
+        conn.securityOperations().changeUserAuthorizations("commissioner", auths);
+        conn.securityOperations().grantTablePermission("commissioner", "GothamPD", TablePermission.READ);
+
+        // Create 3 Mutation objects, securing the proper columns.
+        Mutation mutation1 = new Mutation("id0001");
+        mutation1.put("hero","alias", "Batman");
+        mutation1.put("hero","name", visibility, "Bruce Wayne");
+        mutation1.put("hero","wearsCape?", "true");
+        Mutation mutation2 = new Mutation("id0002");
+        mutation2.put("hero","alias", "Robin");
+        mutation2.put("hero","name", visibility,"Dick Grayson");
+        mutation2.put("hero","wearsCape?", "true");
+        Mutation mutation3 = new Mutation("id0003");
+        mutation3.put("villain","alias", "Joker");
+        mutation3.put("villain","name", "Unknown");
+        mutation3.put("villain","wearsCape?", "false");
+
+        // Create a BatchWriter to the GothamPD table and add your mutations to it.
+        // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
+        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+            writer.addMutation(mutation1);
+            writer.addMutation(mutation2);
+            writer.addMutation(mutation3);
+        }
+
+        // Read and print all rows of the commissioner can see. Pass Scanner proper authorizations
+        Connector commishConn = mac.getConnector("commissioner", "gordanrocks");
+        try(Scanner scan = commishConn.createScanner("GothamPD", auths)) {
+            System.out.println("Gotham Police Department Persons of Interest:");
+            for (Map.Entry<Key, Value> entry : scan) {
+                System.out.printf("Key : %-60s  Value : %s\n", entry.getKey(), entry.getValue());
+            }
+        }
+```
+
+The code above will print (timestamp will differ):
+```commandline
+Gotham Police Department Persons of Interest:
+Key : id0001 hero:alias [] 1511900180231 false                      Value : Batman
+Key : id0001 hero:name [secretIdentity] 1511900180231 false         Value : Bruce Wayne
+Key : id0001 hero:wearsCape? [] 1511900180231 false                 Value : true
+Key : id0002 hero:alias [] 1511900180231 false                      Value : Robin
+Key : id0002 hero:name [secretIdentity] 1511900180231 false         Value : Dick Grayson
+Key : id0002 hero:wearsCape? [] 1511900180231 false                 Value : true
+Key : id0003 villain:alias [] 1511900180231 false                   Value : Joker
+Key : id0003 villain:name [] 1511900180231 false                    Value : Unknown
+Key : id0003 villain:wearsCape? [] 1511900180231 false              Value : false
+```
\ No newline at end of file
diff --git a/tour/authorizations.md b/tour/authorizations.md
new file mode 100644
index 0000000..ac45ffe
--- /dev/null
+++ b/tour/authorizations.md
@@ -0,0 +1,46 @@
+---
+title: Authorizations
+---
+Authorizations are a set of Strings that enable a user to read protected data. A column visibility is a boolean expression 
+that is evaluated using the authorizations provided by a scanner. If it evaluates to true, then the data is visible. 
+
+For example:
+* Bob scans with authorizations = { IT, User }
+* Tina scans with authorizations = { Admin, IT, User }
+* Row1:family1:qualifier1 has Visibility = { Admin && IT && User }
+* Bob will **not** see Row1:family1:qualifier1
+* Tina will see Row1:family1:qualifier1
+
+We now want to secure our secret identities of the heroes so that only users with the proper authorizations can read their names.
+
+1. Using the code from the previous exercise, add the following to the beginning of the _exercise_ method (after we get the Connector).
+```java
+        // Create a "secretIdentity" authorization & visibility
+        final String secId = "secretIdentity";
+        Authorizations auths = new Authorizations(secId);
+        ColumnVisibility visibility = new ColumnVisibility(secId);
+        
+        // Create a user with the "secretIdentity" authorization and grant him read permissions on our table
+        conn.securityOperations().createLocalUser("commissioner", new PasswordToken("gordanrocks"));
+        conn.securityOperations().changeUserAuthorizations("commissioner", auths);
+        conn.securityOperations().grantTablePermission("commissioner", "GothamPD", TablePermission.READ);
+``` 
+
+2. The Mutation API allows you to set the visibility on a column. Find the proper method for setting a column visibility in 
+the [Mutation API][mut] and modify the code so the visibility created above will secure the two "name" columns. 
+
+3. Build and run.  What data do you see?
+* You should see all of the data except the secret identities of Batman and Robin.  This is because the Scanner was created
+ from the root user Connector.  
+* Replace the _Authorizations.EMPTY_ in the Scanner with the _auths_ created above and run it again.
+* This should result in an error since the root user doesn't have the authorizations we tried to pass to the Scanner.
+
+4. Get a connector for the "commissioner" and from it create a Scanner with the authorizations needed to view the secret identities.
+
+5. Build and run.  You should see all the rows in the GothamPD table printed, including these secured key/value pairs:
+```commandline
+Key : id0001 hero:name [secretIdentity] 1511900180231 false         Value : Bruce Wayne
+Key : id0002 hero:name [secretIdentity] 1511900180231 false         Value : Dick Grayson
+```
+
+[mut]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/data/Mutation.html
\ No newline at end of file
diff --git a/tour/basic-read-write.md b/tour/basic-read-write.md
index 6eb1c5c..a9f1451 100644
--- a/tour/basic-read-write.md
+++ b/tour/basic-read-write.md
@@ -1,5 +1,53 @@
 ---
-title: Basic Reading & Writing
+title: Writing and Reading
 ---
+Accumulo is a big data key/value store.  Writing data to Accumulo is flexible and fast.  Like any database, Accumulo stores
+data in tables and rows.  Each row in an Accumulo table can hold many key/value pairs.  
 
-Talk about reading and writing.
+Here are the steps for writing to a table and then reading from it. Copy and paste the code below into the _exercise_  method.  Note each step is commented. 
+```java
+        // 1. Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+        Connector conn = mac.getConnector("root", "tourguide");
+        conn.tableOperations().create("GothamPD");
+
+        // 2. Create a Mutation object to hold all changes to a row in a table.  Each row has a unique row ID.
+        Mutation mutation = new Mutation("id0001");
+
+        // 3. Create key/value pairs for Batman.  Put them in the "hero" family.
+        mutation.put("hero","alias", "Batman");
+        mutation.put("hero","name", "Bruce Wayne");
+        mutation.put("hero","wearsCape?", "true");
+
+        // 4. Create a BatchWriter to the GothamPD table and add your mutation to it.  Try w/ resources will close for us.
+        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+            writer.addMutation(mutation);
+        }
+
+        // 5. Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
+        try(Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
+            System.out.println("Gotham Police Department Persons of Interest:");
+            // A Scanner is an extension of java.lang.Iterable so behaves just like one.
+            for (Map.Entry<Key, Value> entry : scan) {
+                System.out.println("Key:" + entry.getKey());
+                System.out.println("Value:" + entry.getValue());
+            }
+        }
+```
+
+Build and run your code
+```commandline
+mvn -q clean compile exec:java
+``` 
+
+Good job!  That is all it takes to write and read from Accumulo.  
+
+Notice a lot of other information was printed from the Keys we created. Accumulo is flexible because hidden within its 
+Key is a rich data model that can be broken up into different parts.  We will cover the [Data Model][dmodel] in the next lesson.
+
+### But wait... I thought Accumulo was all about Security?  
+Spoiler Alert: it is!  Did you notice the _Authorizations.EMPTY_ we passed to the Scanner on step 5?  The data
+we created in this first lesson was not secured with Authorizations so the Scanner didn't require any Authorizations 
+to read it.  More to come later in the [Authorizations][auths] lesson! 
+
+[dmodel]: /tour/data-model
+[auths]: /tour/authorizations
\ No newline at end of file
diff --git a/tour/batch-scanner-code.md b/tour/batch-scanner-code.md
new file mode 100644
index 0000000..bb06de4
--- /dev/null
+++ b/tour/batch-scanner-code.md
@@ -0,0 +1,42 @@
+---
+title: Batch Scanner Code
+---
+```java
+        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+        Connector conn = mac.getConnector("root", "tourguide");
+        conn.tableOperations().create("GothamPD");
+
+        // Generate 10,000 rows of henchman data
+        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+            for(int i = 0; i < 10_000; i++) {
+                Mutation m = new Mutation(String.format("id%04d", i));
+                m.put("villain", "alias", "henchman" + i);
+                m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
+                m.put("villain", "wearsCape?", "false");
+                writer.addMutation(m);
+            }
+        }
+
+        // 1. Create a BatchScanner with 5 query threads
+        try(BatchScanner batchScanner = conn.createBatchScanner("GothamPD", Authorizations.EMPTY, 5)) {
+            // 2. Create a collection of 2 sample ranges and set it to the batchScanner
+            List ranges = new ArrayList<Range>();
+            ranges.add(new Range("id1000", "id1999"));
+            ranges.add(new Range("id9000", "id9999"));
+            batchScanner.setRanges(ranges);
+
+            // 3. Fetch just the columns we want
+            batchScanner.fetchColumn(new Text("villain"), new Text("yearsOfService"));
+
+            // 4. Calculate average years of service
+            Long totalYears = 0L;
+            Long entriesRead = 0L;
+            for (Map.Entry<Key, Value> entry : batchScanner) {
+                totalYears += Long.valueOf(entry.getValue().toString());
+                entriesRead++;
+            }
+            System.out.println("Out of " + entriesRead + " entries, average years of a henchman: " + totalYears / entriesRead);
+        }
+```
+
+The average years of a henchman should be 24.
\ No newline at end of file
diff --git a/tour/batch-scanner.md b/tour/batch-scanner.md
index 2eb8eb1..21a15f3 100644
--- a/tour/batch-scanner.md
+++ b/tour/batch-scanner.md
@@ -1,3 +1,38 @@
 ---
 title: Batch Scanner
 ---
+Running on a single thread, a Scanner will retrieve a single Range of data and return Keys in sorted order. A [BatchScanner] 
+will retrieve multiple Ranges of data using multiple threads.  A BatchScanner can be more efficient but does not guarantee Keys will be returned in sorted order.
+
+For this exercise, we need to generate a bunch of data to test BatchScanner.  Copy the code below into the _exercise_ method.
+```java
+        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+        Connector conn = mac.getConnector("root", "tourguide");
+        conn.tableOperations().create("GothamPD");
+
+        // Generate 10,000 rows of henchman data, each with a different number yearsOfService
+        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+            for(int i = 0; i < 10_000; i++) {
+                Mutation m = new Mutation(String.format("id%04d", i));
+                m.put("villain", "alias", "henchman" + i);
+                m.put("villain", "yearsOfService", "" + (new Random().nextInt(50)));
+                m.put("villain", "wearsCape?", "false");
+                writer.addMutation(m);
+            }
+        }
+```
+We want to calculate the average years of service of a sample of the henchman data.  A BatchScanner would be good for this task because we 
+don't need the returned keys to be sorted.  Follow these steps to efficiently scan the table with 10,000 entries.
+
+1. After the above code, create a BatchScanner with 5 query threads.  Similar to a Scanner, use the [createBatchScanner] method.
+
+2. Create an ArrayList of 2 sample Ranges (id1000 to id1999 and id9000 to id9999) and set the ranges of the BatchScanner using _setRanges_.
+
+3. We can make the scan more efficient by only bringing back the columns we want.  Use [fetchColumn] to get the "villain" family 
+and "yearsOfService" qualifier.
+
+4. Finally, use the BatchScanner to calculate the average years of service of the henchmen.
+
+[BatchScanner]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/BatchScanner.html
+[createBatchScanner]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/Connector.html#createBatchScanner(java.lang.String,%20org.apache.accumulo.core.security.Authorizations,%20int)
+[fetchColumn]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/ScannerBase.html#fetchColumn(org.apache.hadoop.io.Text,%20org.apache.hadoop.io.Text)
\ No newline at end of file
diff --git a/tour/data-model-code.md b/tour/data-model-code.md
new file mode 100644
index 0000000..4a0d0e8
--- /dev/null
+++ b/tour/data-model-code.md
@@ -0,0 +1,58 @@
+---
+title: Data Model Code
+---
+
+```java
+        // Connect to Mini Accumulo as the root user and create a table called "GothamPD".
+        Connector conn = mac.getConnector("root", "tourguide");
+        conn.tableOperations().create("GothamPD");
+
+        // Create a row for Batman
+        Mutation mutation1 = new Mutation("id0001");
+        mutation1.put("hero","alias", "Batman");
+        mutation1.put("hero","name", "Bruce Wayne");
+        mutation1.put("hero","wearsCape?", "true");
+
+        // Create a row for Robin
+        Mutation mutation2 = new Mutation("id0002");
+        mutation2.put("hero","alias", "Robin");
+        mutation2.put("hero","name", "Dick Grayson");
+        mutation2.put("hero","wearsCape?", "true");
+
+        // Create a row for Joker
+        Mutation mutation3 = new Mutation("id0003");
+        mutation3.put("villain","alias", "Joker");
+        mutation3.put("villain","name", "Unknown");
+        mutation3.put("villain","wearsCape?", "false");
+
+        // Create a BatchWriter to the GothamPD table and add your mutations to it.  
+        // Once the BatchWriter is closed by the try w/ resources, data will be available to scans.
+        try(BatchWriter writer = conn.createBatchWriter("GothamPD", new BatchWriterConfig())) {
+            writer.addMutation(mutation1);
+            writer.addMutation(mutation2);
+            writer.addMutation(mutation3);
+        }
+
+        // Read and print all rows of the "GothamPD" table. Try w/ resources will close for us.
+        try(Scanner scan = conn.createScanner("GothamPD", Authorizations.EMPTY)) {
+            System.out.println("Gotham Police Department Persons of Interest:");
+            // A Scanner is an extension of java.lang.Iterable so behaves just like one.
+            for (Map.Entry<Key, Value> entry : scan) {
+                System.out.printf("Key : %30s  Value : %s\n", entry.getKey(), entry.getValue());
+            }
+        }
+```
+
+The code above will print (timestamp will differ):
+```commandline
+Gotham Police Department Persons of Interest:
+Key : id0001 hero:alias [] 1511306370025 false            Value : Batman
+Key : id0001 hero:name [] 1511306370025 false             Value : Bruce Wayne
+Key : id0001 hero:wearsCape? [] 1511306370025 false       Value : true
+Key : id0002 hero:alias [] 1511306370025 false            Value : Robin
+Key : id0002 hero:name [] 1511306370025 false             Value : Dick Grayson
+Key : id0002 hero:wearsCape? [] 1511306370025 false       Value : true
+Key : id0003 villain:alias [] 1511306370025 false         Value : Joker
+Key : id0003 villain:name [] 1511306370025 false          Value : Unknown
+Key : id0003 villain:wearsCape? [] 1511306370025 false    Value : false
+``` 
\ No newline at end of file
diff --git a/tour/data-model.md b/tour/data-model.md
new file mode 100644
index 0000000..5580cb4
--- /dev/null
+++ b/tour/data-model.md
@@ -0,0 +1,28 @@
+---
+title: Data Model
+---
+Data is stored in Accumulo in a distributed sorted map. The Keys of the map are broken up logically into a few different parts, 
+as seen in the image below.
+
+![key value pair]({{ site.url }}/images/docs/key_value.png)
+
+**Row ID** - Unique identifier for the row.<br/>
+**Column Family** - Logical grouping of the key. This field can be used to partition data within a node.<br/>
+**Column Qualifier** - More specific attribute of the key.<br/>
+**Column Visibility** - Security label controlling access to the key/value pair.<br/>
+**Timestamp** - Generated automatically and used for versioning.
+
+The **value** is where the actual data is stored. For brevity, we often refer to the 3 parts of the column as the family, qualifier and visibility. 
+
+Take a closer look at the Mutation object created in the first exercise:
+```java
+Mutation mutation = new Mutation("id0001");
+mutation.put("hero","alias", "Batman");
+```
+It can be broken down as follows: <br/>
+**Row ID**: id0001  **Column Family**: hero  **Column Qualifier**: alias  **Value**: Batman
+
+For this exercise add a few more rows to the GothamDB table.  Create a row for Robin (id0002), who is a hero that also wears a cape
+and his name is "Dick Grayson".  Create a row for Joker (id0003), who is a villain with an "Unknown" name and doesn't wear a cape. Build and run.
+
+Notice how the data is printed in sorted order. Accumulo sorts by Row ID then family and then qualifier.  
\ No newline at end of file
diff --git a/tour/getting-started.md b/tour/getting-started.md
index 0b076c1..50bc980 100644
--- a/tour/getting-started.md
+++ b/tour/getting-started.md
@@ -2,4 +2,31 @@
 title: Getting Started
 ---
 
-Talk about how to get started.
+First make sure you have Java, Maven and Git installed on your machine.  Oh you are already rocking? OK let's go!
+
+1. Clone the tour onto your machine:
+```commandline
+git clone -b tour https://github.com/apache/accumulo-website.git tour
+cd tour
+```
+2. Open [Main.java] in your favorite editor.
+```commandline
+vim ./src/main/java/tour/Main.java
+```
+Notice the main method creates a MiniAccumuloCluster with a root password of "tourguide".  MiniAccumuloCluster is a mini
+version of Accumulo that runs on your local filesystem.  It should only be used for development purposes but will work
+great here on the tour.  Files and logs used by MiniAccumuloCluster can be seen in the _target/mac######_ directory. 
+
+3. Modify the _exercise_ method to print a hello message. You will put your code in this method for each lesson.
+```java
+private static void exercise(MiniAccumuloCluster mac) {
+    // start writing your code here
+    System.out.println("Hello world");
+}
+```
+4. Build and run to make sure everything is cool.
+```commandline
+mvn -q clean compile exec:java
+```
+
+[Main.java]: https://github.com/apache/accumulo-website/blob/tour/src/main/java/tour/Main.java
diff --git a/tour/index.md b/tour/index.md
index 9217637..2aac4f2 100644
--- a/tour/index.md
+++ b/tour/index.md
@@ -9,13 +9,12 @@ skiph1fortitle: true
 {% assign first_url = tour_pages[0] | prepend: '/tour/' | append: '/' %}
 {% assign first_page = site.pages | where:'url',first_url | first %}
 
-Welcome to the Accumulo tour! The tour offers a hands on introduction to Accumulo, broken down into
-independent steps and an exercise. The exercise gives you a chance to apply what you have learned.
-The tour starts with a [{{ first_page.title }}]({{ first_url }}) page that will help you set up
-the exercise on your machine.
+Welcome to the Accumulo tour! The tour offers a hands on introduction to the Accumulo Java API, broken down into
+independent steps and exercises. The exercises give you a chance to apply what you have learned by writing code on your
+own. The answers to an exercise are typically provided in the next step.  The tour starts with a 
+[{{ first_page.title }}]({{ first_url }}) page that will help you get set up.
 
-We recommend following the tour in order. However, all pages are listed below for review.  When on a
-tour page, the left and right keys on the keyboard can be used to navigate. If you have any questions
+When on a tour page, the left and right keys on the keyboard can be used to navigate. If you have any questions
 or suggestions while going through the tour, please send an email to our [mailing list][mlist]
 or [create an issue][issue].
 
diff --git a/tour/ranges-splits.md b/tour/ranges-splits.md
new file mode 100644
index 0000000..327d703
--- /dev/null
+++ b/tour/ranges-splits.md
@@ -0,0 +1,36 @@
+---
+title: Ranges and Splits
+---
+
+A Range is a specified group of Keys. There are many different ways to create a Range.  Here are a few examples:
+```java
+new Range(Key startKey, Key endKey)  // Creates a range from startKey inclusive to endKey inclusive.
+new Range(CharSequence row)  // Creates a range that covers an entire row.
+new Range(CharSequence startRow, CharSequence endRow) // Creates a range from startRow inclusive to endRow inclusive.
+```
+
+A Scanner by default will scan all Keys in a table but this can be inefficient. It is a good practice to set a range on a Scanner.
+```java
+scanner.setRange(new Range("id0000", "id0010"));  // returns rows from id0000 to id0010
+```
+
+As your data grows larger, Accumulo will split tables into smaller pieces called Tablets.  Tablets can then be distributed across multiple Tablet Servers.  
+By default a table will get split into Tablets on row boundaries, guaranteeing an entire row to be on one Tablet Server.  We have the ability to 
+tell Accumulo were to split tables by setting split points. This is done using _addSplits_ in the [TableOperations] API.  The image below 
+demonstrates how Accumulo splits data.  
+
+![data distribution]({{ site.url }}/images/docs/data_distribution.png)
+
+Take a minute to learn these Accumulo terms:
+* **Tablet** - A partition of a table.
+* **Split** - A point where tables are partitioned into separate tablets.
+* **Flush** - Action taken when data is written from memory to disk.
+* **Compact** - Action taken when files on disk are consolidated.
+* **Iterator** - A server side mechanism that can filter and modify Key/Value pairs.
+
+Knowing these terms are critical when working closely with Accumulo.  Iterators are especially unique and powerful.  More on them later.
+
+When working with large amounts of data across many Tablet Servers, a simple Scanner might not do the trick. Next lesson we learn about the power of 
+the multi-threaded BatchScanner!  
+
+[TableOperations]: https://accumulo.apache.org/1.8/apidocs/org/apache/accumulo/core/client/admin/TableOperations.html
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@accumulo.apache.org" <co...@accumulo.apache.org>.