<!DOCTYPE html>
<html lang="en">
<head>
<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="/css/dataTables.bootstrap.css" rel="stylesheet">
<link href="/css/pirk.css" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">

<title>Apache Pirk (incubating)</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/jquery.dataTables.min.js"></script>
<script src="/js/dataTables.bootstrap.js"></script>
<script>
  // show location of canonical site if not currently on the canonical site
  $(function() {
    var host = window.location.host;
    if (typeof host !== 'undefined' && host !== 'pirk.incubator.apache.org') {
      $('#non-canonical').show();
    }
  });

  

  $(function() {
    // decorate section headers with anchors
    return $("h2, h3, h4, h5, h6").each(function(i, el) {
      var $el, icon, id;
      $el = $(el);
      id = $el.attr('id');
      icon = '<i class="fa fa-link"></i>';
      if (id) {
        return $el.append($("<a />").addClass("header-link").attr("href", "#" + id).html(icon));
      }
    });
  });

  // configure Google Analytics
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-81114308-1', 'auto');
  ga('send', 'pageview');
  
</script>
</head>
<body style="padding-top: 100px">

  <nav class="navbar navbar-default navbar-fixed-top">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-items">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a href="/"><img id="nav-logo" alt="Apache Pirk" class="img-responsive" src="/images/pirkImage.png" width="150"/></a>
    </div>
    <div class="collapse navbar-collapse" id="navbar-items">
      <ul class="nav navbar-nav">
        <li class="nav-link"><a href="/downloads">Download</a></li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Documentation<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_users"><a href="/for_users">For Users</a></li>
          <li id="nav_developers"><a href="/for_developers">For Developers</a></li>
          <li id="nav_developers"><a href="/cloud_instructions">Cloud instructions</a></li>
          <li id="nav_papers"><a href="/papers">Papers &amp Presentations</a></li>
          <li class="nav_faq"><a href="/faq">FAQ</a></li>
          <li class="divider"></li>
           <li><a href="/javadocs">Javadocs</a></li>     
        </ul>
        </li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Community<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_getinvolvedpirk"><a href="/get_involved_pirk">Get Involved</a></li>
          <li id="nav_listspirk"><a href="/mailing_list_pirk">Mailing Lists</a></li>
          <li id="nav_peoplepirk"><a href="/people_pirk">People</a></li>
       	</ul>
        </li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Development<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_releasing"><a href="/how_to_contribute">How to Contribute</a></li>
          <li id="nav_releasing"><a href="/releasing">Making Releases</a></li>
          <li id="nav_nav_verify_release"><a href="/verifying_releases">Verifying Releases</a></li>
          <li id="nav_update_website"><a href="/website_updates">Website Updates</a></li>
          <hr>
          <li><a href="https://issues.apache.org/jira/browse/PIRK ">Issue Tracker/JIRA <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://builds.apache.org/job/pirk/">Jenkins Builds <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://travis-ci.org/apache/incubator-pirk">Travis CI Builds <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://github.com/apache/incubator-pirk"> Pirk Github Mirror <i class="fa fa-external-link"></i></a></li>
        </ul>
        </li>
        <li class="nav-link"><a href="/roadmap">Roadmap</a></li>
       <ul class="nav navbar-nav navbar-right">
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Apache Software Foundation<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a href="https://www.apache.org">Apache Homepage <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/licenses/LICENSE-2.0">License <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/sponsorship">Sponsorship <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/security">Security <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/thanks">Thanks <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct <i class="fa fa-external-link"></i></a></li>
        </ul>
        </li>
        </ul>
        </ul>
    </div> 
  </div>  
</nav>


  <div class="container">
    <div class="row">
      <div class="col-md-12">
        <div id="content">
          
          <h1 class="title">Apache Pirk (incubating)</h1>
          
          <!DOCTYPE html>
<meta charset="utf-8">
<title>Redirecting…</title>
<link rel="canonical" href="/papers/">
<meta http-equiv="refresh" content="0; url=/papers/">
<h1>Redirecting…</h1>
<a href="/papers/">Click here if you are not redirected.</a>
<script>location="/papers/"</script>

        </div>

        
<footer>

  <p><a href="https://www.apache.org"><img src="/images/feather-small.gif" alt="Apache Software Foundation" id="asf-logo" height="100" /></a></p>

  <p>Copyright © 2016-2016 The Apache Software Foundation. Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>

</footer>


      </div>
    </div>
  </div>
</body>
</html>
