mirror of https://github.com/apache/druid.git
Docs working
This commit is contained in:
parent
1750b702d7
commit
e4d4362bf9
|
@ -2,4 +2,4 @@ name: Your New Jekyll Site
|
|||
pygments: true
|
||||
markdown: redcarpet
|
||||
redcarpet:
|
||||
extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data"]
|
||||
extensions: ["no_intra_emphasis", "fenced_code_blocks", "disable_indented_code_blocks", "tables", "with_toc_data"]
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
cheddar@ChedHeads-MacBook-Pro-2.local.61986
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
<!-- Start page_header include -->
|
||||
<div class="navbar navbar-inverse navbar-static-top">
|
||||
<div class="container druid-navbar">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/">Druid</a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav">
|
||||
<li {% if page.id == 'home' %} class="active"{% endif %}><a href="/">Home</a></li>
|
||||
<li {% if page.sectionid == 'druid' %} class="active"{% endif %}><a href="/druid.html">What is Druid?</a></li>
|
||||
<li {% if page.sectionid == 'downloads' %} class="active"{% endif %}><a href="/downloads.html">Downloads</a></li>
|
||||
<li {% if page.sectionid == 'docs' %} class="active"{% endif %}><a href="https://github.com/metamx/druid/wiki">Documentation</a></li>
|
||||
<li {% if page.sectionid == 'community' %} class="active"{% endif %}><a href="/community.html">Community</a></li>
|
||||
<li {% if page.sectionid == 'faq' %} class="active"{% endif %}><a href="/faq.html">FAQ</a></li>
|
||||
<li {% if page.sectionid == 'blog' %} class="active"{% endif %}><a href="/blog">Blog</a></li>
|
||||
<li class="divider"></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Stop page_header include --->
|
|
@ -0,0 +1,18 @@
|
|||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="druid">
|
||||
|
||||
<title>Druid | {{page.title}}</title>
|
||||
|
||||
<!-- Latest compiled and minified CSS -->
|
||||
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.css">
|
||||
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,300,700,800' rel='stylesheet' type='text/css'>
|
||||
<link rel="alternate" type="application/atom+xml" href="http://druid.io/feed">
|
||||
|
||||
<link rel="stylesheet" href="http://druid.io/css/main.css">
|
||||
<link rel="stylesheet" href="http://druid.io/css/header.css">
|
||||
<link rel="stylesheet" href="http://druid.io/css/footer.css">
|
||||
|
||||
|
|
@ -1,147 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Druid | {{page.title}}</title>
|
||||
<link rel="stylesheet" type="text/css" href="/css/bootstrap.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/bootstrap-responsive.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/syntax.css" media="all" />
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,300,700,800' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="/css/custom.css" media="all" />
|
||||
<link rel="alternate" type="application/atom+xml" href="http://druid.io/feed">
|
||||
<script src="http://code.jquery.com/jquery.js"></script>
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header{% if page.id == 'home' %} class="index-head"{% endif %}>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span12">
|
||||
<div class="navbar navbar-inverse custom">
|
||||
<div class="navbar-inner">
|
||||
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="brand {% if page.id == 'home' %}active{% endif %}" href="/">Home</a>
|
||||
<div class="nav-collapse collapse">
|
||||
<ul class="nav">
|
||||
<li {% if page.sectionid == 'druid' %} class="active"{% endif %}>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'downloads' %} class="active"{% endif %}>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'docs' %} class="active"{% endif %}>
|
||||
<a class="doc-link" target="_blank" href="https://github.com/metamx/druid/wiki">Documentation <span></span></a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'community' %} class="active"{% endif %}>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'faq' %} class="active"{% endif %}>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'blog' %} class="active"{% endif %}>
|
||||
<a href="/blog">Blog</a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<span>BETA</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if page.id == 'home' %}
|
||||
<h3>Druid is open-source infrastructure for real²time exploratory analytics on large datasets.</h3>
|
||||
<button class="btn" type="button"><a href="downloads.html">Download</a></button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</header>
|
||||
<div class="container custom main-cont">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span3">
|
||||
<div class="contact-item">
|
||||
<span>CONTACT US</span>
|
||||
<a href="mailto:info@druid.io">info@druid.io</a>
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<span>Metamarkets</span>
|
||||
625 2nd Street, Suite #230<br/>
|
||||
San Francisco, CA 94017
|
||||
<div class="soc">
|
||||
<a href="https://twitter.com/druidio"></a>
|
||||
<a href="https://github.com/metamx/druid" class="github"></a>
|
||||
<a href="http://www.meetup.com/Open-Druid/" class="meet"></a>
|
||||
<a href="http://druid.io/feed/" class="rss" target="_blank"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span9">
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/">DRUID</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/metamx/druid/wiki">Documentation </a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/community.html">SUPPORT</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/licensing.html">Licensing</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/blog">BLOG</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="logo-block">
|
||||
<span class="logo custom">
|
||||
<a href="/"></a>
|
||||
</span>
|
||||
<p>is an open source project sponsored by<br/> Metamarkets.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-40280432-1");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
{% include site_head.html %}
|
||||
<link rel="stylesheet" href="/css/main.css">
|
||||
<link rel="stylesheet" href="/css/header.css">
|
||||
<link rel="stylesheet" href="/css/footer.css">
|
||||
|
||||
<link rel="stylesheet" href="css/docs.css">
|
||||
</head>
|
||||
<body>
|
||||
{% include page_header.html %}
|
||||
|
||||
<div class="container">
|
||||
<div class="page-header">
|
||||
<h1>Documentation</h1>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-3 toc" id="toc">
|
||||
</div>
|
||||
|
||||
<div class="col-md-9 doc-content">
|
||||
{{ content }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="http://code.jquery.com/jquery.js"></script>
|
||||
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
|
||||
<script>
|
||||
$(function(){
|
||||
$("#toc").load("toc.html");
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
---
|
||||
<div class="row-fluid">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
|
@ -1,147 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Druid | {{page.title}}</title>
|
||||
<link rel="stylesheet" type="text/css" href="css/bootstrap.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="css/bootstrap-responsive.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="css/syntax.css" media="all" />
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,300,700,800' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="/css/custom.css" media="all" />
|
||||
<link rel="alternate" type="application/atom+xml" href="http://druid.io/feed">
|
||||
<script src="http://code.jquery.com/jquery.js"></script>
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header{% if page.id == 'home' %} class="index-head"{% endif %}>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span12">
|
||||
<div class="navbar navbar-inverse custom">
|
||||
<div class="navbar-inner">
|
||||
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="brand {% if page.id == 'home' %}active{% endif %}" href="/">Home</a>
|
||||
<div class="nav-collapse collapse">
|
||||
<ul class="nav">
|
||||
<li {% if page.sectionid == 'druid' %} class="active"{% endif %}>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'downloads' %} class="active"{% endif %}>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'docs' %} class="active"{% endif %}>
|
||||
<a class="doc-link" target="_blank" href="https://github.com/metamx/druid/wiki">Documentation <span></span></a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'community' %} class="active"{% endif %}>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'faq' %} class="active"{% endif %}>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'blog' %} class="active"{% endif %}>
|
||||
<a href="/blog">Blog</a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<span>BETA</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if page.id == 'home' %}
|
||||
<h3>Druid is open-source infrastructure for real²time exploratory analytics on large datasets.</h3>
|
||||
<button class="btn" type="button"><a href="downloads.html">Download</a></button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</header>
|
||||
<div class="container custom main-cont">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span3">
|
||||
<div class="contact-item">
|
||||
<span>CONTACT US</span>
|
||||
<a href="mailto:info@druid.io">info@druid.io</a>
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<span>Metamarkets</span>
|
||||
625 2nd Street, Suite #230<br/>
|
||||
San Francisco, CA 94017
|
||||
<div class="soc">
|
||||
<a href="https://twitter.com/druidio"></a>
|
||||
<a href="https://github.com/metamx/druid" class="github"></a>
|
||||
<a href="http://www.meetup.com/Open-Druid/" class="meet"></a>
|
||||
<a href="http://druid.io/feed/" class="rss" target="_blank"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span9">
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/">DRUID</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/metamx/druid/wiki">Documentation </a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/community.html">SUPPORT</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/licensing.html">Licensing</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/blog">BLOG</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="logo-block">
|
||||
<span class="logo custom">
|
||||
<a href="/"></a>
|
||||
</span>
|
||||
<p>is an open source project sponsored by<br/> Metamarkets.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-40280432-1");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
---
|
||||
|
||||
<div class="row-fluid">
|
||||
<div class="span10 offset1{% if page.id != 'home' %} simple-page{% endif %}{% if page.sectionid == 'faq' %} faq-page{% endif %}">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
||||
</div>
|
|
@ -1,44 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
sectionid: blog
|
||||
---
|
||||
|
||||
<div class="row-fluid">
|
||||
<div class="span4 recent">
|
||||
<h3>Recent posts</h3>
|
||||
<ul class="unstyled">
|
||||
{% for post in site.posts limit: 5 %}
|
||||
<li{% if page.title == post.title %} class="active"{% endif %}><a href="{{ post.url }}">{{ post.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="span8 simple-page">
|
||||
<div class="text-item blog inner">
|
||||
<h2 class="date">
|
||||
<span>{{ page.title }}</span>
|
||||
<span>{{ page.date | date: "%B %e, %Y" }} · {{ page.author | upcase }}</span>
|
||||
</h2>
|
||||
|
||||
{% if page.image %}<img src="{{ page.image }}" alt="{{ page.title }}" class="text-img" />{% endif %}
|
||||
|
||||
{{ content }}
|
||||
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||
var disqus_shortname = 'druidio'; // required: replace example with your forum shortname
|
||||
|
||||
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: docs_default
|
||||
layout: doc_page
|
||||
---
|
||||
Aggregations are specifications of processing over metrics available in Druid.
|
||||
Available aggregations are:
|
||||
|
@ -87,4 +87,4 @@ All JavaScript functions must return numerical values.
|
|||
"fnAggregate" : "function(current, a, b) { return current + (Math.log(a) * b); }"
|
||||
"fnCombine" : "function(partialA, partialB) { return partialA + partialB; }"
|
||||
"fnReset" : "function() { return 10; }"
|
||||
}</code>
|
||||
}</code>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Batch Data Ingestion
|
||||
====================
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
# Booting a Single Node Cluster #
|
||||
|
||||
|
@ -27,4 +27,4 @@ cd whirr
|
|||
git checkout trunk
|
||||
mvn clean install -Dmaven.test.failure.ignore=true -Dcheckstyle.skip
|
||||
sp;bin/whirr launch-cluster --config recipes/druid.properties
|
||||
```
|
||||
```
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Broker
|
||||
======
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
### Clone and Build from Source
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
A Druid cluster consists of various node types that need to be set up depending on your use case. See our [Design](Design.html) docs for a description of the different node types.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Compute
|
||||
=======
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Concepts and Terminology
|
||||
========================
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
This describes the basic server configuration that is loaded by all the server processes; the same file is loaded by all. See also the json “specFile” descriptions in [Realtime](Realtime.html) and [Batch-ingestion](Batch-ingestion.html).
|
||||
|
||||
|
@ -8,7 +8,7 @@ JVM Configuration Best Practices
|
|||
|
||||
There are three JVM parameters that we set on all of our processes:
|
||||
|
||||
1. `-Duser.timezone=UTC` This sets the default timezone of the JVM to UTC. We always set this and do not test with other default timezones, so local timezones might work, but they also might uncover weird and interesting bugs
|
||||
1. `-Duser.timezone=UTC` This sets the doc_page timezone of the JVM to UTC. We always set this and do not test with other default timezones, so local timezones might work, but they also might uncover weird and interesting bugs
|
||||
2. `-Dfile.encoding=UTF-8` This is similar to timezone, we test assuming UTF-8. Local encodings might work, but they also might result in weird and interesting bugs
|
||||
3. `-Djava.io.tmpdir=<a path>` Various parts of the system that interact with the file system do it via temporary files, these files can get somewhat large. Many production systems are setup to have small (but fast) `/tmp` directories, these can be problematic with Druid so we recommend pointing the JVM’s tmp directory to something with a little more meat.
|
||||
|
||||
|
@ -50,7 +50,7 @@ An example runtime.properties is as follows:
|
|||
druid.zk.service.host=
|
||||
# ZK path prefix for Druid-usage of zookeeper, Druid will create multiple paths underneath this znode
|
||||
druid.zk.paths.base=/druid
|
||||
# ZK path for discovery, the only path not to default to anything
|
||||
# ZK path for discovery, the only path not to doc_page to anything
|
||||
druid.zk.paths.discoveryPath=/druid/discoveryPath
|
||||
|
||||
# the host:port as advertised to clients
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
If you are interested in contributing to the code, we accept [pull requests](https://help.github.com/articles/using-pull-requests). Note: we have only just completed decoupling our Metamarkets-specific code from the code base and we took some short-cuts in interface design to make it happen. So, there are a number of interfaces that exist right now which are likely to be in flux. If you are embedding Druid in your system, it will be safest for the time being to only extend/implement interfaces that this wiki describes, as those are intended as stable (unless otherwise mentioned).
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Deep storage is where segments are stored. It is a storage mechanism that Druid does not provide. This deep storage infrastructure defines the level of durability of your data, as long as Druid nodes can see this storage infrastructure and get at the segments stored on it, you will not lose data no matter how many Druid nodes you lose. If segments disappear from this storage layer, then you will lose whatever data those segments represented.
|
||||
|
||||
|
@ -7,7 +7,7 @@ The currently supported types of deep storage follow.
|
|||
|
||||
## S3-compatible
|
||||
|
||||
S3-compatible deep storage is basically either S3 or something like riak-cs which exposes the same API as S3. This is the default deep storage implementation.
|
||||
S3-compatible deep storage is basically either S3 or something like riak-cs which exposes the same API as S3. This is the doc_page deep storage implementation.
|
||||
|
||||
S3 configuration parameters are
|
||||
|
||||
|
@ -39,4 +39,4 @@ In order to use a local mount for deep storage, you need to set the following co
|
|||
|
||||
Note that you should generally set `druid.pusher.local.storageDirectory` to something different from `druid.paths.indexCache`.
|
||||
|
||||
If you are using the Hadoop indexer in local mode, then just give it a local file as your output directory and it will work.
|
||||
If you are using the Hadoop indexer in local mode, then just give it a local file as your output directory and it will work.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
For a comprehensive look at the architecture of Druid, read the [White Paper](http://static.druid.io/docs/druid.pdf).
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
A version may be declared as a release candidate if it has been deployed to a sizable production cluster. Release candidates are declared as stable after we feel fairly confident there are no major bugs in the version. Check out the [Versioning](Versioning.html) section for how we describe software versions.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
# Druid Personal Demo Cluster (DPDC)
|
||||
|
||||
|
@ -68,7 +68,7 @@ This guide walks you through the steps to create the cluster and then how to cre
|
|||
|
||||
**`http://IPAddressDruidMaster:8082/druid/v3/demoServlet`**
|
||||
|
||||
As you can see from the image below, there are default values in the Dimensions and Granularity fields. Clicking **Execute** will produce a basic query result.
|
||||
As you can see from the image below, there are doc_page values in the Dimensions and Granularity fields. Clicking **Execute** will produce a basic query result.
|
||||
![Demo Query Interface](images/demo/query-1.png)
|
||||
|
||||
1. Note: when the Query is in running the **Execute** button will be disabled and read: **Fetching…**
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
We are not experts on Cassandra, if anything is incorrect about our portrayal, please let us know on the mailing list or via some other means. We will fix this page.
|
||||
|
||||
Druid is highly optimized for scans and aggregations, it supports arbitrarily deep drill downs into data sets without the need to pre-compute, and it can ingest event streams in real-time and allow users to query events as they come in. Cassandra is a great key-value store and it has some features that allow you to use it to do more interesting things than what you can do with a pure key-value store. But, it is not built for the same use cases that Druid handles, namely regularly scanning over billions of entries per query.
|
||||
|
||||
Furthermore, Druid is fully read-consistent. Druid breaks down a data set into immutable chunks known as segments. All replicants always present the exact same view for the piece of data they are holding and we don’t have to worry about data synchronization. The tradeoff is that Druid has limited semantics for write and update operations. Cassandra, similar to Amazon’s Dynamo, has an eventually consistent data model. Writes are always supported but updates to data may take some time before all replicas sync up (data reconciliation is done at read time). This model favors availability and scalability over consistency.
|
||||
Furthermore, Druid is fully read-consistent. Druid breaks down a data set into immutable chunks known as segments. All replicants always present the exact same view for the piece of data they are holding and we don’t have to worry about data synchronization. The tradeoff is that Druid has limited semantics for write and update operations. Cassandra, similar to Amazon’s Dynamo, has an eventually consistent data model. Writes are always supported but updates to data may take some time before all replicas sync up (data reconciliation is done at read time). This model favors availability and scalability over consistency.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Druid is a complementary addition to Hadoop. Hadoop is great at storing and making accessible large amounts of individually low-value data. Unfortunately, Hadoop is not great at providing query speed guarantees on top of that data, nor does it have very good operational characteristics for a customer-facing production system. Druid, on the other hand, excels at taking high-value summaries of the low-value data on Hadoop, making it available in a fast and always-on fashion, such that it could be exposed directly to a customer.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
The question of Druid versus Impala or Shark basically comes down to your product requirements and what the systems were designed to do.
|
||||
|
||||
|
@ -42,4 +42,4 @@ Impala/Shark, being based on data in HDFS or some other backing store, are limit
|
|||
|
||||
Druid supports timeseries and groupBy style queries. It doesn't have support for joins, which makes it a lot less flexible for generic processing.
|
||||
|
||||
Impala/Shark support SQL style queries with full joins.
|
||||
Impala/Shark support SQL style queries with full joins.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
###How does Druid compare to Redshift?
|
||||
|
||||
|
@ -37,4 +37,4 @@ ParAccel’s hash-based distribution generally means that replication is conduct
|
|||
|
||||
Along with column oriented structures, Druid uses indexing structures to speed up query execution when a filter is provided. Indexing structures do increase storage overhead (and make it more difficult to allow for mutation), but they can also significantly speed up queries.
|
||||
|
||||
ParAccel does not appear to employ indexing strategies.
|
||||
ParAccel does not appear to employ indexing strategies.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
How does Druid compare to Vertica?
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Examples
|
||||
========
|
||||
|
@ -15,21 +15,22 @@ There are two options for installing standalone Druid. Building from source, and
|
|||
|
||||
Clone Druid and build it:
|
||||
|
||||
<code>git clone https://github.com/metamx/druid.git druid
|
||||
cd druid
|
||||
git fetch --tags
|
||||
git checkout druid-0.4.30
|
||||
./build.sh
|
||||
</code>
|
||||
``` bash
|
||||
git clone https://github.com/metamx/druid.git druid
|
||||
cd druid
|
||||
git fetch --tags
|
||||
git checkout druid-0.4.30
|
||||
./build.sh
|
||||
```
|
||||
|
||||
### Downloading the DSK (Druid Standalone Kit)
|
||||
|
||||
[Download](http://static.druid.io/data/examples/druid-services-0.4.6.tar.gz) a stand-alone tarball and run it:
|
||||
|
||||
<code>
|
||||
tar -xzf druid-services-0.X.X-SNAPSHOT-bin.tar.gz
|
||||
cd druid-services-0.X.X-SNAPSHOT
|
||||
</code>
|
||||
``` bash
|
||||
tar -xzf druid-services-0.X.X-SNAPSHOT-bin.tar.gz
|
||||
cd druid-services-0.X.X-SNAPSHOT
|
||||
```
|
||||
|
||||
Twitter Example
|
||||
---------------
|
||||
|
@ -39,12 +40,12 @@ For a full tutorial based on the twitter example, check out this [Twitter Tutori
|
|||
This Example uses a feature of Twitter that allows for sampling of it’s stream. We sample the Twitter stream via our [TwitterSpritzerFirehoseFactory](https://github.com/metamx/druid/blob/master/examples/src/main/java/druid/examples/twitter/TwitterSpritzerFirehoseFactory.java) class and use it to simulate the kinds of data you might ingest into Druid. Then, with the client part, the sample shows what kinds of analytics explorations you can do during and after the data is loaded.
|
||||
|
||||
### What you’ll learn
|
||||
\* See how large amounts of data gets ingested into Druid in real-time
|
||||
\* Learn how to do fast, interactive, analytics queries on that real-time data
|
||||
* See how large amounts of data gets ingested into Druid in real-time
|
||||
* Learn how to do fast, interactive, analytics queries on that real-time data
|
||||
|
||||
### What you need
|
||||
\* A build of standalone Druid with the Twitter example (see above)
|
||||
\* A Twitter username and password.
|
||||
* A build of standalone Druid with the Twitter example (see above)
|
||||
* A Twitter username and password.
|
||||
|
||||
### What you’ll do
|
||||
|
||||
|
@ -57,12 +58,15 @@ This uses `RandomFirehoseFactory` which emits a stream of random numbers (outCol
|
|||
|
||||
In a terminal window, (NOTE: If you are using the cloned Github repository these scripts are in ./examples/bin) start the server with:
|
||||
|
||||
`./run_example_server.sh`
|
||||
`# type rand when prompted`
|
||||
``` bash
|
||||
./run_example_server.sh # type rand when prompted
|
||||
```
|
||||
|
||||
In another terminal window:
|
||||
|
||||
`./run_example_client.sh`
|
||||
`# type rand when prompted`
|
||||
``` bash
|
||||
./run_example_client.sh # type rand when prompted
|
||||
```
|
||||
|
||||
The result of the client query is in JSON format. The client makes a REST request using the program `curl` which is usually installed on Linux, Unix, and OSX by default.
|
||||
|
||||
The result of the client query is in JSON format. The client makes a REST request using the program `curl` which is usually installed on Linux, Unix, and OSX by doc_page.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
A filter is a JSON object indicating which rows of data should be included in the computation for a query. It’s essentially the equivalent of the WHERE clause in SQL. Druid supports the following types of filters.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Firehoses describe the data stream source. They are pluggable and thus the configuration schema can and will vary based on the `type` of the firehose.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
The granularity field determines how data gets bucketed across the time dimension, i.e how it gets aggregated by hour, day, minute, etc.
|
||||
|
||||
|
@ -17,7 +17,7 @@ Supported granularity strings are: `all`, `none`, `minute`, `fifteen_minute`, `t
|
|||
|
||||
Duration granularities are specified as an exact duration in milliseconds and timestamps are returned as UTC.
|
||||
|
||||
They also support specifying an optional origin, which defines where to start counting time buckets from (defaults to 1970-01-01T00:00:00Z).
|
||||
They also support specifying an optional origin, which defines where to start counting time buckets from (doc_pages to 1970-01-01T00:00:00Z).
|
||||
|
||||
<code>{"type": "duration", "duration": "7200000"}</code>
|
||||
|
||||
|
@ -33,10 +33,10 @@ Period granularities are specified as arbitrary period combinations of years, mo
|
|||
|
||||
They support specifying a time zone which determines where period boundaries start and also determines the timezone of the returned timestamps.
|
||||
|
||||
By default years start on the first of January, months start on the first of the month and weeks start on Mondays unless an origin is specified.
|
||||
By doc_page years start on the first of January, months start on the first of the month and weeks start on Mondays unless an origin is specified.
|
||||
|
||||
Time zone is optional (defaults to UTC)
|
||||
Origin is optional (defaults to 1970-01-01T00:00:00 in the given time zone)
|
||||
Time zone is optional (doc_pages to UTC)
|
||||
Origin is optional (doc_pages to 1970-01-01T00:00:00 in the given time zone)
|
||||
|
||||
<code>{"type": "period", "period": "P2D", "timeZone": "America/Los_Angeles"}</code>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
These types of queries take a groupBy query object and return an array of JSON objects where each object represents a grouping asked for by the query.
|
||||
|
||||
|
@ -13,7 +13,7 @@ An example groupBy query object is shown below:
|
|||
[granularity]() “day”,
|
||||
[dimensions]() [“dim1”, “dim2”],
|
||||
[limitSpec]() {
|
||||
[type]() “default”,
|
||||
[type]() “doc_page”,
|
||||
[limit]() 5000,
|
||||
[columns]() [“dim1”, “metric1”]
|
||||
},
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
A having clause is a JSON object identifying which rows from a groupBy query should be returned, by specifying conditions on aggregated values.
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
|
||||
Druid is an open-source analytics datastore designed for realtime, exploratory, queries on large-scale data sets (100’s of Billions entries, 100’s TB data). Druid provides for cost effective, always-on, realtime data ingestion and arbitrary data exploration.
|
||||
|
||||
- Check out some [Examples](Examples.html)
|
||||
- Try out Druid with our Getting Started [Tutorial](https://github.com/metamx/druid/wiki/Tutorial%3A-A-First-Look-at-Druid)
|
||||
- Try out Druid with our Getting Started [Tutorial](./Tutorial%3A-A-First-Look-at-Druid.html)
|
||||
- Learn more by reading the [White Paper](http://static.druid.io/docs/druid.pdf)
|
||||
|
||||
Why Druid?
|
||||
|
@ -24,25 +25,25 @@ We have more details about the general design of the system and why you might wa
|
|||
The data store world is vast, confusing and constantly in flux. This page is meant to help potential evaluators decide whether Druid is a good fit for the problem one needs to solve. If anything about it is incorrect please provide that feedback on the mailing list or via some other means, we will fix this page.
|
||||
|
||||
#### When Druid?
|
||||
\* You need to do interactive, fast, exploration of large amounts of data
|
||||
\* You need analytics (not key value store)
|
||||
\* You have a lot of data (10s of Billions of events added per day, 10s of TB of data added per day)
|
||||
\* You want to do your analysis on data as it’s happening (realtime)
|
||||
\* Your store needs to be always-on, 24x7x365 and years into the future.
|
||||
* You need to do interactive, fast, exploration of large amounts of data
|
||||
* You need analytics (not key value store)
|
||||
* You have a lot of data (10s of Billions of events added per day, 10s of TB of data added per day)
|
||||
* You want to do your analysis on data as it’s happening (realtime)
|
||||
* Your store needs to be always-on, 24x7x365 and years into the future.
|
||||
|
||||
#### Not Druid?
|
||||
\* The amount of data you have can easily be handled by MySql
|
||||
\* Your querying for individual entries or doing lookups (Not Analytics)
|
||||
\* Batch is good enough
|
||||
\* Canned queries is good enough
|
||||
\* Downtime is no big deal
|
||||
* The amount of data you have can easily be handled by MySql
|
||||
* Your querying for individual entries or doing lookups (Not Analytics)
|
||||
* Batch is good enough
|
||||
* Canned queries is good enough
|
||||
* Downtime is no big deal
|
||||
|
||||
#### Druid vs…
|
||||
\* [Druid-vs-Impala-or-Shark](Druid-vs-Impala-or-Shark.html)
|
||||
\* [Druid-vs-Redshift](Druid-vs-Redshift.html)
|
||||
\* [Druid-vs-Vertica](Druid-vs-Vertica.html)
|
||||
\* [Druid-vs-Cassandra](Druid-vs-Cassandra.html)
|
||||
\* [Druid-vs-Hadoop](Druid-vs-Hadoop.html)
|
||||
* [Druid-vs-Impala-or-Shark](Druid-vs-Impala-or-Shark.html)
|
||||
* [Druid-vs-Redshift](Druid-vs-Redshift.html)
|
||||
* [Druid-vs-Vertica](Druid-vs-Vertica.html)
|
||||
* [Druid-vs-Cassandra](Druid-vs-Cassandra.html)
|
||||
* [Druid-vs-Hadoop](Druid-vs-Hadoop.html)
|
||||
|
||||
Key Features
|
||||
------------
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Disclaimer: We are still in the process of finalizing the indexing service and these configs are prone to change at any time. We will announce when we feel the indexing service and the configurations described are stable.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
### R
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Once you have a realtime node working, it is time to load your own data to see how Druid performs.
|
||||
|
||||
|
@ -7,6 +7,7 @@ Druid can ingest data in three ways: via Kafka and a realtime node, via the inde
|
|||
|
||||
## Create Config Directories ##
|
||||
Each type of node needs its own config file and directory, so create them as subdirectories under the druid directory.
|
||||
|
||||
```bash
|
||||
mkdir config
|
||||
mkdir config/realtime
|
||||
|
@ -17,7 +18,7 @@ mkdir config/broker
|
|||
|
||||
## Loading Data with Kafka ##
|
||||
|
||||
[KafkaFirehoseFactory](https://github.com/metamx/druid/blob/master/realtime/src/main/java/com/metamx/druid/realtime/firehose/KafkaFirehoseFactory.java) is how druid communicates with Kafka. Using this [Firehose](Firehose.html) with the right configuration, we can import data into Druid in realtime without writing any code. To load data to a realtime node via Kafka, we'll first need to initialize Zookeeper and Kafka, and then configure and initialize a [Realtime](Realtime.html) node.
|
||||
[KafkaFirehoseFactory](https://github.com/metamx/druid/blob/druid-0.5.x/realtime/src/main/java/com/metamx/druid/realtime/firehose/KafkaFirehoseFactory.java) is how druid communicates with Kafka. Using this [Firehose](Firehose.html) with the right configuration, we can import data into Druid in realtime without writing any code. To load data to a realtime node via Kafka, we'll first need to initialize Zookeeper and Kafka, and then configure and initialize a [Realtime](Realtime.html) node.
|
||||
|
||||
### Booting Kafka ###
|
||||
|
||||
|
@ -45,8 +46,8 @@ bin/kafka-server-start.sh config/server.properties
|
|||
```bash
|
||||
bin/kafka-console-producer.sh --zookeeper localhost:2181 --topic druidtest
|
||||
```
|
||||
### Launching a Realtime Node
|
||||
|
||||
### Launching a Realtime Node
|
||||
1. Create a valid configuration file similar to this called config/realtime/runtime.properties:
|
||||
```
|
||||
druid.host=0.0.0.0:8080
|
||||
|
@ -81,8 +82,8 @@ druid.database.user=user
|
|||
druid.database.password=diurd
|
||||
druid.database.connectURI=
|
||||
druid.host=127.0.0.1:8080
|
||||
|
||||
```
|
||||
|
||||
2. Create a valid realtime configuration file similar to this called realtime.spec:
|
||||
```json
|
||||
[{
|
||||
|
@ -114,12 +115,14 @@ druid.host=127.0.0.1:8080
|
|||
|
||||
}]
|
||||
```
|
||||
|
||||
3. Launch the realtime node
|
||||
```bash
|
||||
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \
|
||||
-Ddruid.realtime.specFile=config/realtime/realtime.spec \
|
||||
-classpath lib/*:config/realtime com.metamx.druid.realtime.RealtimeMain
|
||||
```
|
||||
|
||||
4. Paste data into the Kafka console producer
|
||||
```json
|
||||
{"utcdt": "2010-01-01T01:01:01", "wp": 1000, "gender": "male", "age": 100}
|
||||
|
@ -128,12 +131,14 @@ java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \
|
|||
{"utcdt": "2010-01-01T01:01:04", "wp": 4000, "gender": "female", "age": 30}
|
||||
{"utcdt": "2010-01-01T01:01:05", "wp": 5000, "gender": "male", "age": 40}
|
||||
```
|
||||
|
||||
5. Watch the events as they are ingested by Druid's realtime node
|
||||
```bash
|
||||
...
|
||||
2013-06-17 21:41:55,569 INFO [Global--0] com.metamx.emitter.core.LoggingEmitter - Event [{"feed":"metrics","timestamp":"2013-06-17T21:41:55.569Z","service":"example","host":"127.0.0.1","metric":"events/processed","value":5,"user2":"druidtest"}]
|
||||
...
|
||||
```
|
||||
|
||||
6. In a new console, edit a file called query.body:
|
||||
```json
|
||||
{
|
||||
|
@ -149,11 +154,13 @@ java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \
|
|||
"intervals": ["2010-01-01T00:00/2020-01-01T00"]
|
||||
}
|
||||
```
|
||||
|
||||
7. Submit the query via curl
|
||||
```bash
|
||||
curl -X POST "http://localhost:8080/druid/v2/?pretty" \
|
||||
-H 'content-type: application/json' -d @query.body
|
||||
```
|
||||
|
||||
8. View Result!
|
||||
```json
|
||||
[ {
|
||||
|
@ -165,6 +172,7 @@ curl -X POST "http://localhost:8080/druid/v2/?pretty" \
|
|||
}
|
||||
} ]
|
||||
```
|
||||
|
||||
Now you're ready for [Querying Your Data](Querying-Your-Data.html)!
|
||||
|
||||
## Loading Data with the HadoopDruidIndexer ##
|
||||
|
@ -177,13 +185,16 @@ The setup for a single node, 'standalone' Hadoop cluster is available at [http:/
|
|||
1. If you don't already have it, download MySQL Community Server here: [http://dev.mysql.com/downloads/mysql/](http://dev.mysql.com/downloads/mysql/)
|
||||
2. Install MySQL
|
||||
3. Create a druid user and database
|
||||
|
||||
```bash
|
||||
mysql -u root
|
||||
```
|
||||
|
||||
```sql
|
||||
GRANT ALL ON druid.* TO 'druid'@'localhost' IDENTIFIED BY 'diurd';
|
||||
CREATE database druid;
|
||||
```
|
||||
|
||||
The [Master](Master.html) node will create the tables it needs based on its configuration.
|
||||
|
||||
### Make sure you have ZooKeeper Running ###
|
||||
|
@ -209,6 +220,7 @@ cd ..
|
|||
If you've already setup a realtime node, be aware that although you can run multiple node types on one physical computer, you must assign them unique ports. Having used 8080 for the [Realtime](Realtime.html) node, we use 8081 for the [Master](Master.html).
|
||||
|
||||
1. Setup a configuration file called config/master/runtime.properties similar to:
|
||||
|
||||
```bash
|
||||
druid.host=0.0.0.0:8081
|
||||
druid.port=8081
|
||||
|
@ -252,6 +264,7 @@ druid.paths.indexCache=/tmp/druid/indexCache
|
|||
druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache
|
||||
```
|
||||
2. Launch the [Master](Master.html) node
|
||||
|
||||
```bash
|
||||
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \
|
||||
-classpath lib/*:config/master \
|
||||
|
@ -260,6 +273,7 @@ com.metamx.druid.http.MasterMain
|
|||
|
||||
### Launch a Compute/Historical Node ###
|
||||
1. Create a configuration file in config/compute/runtime.properties similar to:
|
||||
|
||||
```bash
|
||||
druid.host=0.0.0.0:8082
|
||||
druid.port=8082
|
||||
|
@ -304,7 +318,9 @@ druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache
|
|||
druid.pusher.local.storageDirectory=/tmp/druid/localStorage
|
||||
druid.pusher.local=true
|
||||
```
|
||||
|
||||
2. Launch the compute node:
|
||||
|
||||
```bash
|
||||
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \
|
||||
-classpath lib/*:config/compute \
|
||||
|
@ -314,6 +330,7 @@ com.metamx.druid.http.ComputeMain
|
|||
### Create a File of Records ###
|
||||
|
||||
We can use the same records we have been, in a file called records.json:
|
||||
|
||||
```json
|
||||
{"utcdt": "2010-01-01T01:01:01", "wp": 1000, "gender": "male", "age": 100}
|
||||
{"utcdt": "2010-01-01T01:01:02", "wp": 2000, "gender": "female", "age": 50}
|
||||
|
@ -327,6 +344,7 @@ We can use the same records we have been, in a file called records.json:
|
|||
Now its time to run the Hadoop [Batch-ingestion](Batch-ingestion.html) job, HadoopDruidIndexer, which will fill a historical [Compute](Compute.html) node with data. First we'll need to configure the job.
|
||||
|
||||
1. Create a config called batchConfig.json similar to:
|
||||
|
||||
```json
|
||||
{
|
||||
"dataSource": "druidtest",
|
||||
|
@ -362,9 +380,11 @@ Now its time to run the Hadoop [Batch-ingestion](Batch-ingestion.html) job, Hado
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. Now run the job, with the config pointing at batchConfig.json:
|
||||
|
||||
```bash
|
||||
java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.realtime.specFile=realtime.spec -classpath lib/* com.metamx.druid.indexer.HadoopDruidIndexerMain batchConfig.json
|
||||
```
|
||||
|
||||
You can now move on to [Querying Your Data](Querying-Your-Data.html)!
|
||||
You can now move on to [Querying Your Data](Querying-Your-Data.html)!
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Master
|
||||
======
|
||||
|
@ -13,7 +13,7 @@ Before any unassigned segments are serviced by compute nodes, the available comp
|
|||
Rules
|
||||
-----
|
||||
|
||||
Segments are loaded and dropped from the cluster based on a set of rules. Rules indicate how segments should be assigned to different compute node tiers and how many replicants of a segment should exist in each tier. Rules may also indicate when segments should be dropped entirely from the cluster. The master loads a set of rules from the database. Rules may be specific to a certain datasource and/or a default set of rules can be configured. Rules are read in order and hence the ordering of rules is important. The master will cycle through all available segments and match each segment with the first rule that applies. Each segment may only match a single rule
|
||||
Segments are loaded and dropped from the cluster based on a set of rules. Rules indicate how segments should be assigned to different compute node tiers and how many replicants of a segment should exist in each tier. Rules may also indicate when segments should be dropped entirely from the cluster. The master loads a set of rules from the database. Rules may be specific to a certain datasource and/or a doc_page set of rules can be configured. Rules are read in order and hence the ordering of rules is important. The master will cycle through all available segments and match each segment with the first rule that applies. Each segment may only match a single rule
|
||||
|
||||
For more information on rules, see [Rule Configuration](Rule-Configuration.html).
|
||||
|
||||
|
@ -63,7 +63,7 @@ The master node exposes several HTTP endpoints for interactions.
|
|||
|
||||
/info/datasources/{dataSourceName}/segments/{segmentId} - returns full segment metadata for a specific segment
|
||||
|
||||
/info/rules - returns all rules for all data sources in the cluster including the default datasource.
|
||||
/info/rules - returns all rules for all data sources in the cluster including the doc_page datasource.
|
||||
|
||||
/info/rules/{dataSourceName} - returns all rules for a specified datasource
|
||||
|
||||
|
@ -76,7 +76,7 @@ The Master Console
|
|||
|
||||
The Druid master exposes a web GUI for displaying cluster information and rule configuration. After the master starts, the console can be accessed at http://HOST:PORT/static/. There exists a full cluster view, as well as views for individual compute nodes, datasources and segments themselves. Segment information can be displayed in raw JSON form or as part of a sortable and filterable table.
|
||||
|
||||
The master console also exposes an interface to creating and editing rules. All valid datasources configured in the segment database, along with a default datasource, are available for configuration. Rules of different types can be added, deleted or edited.
|
||||
The master console also exposes an interface to creating and editing rules. All valid datasources configured in the segment database, along with a doc_page datasource, are available for configuration. Rules of different types can be added, deleted or edited.
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
MySQL is an external dependency of Druid. We use it to store various metadata about the system, but not to store the actual data. There are a number of tables used for various purposes described below.
|
||||
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
The orderBy field provides the functionality to sort and limit the set of results from a groupBy query. Available options are:
|
||||
|
||||
### DefaultLimitSpec
|
||||
|
||||
The default limit spec takes a limit and the list of columns to do an orderBy operation over. The grammar is:
|
||||
The doc_page limit spec takes a limit and the list of columns to do an orderBy operation over. The grammar is:
|
||||
|
||||
<code>
|
||||
{
|
||||
"type" : "default",
|
||||
"type" : "doc_page",
|
||||
"limit" : <integer_value>,
|
||||
"columns" : [list of OrderByColumnSpec],
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
The Plumber is the thing that handles generated segments both while they are being generated and when they are “done”. This is also technically a pluggable interface and there are multiple implementations, but there are a lot of details handled by the plumber such that it is expected that there will only be a few implementations and only more advanced third-parties will implement their own. See [here](https://github.com/metamx/druid/wiki/Plumber#available-plumbers) for a description of the plumbers included with Druid.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Post-aggregations are specifications of processing that should happen on aggregated values as they come out of Druid. If you include a post aggregation as part of a query, make sure to include all aggregators the post-aggregator requires.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
# Setup #
|
||||
|
||||
|
@ -363,4 +363,4 @@ Check out [Filters](Filters.html) for more.
|
|||
|
||||
## Learn More ##
|
||||
|
||||
You can learn more about querying at [Querying](Querying.html)! Now check out [Booting a production cluster](Booting-a-production-cluster.html)!
|
||||
You can learn more about querying at [Querying](Querying.html)! Now check out [Booting a production cluster](Booting-a-production-cluster.html)!
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Querying
|
||||
========
|
||||
|
@ -104,7 +104,7 @@ The following table summarizes query properties.
|
|||
|groupBy|dimensions|constrains the groupings; if empty, then one value per time granularity bucket|yes|
|
||||
|timeseries, groupBy|aggregations|aggregations that combine values in a bucket. See [Aggregations](Aggregations.html).|yes|
|
||||
|timeseries, groupBy|postAggregations|aggregations of aggregations. See [Post Aggregations](Post Aggregations.html).|yes|
|
||||
|search|limit|maximum number of results (default is 1000), a system-level maximum can also be set via `com.metamx.query.search.maxSearchLimit`|no|
|
||||
|search|limit|maximum number of results (doc_page is 1000), a system-level maximum can also be set via `com.metamx.query.search.maxSearchLimit`|no|
|
||||
|search|searchDimensions|Dimensions to apply the search query to. If not specified, it will search through all dimensions.|no|
|
||||
|search|query|The query portion of the search query. This is essentially a predicate that specifies if something matches.|yes|
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Realtime
|
||||
========
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Note: It is recommended that the master console is used to configure rules. However, the master node does have HTTP endpoints to programmatically configure rules.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
A search query returns dimension values that match the search specification.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Search query specs define how a “match” is defined between a search value and a dimension value. The available search query specs are:
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Segment metadata queries return per segment information about:
|
||||
\* Cardinality of all columns in the segment
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Segments
|
||||
========
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Note: This feature is highly experimental and only works with spatially indexed dimensions.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Note: This feature is highly experimental.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
This page describes how to use Riak-CS for deep storage instead of S3. We are still setting up some of the peripheral stuff (file downloads, etc.).
|
||||
|
||||
|
@ -223,4 +223,4 @@ This just walks through getting the relevant software installed and running. Yo
|
|||
/etc/init.d/druid_master start
|
||||
/etc/init.d/druid_realtime start
|
||||
/etc/init.d/druid_broker start
|
||||
/etc/init.d/druid_compute start
|
||||
/etc/init.d/druid_compute start
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Numerous backend engineers at [Metamarkets](http://www.metamarkets.com) work on Druid full-time. If you any questions about usage or code, feel free to contact any of us.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Tasks are run on workers and always operate on a single datasource. Once an indexer coordinator node accepts a task, a lock is created for the datasource and interval specified in the task. Tasks do not need to explicitly release locks, they are released upon task completion. Tasks may potentially release locks early if they desire. Tasks ids are unique by naming them using UUIDs or the timestamp in which the task was created. Tasks are also part of a “task group”, which is a set of tasks that can share interval locks.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
YourKit supports the Druid open source projects with its
|
||||
full-featured Java Profiler.
|
||||
|
@ -8,4 +8,4 @@ Java and .NET applications. Take a look at YourKit's software products:
|
|||
<a href="http://www.yourkit.com/java/profiler/index.jsp">YourKit Java
|
||||
Profiler</a> and
|
||||
<a href="http://www.yourkit.com/.net/profiler/index.jsp">YourKit .NET
|
||||
Profiler</a>.
|
||||
Profiler</a>.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Time boundary queries return the earliest and latest data points of a data set. The grammar is:
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Timeseries queries
|
||||
==================
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Greetings! This tutorial will help clarify some core Druid concepts. We will use a realtime dataset and issue some basic Druid queries. If you are ready to explore Druid, and learn a thing or two, read on!
|
||||
|
||||
|
@ -290,7 +290,7 @@ Let’s create the file:
|
|||
"page"
|
||||
],
|
||||
"orderBy": {
|
||||
"type": "default",
|
||||
"type": "doc_page",
|
||||
"columns": [
|
||||
{
|
||||
"dimension": "edit_count",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Welcome back! In our first [tutorial](https://github.com/metamx/druid/wiki/Tutorial%3A-A-First-Look-at-Druid), we introduced you to the most basic Druid setup: a single realtime node. We streamed in some data and queried it. Realtime nodes collect very recent data and periodically hand that data off to the rest of the Druid cluster. Some questions about the architecture must naturally come to mind. What does the rest of Druid cluster look like? How does Druid load available static data?
|
||||
|
||||
|
@ -86,7 +86,7 @@ Let's start up a few nodes and download our data. First things though, let's cre
|
|||
mkdir config
|
||||
```
|
||||
|
||||
If you are interested in learning more about Druid configuration files, check out this [link](https://github.com/metamx/druid/wiki/Configuration). Many aspects of Druid are customizable. For the purposes of this tutorial, we are going to use default values for most things.
|
||||
If you are interested in learning more about Druid configuration files, check out this [link](https://github.com/metamx/druid/wiki/Configuration). Many aspects of Druid are customizable. For the purposes of this tutorial, we are going to use doc_page values for most things.
|
||||
|
||||
### Start a Master Node ###
|
||||
|
||||
|
@ -299,4 +299,4 @@ At this point, we can query the segment. For more information on querying, see t
|
|||
## Next Steps ##
|
||||
|
||||
Now that you have an understanding of what the Druid clsuter looks like, why not load some of your own data?
|
||||
Check out the [Loading Your Own Data](https://github.com/metamx/druid/wiki/Loading-Your-Data) section for more info!
|
||||
Check out the [Loading Your Own Data](https://github.com/metamx/druid/wiki/Loading-Your-Data) section for more info!
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Greetings! This tutorial will help clarify some core Druid concepts. We will use a realtime dataset and issue some basic Druid queries. If you are ready to explore Druid, and learn a thing or two, read on!
|
||||
|
||||
|
@ -261,7 +261,7 @@ Let’s create the file:
|
|||
"geo_region"
|
||||
],
|
||||
"orderBy": {
|
||||
"type": "default",
|
||||
"type": "doc_page",
|
||||
"columns": [
|
||||
{
|
||||
"dimension": "known_users",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Greetings! We see you’ve taken an interest in Druid. That’s awesome! Hopefully this tutorial will help clarify some core Druid concepts. We will go through one of the Real-time [Examples](Examples.html), and issue some basic Druid queries. The data source we’ll be working with is the [Twitter spritzer stream](https://dev.twitter.com/docs/streaming-apis/streams/public). If you are ready to explore Druid, brave its challenges, and maybe learn a thing or two, read on!
|
||||
|
||||
|
@ -22,32 +22,33 @@ Not too lost so far right? That’s great! If you cd into the directory:
|
|||
cd druid-services-0.4.6-SNAPSHOT
|
||||
|
||||
You should see a bunch of files:
|
||||
\* run\_example\_server.sh
|
||||
\* run\_example\_client.sh
|
||||
\* LICENSE, config, examples, lib directories
|
||||
|
||||
* run_example_server.sh
|
||||
* run_example_client.sh
|
||||
* LICENSE, config, examples, lib directories
|
||||
|
||||
### Clone and Build from Source
|
||||
|
||||
The other way to setup Druid is from source via git. To do so, run these commands:
|
||||
|
||||
\`\`\`
|
||||
```
|
||||
git clone git@github.com:metamx/druid.git
|
||||
cd druid
|
||||
git checkout druid-0.4.32-branch
|
||||
./build.sh
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
You should see a bunch of files:
|
||||
|
||||
\`\`\`
|
||||
```
|
||||
DruidCorporateCLA.pdf README common examples indexer pom.xml server
|
||||
DruidIndividualCLA.pdf build.sh doc group\_by.body install publications services
|
||||
LICENSE client eclipse\_formatting.xml index-common merger realtime
|
||||
\`\`\`
|
||||
DruidIndividualCLA.pdf build.sh doc group_by.body install publications services
|
||||
LICENSE client eclipse_formatting.xml index-common merger realtime
|
||||
```
|
||||
|
||||
You can find the example executables in the examples/bin directory:
|
||||
\* run\_example\_server.sh
|
||||
\* run\_example\_client.sh
|
||||
* run_example_server.sh
|
||||
* run_example_client.sh
|
||||
|
||||
Running Example Scripts
|
||||
-----------------------
|
||||
|
@ -58,100 +59,103 @@ Let’s start doing stuff. You can start a Druid [Realtime](Realtime.html) node
|
|||
|
||||
Select “twitter”.
|
||||
|
||||
You’ll need to register a new application with the twitter API, which only takes a minute. Go to [https://twitter.com/oauth\_clients/new](https://twitter.com/oauth_clients/new) and fill out the form and submit. Don’t worry, the home page and callback url can be anything. This will generate keys for the Twitter example application. Take note of the values for consumer key/secret and access token/secret.
|
||||
You’ll need to register a new application with the twitter API, which only takes a minute. Go to [https://twitter.com/oauth_clients/new](https://twitter.com/oauth_clients/new) and fill out the form and submit. Don’t worry, the home page and callback url can be anything. This will generate keys for the Twitter example application. Take note of the values for consumer key/secret and access token/secret.
|
||||
|
||||
Enter your credentials when prompted.
|
||||
|
||||
Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below. If you see crazy exceptions, you probably typed in your login information incorrectly.
|
||||
|
||||
<code>
|
||||
2013-05-17 23:04:40,934 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
|
||||
2013-05-17 23:04:40,935 INFO [main] com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler - Invoking start method[public void com.metamx.druid.http.FileRequestLogger.start()] on object[com.metamx.druid.http.FileRequestLogger@42bb0406].
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Connection established.
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] druid.examples.twitter.TwitterSpritzerFirehoseFactory - Connected_to_Twitter
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Receiving status stream.
|
||||
</code>
|
||||
```
|
||||
2013-05-17 23:04:40,934 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
|
||||
2013-05-17 23:04:40,935 INFO [main] com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler - Invoking start method[public void com.metamx.druid.http.FileRequestLogger.start()] on object[com.metamx.druid.http.FileRequestLogger@42bb0406].
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Connection established.
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] druid.examples.twitter.TwitterSpritzerFirehoseFactory - Connected_to_Twitter
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Receiving status stream.
|
||||
```
|
||||
|
||||
Periodically, you’ll also see messages of the form:
|
||||
|
||||
<code>
|
||||
2013-05-17 23:04:59,793 INFO [chief-twitterstream] druid.examples.twitter.TwitterSpritzerFirehoseFactory - nextRow() has returned 1,000 InputRows
|
||||
</code>
|
||||
```
|
||||
2013-05-17 23:04:59,793 INFO [chief-twitterstream] druid.examples.twitter.TwitterSpritzerFirehoseFactory - nextRow() has returned 1,000 InputRows
|
||||
```
|
||||
|
||||
These messages indicate you are ingesting events. The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. Persisting to disk generates a whole bunch of logs:
|
||||
|
||||
<code>
|
||||
2013-05-17 23:06:40,918 INFO [chief-twitterstream] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Submitting persist runnable for dataSource[twitterstream]
|
||||
2013-05-17 23:06:40,920 INFO [twitterstream-incremental-persist] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - DataSource[twitterstream], Interval[2013-05-17T23:00:00.000Z/2013-05-18T00:00:00.000Z], persisting Hydrant[FireHydrant{index=com.metamx.druid.index.v1.IncrementalIndex@126212dd, queryable=com.metamx.druid.index.IncrementalIndexSegment@64c47498, count=0}]
|
||||
2013-05-17 23:06:40,937 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting persist for interval[2013-05-17T23:00:00.000Z/2013-05-17T23:07:00.000Z], rows[4,666]
|
||||
2013-05-17 23:06:41,039 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed index.drd in 11 millis.
|
||||
2013-05-17 23:06:41,070 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed dim conversions in 31 millis.
|
||||
2013-05-17 23:06:41,275 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.CompressedPools - Allocating new chunkEncoder[1]
|
||||
2013-05-17 23:06:41,332 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed walk through of 4,666 rows in 262 millis.
|
||||
2013-05-17 23:06:41,334 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[htags] with cardinality[634]
|
||||
2013-05-17 23:06:41,381 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[htags] in 49 millis.
|
||||
2013-05-17 23:06:41,382 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[lang] with cardinality[19]
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[lang] in 17 millis.
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[utc_offset] with cardinality[32]
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[utc_offset] in 15 millis.
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed inverted.drd in 81 millis.
|
||||
2013-05-17 23:06:41,425 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexIO$DefaultIndexIOHandler - Converting v8[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] to v9[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0]
|
||||
2013-05-17 23:06:41,426 INFO [twitterstream-incremental-persist]
|
||||
... ETC
|
||||
</code>
|
||||
```
|
||||
2013-05-17 23:06:40,918 INFO [chief-twitterstream] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Submitting persist runnable for dataSource[twitterstream]
|
||||
2013-05-17 23:06:40,920 INFO [twitterstream-incremental-persist] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - DataSource[twitterstream], Interval[2013-05-17T23:00:00.000Z/2013-05-18T00:00:00.000Z], persisting Hydrant[FireHydrant{index=com.metamx.druid.index.v1.IncrementalIndex@126212dd, queryable=com.metamx.druid.index.IncrementalIndexSegment@64c47498, count=0}]
|
||||
2013-05-17 23:06:40,937 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting persist for interval[2013-05-17T23:00:00.000Z/2013-05-17T23:07:00.000Z], rows[4,666]
|
||||
2013-05-17 23:06:41,039 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed index.drd in 11 millis.
|
||||
2013-05-17 23:06:41,070 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed dim conversions in 31 millis.
|
||||
2013-05-17 23:06:41,275 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.CompressedPools - Allocating new chunkEncoder[1]
|
||||
2013-05-17 23:06:41,332 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed walk through of 4,666 rows in 262 millis.
|
||||
2013-05-17 23:06:41,334 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[htags] with cardinality[634]
|
||||
2013-05-17 23:06:41,381 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[htags] in 49 millis.
|
||||
2013-05-17 23:06:41,382 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[lang] with cardinality[19]
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[lang] in 17 millis.
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[utc_offset] with cardinality[32]
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[utc_offset] in 15 millis.
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed inverted.drd in 81 millis.
|
||||
2013-05-17 23:06:41,425 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexIO$DefaultIndexIOHandler - Converting v8[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] to v9[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0]
|
||||
2013-05-17 23:06:41,426 INFO [twitterstream-incremental-persist]
|
||||
... ETC
|
||||
```
|
||||
|
||||
The logs are about building different columns, probably not the most exciting stuff (they might as well be in Vulcan) if are you learning about Druid for the first time. Nevertheless, if you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our [White Paper](http://static.druid.io/docs/druid.pdf).
|
||||
Select “twitter” once again. This script issues [GroupByQuery]:(./GroupByQuery.html)s to the twitter data we’ve been ingesting. The query looks like this:
|
||||
|
||||
Okay, things are about to get real (~~time). To query the real-time node you’ve spun up, you can issue:
|
||||
\<pre\>./run\_example\_client.sh\</pre\>
|
||||
Select “twitter” once again. This script issues ]s to the twitter data we’ve been ingesting. The query looks like this:
|
||||
\`\`\`json
|
||||
```json
|
||||
{
|
||||
[queryType]() “groupBy”,
|
||||
[dataSource]() “twitterstream”,
|
||||
[granularity]() “all”,
|
||||
[dimensions]() ,
|
||||
[aggregations]([)
|
||||
{ [type]() “count”, [name]() “rows”},
|
||||
{ [type]() “doubleSum”, [fieldName]() “tweets”, [name]() “tweets”}
|
||||
],
|
||||
[filter]() { [type]() “selector”, [dimension]() “lang”, [value]() “en” },
|
||||
[intervals](["2012-10-01T00:00/2020-01-01T00"])
|
||||
"queryType": "groupBy",
|
||||
"dataSource": "twitterstream",
|
||||
"granularity": "all",
|
||||
"dimensions": ["lang", "utc_offset"],
|
||||
"aggregations":[
|
||||
{ "type": "count", "name": "rows"},
|
||||
{ "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
|
||||
],
|
||||
"filter": { "type": "selector", "dimension": "lang", "value": "en" },
|
||||
"intervals":["2012-10-01T00:00/2020-01-01T00"]
|
||||
}
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: . We are **filtering** via the **“lang”** dimension, to only look at english tweets. Our **aggregations** are what we are calculating: a row count, and the sum of the tweets in our data.
|
||||
The result looks something like this:
|
||||
\`\`\`json
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
[version]() “v1”,
|
||||
[timestamp]() “2012-10-01T00:00:00.000Z”,
|
||||
[event]() {
|
||||
[utc\_offset]() “~~10800",
|
||||
[tweets]() 90,
|
||||
[lang]() "en",
|
||||
[rows]() 81
|
||||
}
|
||||
},
|
||||
{
|
||||
[version]() "v1",
|
||||
[timestamp]() "2012-10-01T00:00:00.000Z",
|
||||
[event]() {
|
||||
[utc\_offset]() "~~14400”,
|
||||
[tweets]() 177,
|
||||
[lang]() “en”,
|
||||
[rows]() 154
|
||||
}
|
||||
},
|
||||
…
|
||||
\`\`\`
|
||||
{
|
||||
"version": "v1",
|
||||
"timestamp": "2012-10-01T00:00:00.000Z",
|
||||
"event": {
|
||||
"utc_offset": "-10800",
|
||||
"tweets": 90,
|
||||
"lang": "en",
|
||||
"rows": 81
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1",
|
||||
"timestamp": "2012-10-01T00:00:00.000Z",
|
||||
"event": {
|
||||
"utc_offset": "-14400",
|
||||
"tweets": 177,
|
||||
"lang": "en",
|
||||
"rows": 154
|
||||
}
|
||||
},
|
||||
...
|
||||
```
|
||||
|
||||
This data, plotted in a time series/distribution, looks something like this:
|
||||
![Timezone / Tweets Scatter Plot](http://metamarkets.com/wp-content/uploads/2013/06/tweets_timezone_offset.png "Timezone / Tweets Scatter Plot")
|
||||
This groupBy query is a bit complicated and we’ll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script.
|
||||
h2. Querying Druid
|
||||
In your favorite editor, create the file:
|
||||
\<pre\>time\_boundary\_query.body\</pre\>
|
||||
|
||||
`time_boundary_query.body`
|
||||
|
||||
Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created:
|
||||
|
||||
\<pre\><code>
|
||||
</code>\</pre\>
|
||||
The ] is one of the simplest Druid queries. To run the query, you can issue:
|
||||
|
@ -190,12 +194,12 @@ We are going to make a slightly more complicated query, the [TimeseriesQuery](Ti
|
|||
|
||||
You are probably wondering, what are these [Granularities](Granularities.html) and [Aggregations](Aggregations.html) things? What the query is doing is aggregating some metrics over some span of time.
|
||||
To issue the query and get some results, run the following in your command line:
|
||||
<pre><code>curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json' -d ````timeseries\_query.body</code>
|
||||
<pre><code>curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json' -d ````timeseries_query.body</code>
|
||||
|
||||
</pre>
|
||||
Once again, you should get a JSON blob of text back with your results, that looks something like this:
|
||||
|
||||
\`\`\`json
|
||||
```json
|
||||
[ {
|
||||
“timestamp” : “2013-06-10T19:09:00.000Z”,
|
||||
“result” : {
|
||||
|
@ -203,7 +207,7 @@ Once again, you should get a JSON blob of text back with your results, that look
|
|||
“rows” : 272271
|
||||
}
|
||||
} ]
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
If you issue the query again, you should notice your results updating.
|
||||
|
||||
|
@ -211,7 +215,7 @@ Right now all the results you are getting back are being aggregated into a singl
|
|||
|
||||
If you loudly exclaimed “we can change granularity to minute”, you are absolutely correct again! We can specify different granularities to bucket our results, like so:
|
||||
|
||||
\`\`\`json
|
||||
```json
|
||||
{
|
||||
[queryType]("timeseries"),
|
||||
[dataSource]("twitterstream"),
|
||||
|
@ -222,11 +226,11 @@ If you loudly exclaimed “we can change granularity to minute”, you are absol
|
|||
{ [type]() “doubleSum”, [fieldName]() “tweets”, [name]() “tweets”}
|
||||
]
|
||||
}
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
This gives us something like the following:
|
||||
|
||||
\`\`\`json
|
||||
```json
|
||||
[ {
|
||||
“timestamp” : “2013-06-10T19:09:00.000Z”,
|
||||
“result” : {
|
||||
|
@ -247,7 +251,7 @@ This gives us something like the following:
|
|||
}
|
||||
},
|
||||
…
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
Solving a Problem
|
||||
-----------------
|
||||
|
@ -263,7 +267,7 @@ Let’s create the file:
|
|||
"dataSource": "twitterstream",
|
||||
"granularity": "all",
|
||||
"dimensions": ["htags"],
|
||||
"orderBy": {"type":"default", "columns":[{"dimension": "tweets", "direction":"DESCENDING"}], "limit":5},
|
||||
"orderBy": {"type":"doc_page", "columns":[{"dimension": "tweets", "direction":"DESCENDING"}], "limit":5},
|
||||
"aggregations":[
|
||||
{ "type": "longSum", "fieldName": "tweets", "name": "tweets"}
|
||||
],
|
||||
|
@ -280,7 +284,7 @@ If you issue the query:
|
|||
|
||||
You should hopefully see an answer to our question. For my twitter stream, it looks like this:
|
||||
|
||||
\`\`\`json
|
||||
```json
|
||||
[ {
|
||||
“version” : “v1”,
|
||||
“timestamp” : “2012-10-01T00:00:00.000Z”,
|
||||
|
@ -317,7 +321,7 @@ You should hopefully see an answer to our question. For my twitter stream, it lo
|
|||
“htags” : “IDidntTextYouBackBecause”
|
||||
}
|
||||
} ]
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
Feel free to tweak other query parameters to answer other questions you may have about the data.
|
||||
|
|
@ -0,0 +1,327 @@
|
|||
---
|
||||
layout: doc_page
|
||||
---
|
||||
Greetings! We see you've taken an interest in Druid. That's awesome! Hopefully this tutorial will help clarify some core Druid concepts. We will go through one of the Real-time "Examples":Examples.html, and issue some basic Druid queries. The data source we'll be working with is the "Twitter spritzer stream":https://dev.twitter.com/docs/streaming-apis/streams/public. If you are ready to explore Druid, brave its challenges, and maybe learn a thing or two, read on!
|
||||
|
||||
h2. Setting Up
|
||||
|
||||
There are two ways to setup Druid: download a tarball, or build it from source.
|
||||
|
||||
h3. Download a Tarball
|
||||
|
||||
We've built a tarball that contains everything you'll need. You'll find it "here":http://static.druid.io/data/examples/druid-services-0.4.6.tar.gz.
|
||||
Download this bad boy to a directory of your choosing.
|
||||
|
||||
You can extract the awesomeness within by issuing:
|
||||
|
||||
pre. tar -zxvf druid-services-0.4.6.tar.gz
|
||||
|
||||
Not too lost so far right? That's great! If you cd into the directory:
|
||||
|
||||
pre. cd druid-services-0.4.6-SNAPSHOT
|
||||
|
||||
You should see a bunch of files:
|
||||
* run_example_server.sh
|
||||
* run_example_client.sh
|
||||
* LICENSE, config, examples, lib directories
|
||||
|
||||
h3. Clone and Build from Source
|
||||
|
||||
The other way to setup Druid is from source via git. To do so, run these commands:
|
||||
|
||||
<pre><code>git clone git@github.com:metamx/druid.git
|
||||
cd druid
|
||||
git checkout druid-0.4.32-branch
|
||||
./build.sh
|
||||
</code></pre>
|
||||
|
||||
You should see a bunch of files:
|
||||
|
||||
<pre><code>DruidCorporateCLA.pdf README common examples indexer pom.xml server
|
||||
DruidIndividualCLA.pdf build.sh doc group_by.body install publications services
|
||||
LICENSE client eclipse_formatting.xml index-common merger realtime
|
||||
</code></pre>
|
||||
|
||||
You can find the example executables in the examples/bin directory:
|
||||
* run_example_server.sh
|
||||
* run_example_client.sh
|
||||
|
||||
h2. Running Example Scripts
|
||||
|
||||
Let's start doing stuff. You can start a Druid "Realtime":Realtime.html node by issuing:
|
||||
<code>./run_example_server.sh</code>
|
||||
|
||||
Select "twitter".
|
||||
|
||||
You'll need to register a new application with the twitter API, which only takes a minute. Go to "https://twitter.com/oauth_clients/new":https://twitter.com/oauth_clients/new and fill out the form and submit. Don't worry, the home page and callback url can be anything. This will generate keys for the Twitter example application. Take note of the values for consumer key/secret and access token/secret.
|
||||
|
||||
Enter your credentials when prompted.
|
||||
|
||||
Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below. If you see crazy exceptions, you probably typed in your login information incorrectly.
|
||||
<pre><code>2013-05-17 23:04:40,934 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
|
||||
2013-05-17 23:04:40,935 INFO [main] com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler - Invoking start method[public void com.metamx.druid.http.FileRequestLogger.start()] on object[com.metamx.druid.http.FileRequestLogger@42bb0406].
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Connection established.
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] druid.examples.twitter.TwitterSpritzerFirehoseFactory - Connected_to_Twitter
|
||||
2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Receiving status stream.
|
||||
</code></pre>
|
||||
|
||||
Periodically, you'll also see messages of the form:
|
||||
<pre><code>2013-05-17 23:04:59,793 INFO [chief-twitterstream] druid.examples.twitter.TwitterSpritzerFirehoseFactory - nextRow() has returned 1,000 InputRows
|
||||
</code></pre>
|
||||
|
||||
These messages indicate you are ingesting events. The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. Persisting to disk generates a whole bunch of logs:
|
||||
|
||||
<pre><code>2013-05-17 23:06:40,918 INFO [chief-twitterstream] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Submitting persist runnable for dataSource[twitterstream]
|
||||
2013-05-17 23:06:40,920 INFO [twitterstream-incremental-persist] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - DataSource[twitterstream], Interval[2013-05-17T23:00:00.000Z/2013-05-18T00:00:00.000Z], persisting Hydrant[FireHydrant{index=com.metamx.druid.index.v1.IncrementalIndex@126212dd, queryable=com.metamx.druid.index.IncrementalIndexSegment@64c47498, count=0}]
|
||||
2013-05-17 23:06:40,937 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting persist for interval[2013-05-17T23:00:00.000Z/2013-05-17T23:07:00.000Z], rows[4,666]
|
||||
2013-05-17 23:06:41,039 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed index.drd in 11 millis.
|
||||
2013-05-17 23:06:41,070 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed dim conversions in 31 millis.
|
||||
2013-05-17 23:06:41,275 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.CompressedPools - Allocating new chunkEncoder[1]
|
||||
2013-05-17 23:06:41,332 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed walk through of 4,666 rows in 262 millis.
|
||||
2013-05-17 23:06:41,334 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[htags] with cardinality[634]
|
||||
2013-05-17 23:06:41,381 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[htags] in 49 millis.
|
||||
2013-05-17 23:06:41,382 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[lang] with cardinality[19]
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[lang] in 17 millis.
|
||||
2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[utc_offset] with cardinality[32]
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[utc_offset] in 15 millis.
|
||||
2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed inverted.drd in 81 millis.
|
||||
2013-05-17 23:06:41,425 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexIO$DefaultIndexIOHandler - Converting v8[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] to v9[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0]
|
||||
2013-05-17 23:06:41,426 INFO [twitterstream-incremental-persist]
|
||||
... ETC
|
||||
</code></pre>
|
||||
|
||||
The logs are about building different columns, probably not the most exciting stuff (they might as well be in Vulcan) if are you learning about Druid for the first time. Nevertheless, if you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our "White Paper":http://static.druid.io/docs/druid.pdf.
|
||||
|
||||
Okay, things are about to get real (-time). To query the real-time node you've spun up, you can issue:
|
||||
<pre>./run_example_client.sh</pre>
|
||||
|
||||
Select "twitter" once again. This script issues ["GroupByQuery":GroupByQuery.html]s to the twitter data we've been ingesting. The query looks like this:
|
||||
|
||||
<pre><code>{
|
||||
"queryType": "groupBy",
|
||||
"dataSource": "twitterstream",
|
||||
"granularity": "all",
|
||||
"dimensions": ["lang", "utc_offset"],
|
||||
"aggregations":[
|
||||
{ "type": "count", "name": "rows"},
|
||||
{ "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
|
||||
],
|
||||
"filter": { "type": "selector", "dimension": "lang", "value": "en" },
|
||||
"intervals":["2012-10-01T00:00/2020-01-01T00"]
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: ["lang", "utc_offset"]. We are **filtering** via the **"lang"** dimension, to only look at english tweets. Our **aggregations** are what we are calculating: a row count, and the sum of the tweets in our data.
|
||||
|
||||
The result looks something like this:
|
||||
|
||||
<pre><code>[
|
||||
{
|
||||
"version": "v1",
|
||||
"timestamp": "2012-10-01T00:00:00.000Z",
|
||||
"event": {
|
||||
"utc_offset": "-10800",
|
||||
"tweets": 90,
|
||||
"lang": "en",
|
||||
"rows": 81
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1",
|
||||
"timestamp": "2012-10-01T00:00:00.000Z",
|
||||
"event": {
|
||||
"utc_offset": "-14400",
|
||||
"tweets": 177,
|
||||
"lang": "en",
|
||||
"rows": 154
|
||||
}
|
||||
},
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
This data, plotted in a time series/distribution, looks something like this:
|
||||
|
||||
!http://metamarkets.com/wp-content/uploads/2013/06/tweets_timezone_offset.png(Timezone / Tweets Scatter Plot)!
|
||||
|
||||
This groupBy query is a bit complicated and we'll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have "curl":http://curl.haxx.se/ installed. Control+C to break out of the client script.
|
||||
|
||||
h2. Querying Druid
|
||||
|
||||
In your favorite editor, create the file:
|
||||
<pre>time_boundary_query.body</pre>
|
||||
|
||||
Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created:
|
||||
<pre><code>{
|
||||
"queryType" : "timeBoundary",
|
||||
"dataSource" : "twitterstream"
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
The "TimeBoundaryQuery":TimeBoundaryQuery.html is one of the simplest Druid queries. To run the query, you can issue:
|
||||
<pre><code>
|
||||
curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json' -d @time_boundary_query.body
|
||||
</code></pre>
|
||||
|
||||
We get something like this JSON back:
|
||||
|
||||
<pre><code>[ {
|
||||
"timestamp" : "2013-06-10T19:09:00.000Z",
|
||||
"result" : {
|
||||
"minTime" : "2013-06-10T19:09:00.000Z",
|
||||
"maxTime" : "2013-06-10T20:50:00.000Z"
|
||||
}
|
||||
} ]
|
||||
</code></pre>
|
||||
|
||||
That's the result. What information do you think the result is conveying?
|
||||
...
|
||||
If you said the result is indicating the maximum and minimum timestamps we've seen thus far (summarized to a minutely granularity), you are absolutely correct. I can see you are a person legitimately interested in learning about Druid. Let's explore a bit further.
|
||||
|
||||
Return to your favorite editor and create the file:
|
||||
|
||||
<pre>timeseries_query.body</pre>
|
||||
|
||||
We are going to make a slightly more complicated query, the "TimeseriesQuery":TimeseriesQuery.html. Copy and paste the following into the file:
|
||||
|
||||
<pre><code>{
|
||||
"queryType":"timeseries",
|
||||
"dataSource":"twitterstream",
|
||||
"intervals":["2010-01-01/2020-01-01"],
|
||||
"granularity":"all",
|
||||
"aggregations":[
|
||||
{ "type": "count", "name": "rows"},
|
||||
{ "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
|
||||
]
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
You are probably wondering, what are these "Granularities":Granularities.html and "Aggregations":Aggregations.html things? What the query is doing is aggregating some metrics over some span of time.
|
||||
To issue the query and get some results, run the following in your command line:
|
||||
<pre><code>curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json' -d @timeseries_query.body</code></pre>
|
||||
|
||||
Once again, you should get a JSON blob of text back with your results, that looks something like this:
|
||||
|
||||
<pre><code>[ {
|
||||
"timestamp" : "2013-06-10T19:09:00.000Z",
|
||||
"result" : {
|
||||
"tweets" : 358562.0,
|
||||
"rows" : 272271
|
||||
}
|
||||
} ]
|
||||
</code></pre>
|
||||
|
||||
If you issue the query again, you should notice your results updating.
|
||||
|
||||
Right now all the results you are getting back are being aggregated into a single timestamp bucket. What if we wanted to see our aggregations on a per minute basis? What field can we change in the query to accomplish this?
|
||||
|
||||
If you loudly exclaimed "we can change granularity to minute", you are absolutely correct again! We can specify different granularities to bucket our results, like so:
|
||||
|
||||
<pre><code>{
|
||||
"queryType":"timeseries",
|
||||
"dataSource":"twitterstream",
|
||||
"intervals":["2010-01-01/2020-01-01"],
|
||||
"granularity":"minute",
|
||||
"aggregations":[
|
||||
{ "type": "count", "name": "rows"},
|
||||
{ "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
|
||||
]
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
This gives us something like the following:
|
||||
|
||||
<pre><code>[ {
|
||||
"timestamp" : "2013-06-10T19:09:00.000Z",
|
||||
"result" : {
|
||||
"tweets" : 2650.0,
|
||||
"rows" : 2120
|
||||
}
|
||||
}, {
|
||||
"timestamp" : "2013-06-10T19:10:00.000Z",
|
||||
"result" : {
|
||||
"tweets" : 3401.0,
|
||||
"rows" : 2609
|
||||
}
|
||||
}, {
|
||||
"timestamp" : "2013-06-10T19:11:00.000Z",
|
||||
"result" : {
|
||||
"tweets" : 3472.0,
|
||||
"rows" : 2610
|
||||
}
|
||||
},
|
||||
...
|
||||
</code></pre>
|
||||
|
||||
h2. Solving a Problem
|
||||
|
||||
One of Druid's main powers (see what we did there?) is to provide answers to problems, so let's pose a problem. What if we wanted to know what the top hash tags are, ordered by the number tweets, where the language is english, over the last few minutes you've been reading this tutorial? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the "GroupByQuery":GroupByQuery.html. It would be nice if we could group by results by dimension value and somehow sort those results... and it turns out we can!
|
||||
|
||||
Let's create the file:
|
||||
<pre>group_by_query.body</pre>
|
||||
and put the following in there:
|
||||
<pre><code>{
|
||||
"queryType": "groupBy",
|
||||
"dataSource": "twitterstream",
|
||||
"granularity": "all",
|
||||
"dimensions": ["htags"],
|
||||
"orderBy": {"type":"default", "columns":[{"dimension": "tweets", "direction":"DESCENDING"}], "limit":5},
|
||||
"aggregations":[
|
||||
{ "type": "longSum", "fieldName": "tweets", "name": "tweets"}
|
||||
],
|
||||
"filter": {"type": "selector", "dimension": "lang", "value": "en" },
|
||||
"intervals":["2012-10-01T00:00/2020-01-01T00"]
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
Woah! Our query just got a way more complicated. Now we have these "Filters":Filters.html things and this "OrderBy":OrderBy.html thing. Fear not, it turns out the new objects we've introduced to our query can help define the format of our results and provide an answer to our question.
|
||||
|
||||
If you issue the query:
|
||||
<pre><code>curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json' -d @group_by_query.body</code></pre>
|
||||
|
||||
You should hopefully see an answer to our question. For my twitter stream, it looks like this:
|
||||
|
||||
<pre><code>[ {
|
||||
"version" : "v1",
|
||||
"timestamp" : "2012-10-01T00:00:00.000Z",
|
||||
"event" : {
|
||||
"tweets" : 2660,
|
||||
"htags" : "android"
|
||||
}
|
||||
}, {
|
||||
"version" : "v1",
|
||||
"timestamp" : "2012-10-01T00:00:00.000Z",
|
||||
"event" : {
|
||||
"tweets" : 1944,
|
||||
"htags" : "E3"
|
||||
}
|
||||
}, {
|
||||
"version" : "v1",
|
||||
"timestamp" : "2012-10-01T00:00:00.000Z",
|
||||
"event" : {
|
||||
"tweets" : 1927,
|
||||
"htags" : "15SueñosPendientes"
|
||||
}
|
||||
}, {
|
||||
"version" : "v1",
|
||||
"timestamp" : "2012-10-01T00:00:00.000Z",
|
||||
"event" : {
|
||||
"tweets" : 1717,
|
||||
"htags" : "ipad"
|
||||
}
|
||||
}, {
|
||||
"version" : "v1",
|
||||
"timestamp" : "2012-10-01T00:00:00.000Z",
|
||||
"event" : {
|
||||
"tweets" : 1515,
|
||||
"htags" : "IDidntTextYouBackBecause"
|
||||
}
|
||||
} ]
|
||||
</code></pre>
|
||||
|
||||
Feel free to tweak other query parameters to answer other questions you may have about the data.
|
||||
|
||||
h2. Additional Information
|
||||
|
||||
This tutorial is merely showcasing a small fraction of what Druid can do. Next, continue on to "Loading Your Data":./Loading-Your-Data.html.
|
||||
|
||||
And thus concludes our journey! Hopefully you learned a thing or two about Druid real-time ingestion, querying Druid, and how Druid can be used to solve problems. If you have additional questions, feel free to post in our "google groups page":http://www.groups.google.com/forum/#!forum/druid-development.
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
This page discusses how we do versioning and provides information on our stable releases.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
layout: default
|
||||
layout: doc_page
|
||||
---
|
||||
Druid uses ZooKeeper (ZK) for management of current cluster state. The operations that happen over ZK are
|
||||
|
||||
|
@ -11,11 +11,11 @@ Druid uses ZooKeeper (ZK) for management of current cluster state. The operation
|
|||
|
||||
ZooKeeper paths are set via the `runtime.properties` configuration file. Druid will automatically create paths that do not exist, so typos in config files is a very easy way to become split-brained.
|
||||
|
||||
There is a prefix path that is required and can be used as the only (well, kinda, see the note below) path-related zookeeper configuration parameter (everything else will be a default based on the prefix):
|
||||
There is a prefix path that is required and can be used as the only (well, kinda, see the note below) path-related zookeeper configuration parameter (everything else will be a doc_page based on the prefix):
|
||||
|
||||
druid.zk.paths.base
|
||||
|
||||
You can also override each individual path (defaults are shown below):
|
||||
You can also override each individual path (doc_pages are shown below):
|
||||
|
||||
druid.zk.paths.propertiesPath=${druid.zk.paths.base}/properties
|
||||
druid.zk.paths.announcementsPath=${druid.zk.paths.base}/announcements
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
---
|
||||
Contents
|
||||
\* [Introduction|Home](Introduction|Home.html)
|
||||
\* [Download](Download.html)
|
||||
\* [Support](Support.html)
|
||||
\* [Contribute](Contribute.html)
|
||||
========================
|
||||
|
||||
Getting Started
|
||||
\* [Tutorial: A First Look at Druid](Tutorial:-A-First-Look-at-Druid.html)
|
||||
\* [Tutorial: The Druid Cluster](Tutorial:-The-Druid-Cluster.html)
|
||||
\* [Loading Your Data](Loading-Your-Data.html)
|
||||
\* [Querying Your Data](Querying-Your-Data.html)
|
||||
\* [Booting a Production Cluster](Booting-a-Production-Cluster.html)
|
||||
\* [Examples](Examples.html)
|
||||
\* [Cluster Setup](Cluster-Setup.html)
|
||||
\* [Configuration](Configuration.html)
|
||||
--------------------------------------
|
||||
|
||||
Data Ingestion
|
||||
\* [Realtime](Realtime.html)
|
||||
\* [Batch|Batch Ingestion](Batch|Batch-Ingestion.html)
|
||||
\* [Indexing Service](Indexing-Service.html)
|
||||
----------------------------
|
||||
|
||||
Querying
|
||||
\* [Querying](Querying.html)
|
||||
**\* ]
|
||||
**\* [Aggregations](Aggregations.html)
|
||||
**\* ]
|
||||
**\* [Granularities](Granularities.html)
|
||||
\* Query Types
|
||||
**\* ]
|
||||
****\* ]
|
||||
****\* ]
|
||||
**\* [SearchQuery](SearchQuery.html)
|
||||
**\* ]
|
||||
** [SegmentMetadataQuery](SegmentMetadataQuery.html)
|
||||
**\* ]
|
||||
**\* [TimeseriesQuery](TimeseriesQuery.html)
|
||||
---------------------------
|
||||
|
||||
Architecture
|
||||
\* [Design](Design.html)
|
||||
\* [Segments](Segments.html)
|
||||
\* Node Types
|
||||
**\* ]
|
||||
**\* [Broker](Broker.html)
|
||||
**\* ]
|
||||
****\* ]
|
||||
**\* [Realtime](Realtime.html)
|
||||
**\* ]
|
||||
**\* [Plumber](Plumber.html)
|
||||
\* External Dependencies
|
||||
**\* ]
|
||||
**\* [MySQL](MySQL.html)
|
||||
**\* ]
|
||||
** [Concepts and Terminology](Concepts-and-Terminology.html)
|
||||
-------------------------------
|
||||
|
||||
Development
|
||||
\* [Versioning](Versioning.html)
|
||||
\* [Build From Source](Build-From-Source.html)
|
||||
\* [Libraries](Libraries.html)
|
||||
------------------------
|
||||
|
||||
Misc
|
||||
\* [Thanks](Thanks.html)
|
||||
-------------
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
---
|
||||
|
||||
* [Introduction|Home](Introduction|Home.html)
|
||||
* [Download](Download.html)
|
||||
* [Support](Support.html)
|
||||
* [Contribute](Contribute.html)
|
||||
========================
|
||||
|
||||
Getting Started
|
||||
* [Tutorial: A First Look at Druid](Tutorial:-A-First-Look-at-Druid.html)
|
||||
* [Tutorial: The Druid Cluster](Tutorial:-The-Druid-Cluster.html)
|
||||
* [Loading Your Data](Loading-Your-Data.html)
|
||||
* [Querying Your Data](Querying-Your-Data.html)
|
||||
* [Booting a Production Cluster](Booting-a-Production-Cluster.html)
|
||||
* [Examples](Examples.html)
|
||||
* [Cluster Setup](Cluster-Setup.html)
|
||||
* [Configuration](Configuration.html)
|
||||
--------------------------------------
|
||||
|
||||
Data Ingestion
|
||||
* [Realtime](Realtime.html)
|
||||
* [Batch|Batch Ingestion](Batch|Batch-Ingestion.html)
|
||||
* [Indexing Service](Indexing-Service.html)
|
||||
----------------------------
|
||||
|
||||
Querying
|
||||
* [Querying](Querying.html)
|
||||
*** ]
|
||||
*** [Aggregations](Aggregations.html)
|
||||
*** ]
|
||||
*** [Granularities](Granularities.html)
|
||||
* Query Types
|
||||
*** ]
|
||||
***** ]
|
||||
***** ]
|
||||
*** [SearchQuery](SearchQuery.html)
|
||||
*** ]
|
||||
** [SegmentMetadataQuery](SegmentMetadataQuery.html)
|
||||
*** ]
|
||||
*** [TimeseriesQuery](TimeseriesQuery.html)
|
||||
---------------------------
|
||||
|
||||
Architecture
|
||||
* [Design](Design.html)
|
||||
* [Segments](Segments.html)
|
||||
* Node Types
|
||||
*** ]
|
||||
*** [Broker](Broker.html)
|
||||
*** ]
|
||||
***** ]
|
||||
*** [Realtime](Realtime.html)
|
||||
*** ]
|
||||
*** [Plumber](Plumber.html)
|
||||
* External Dependencies
|
||||
*** ]
|
||||
*** [MySQL](MySQL.html)
|
||||
*** ]
|
||||
** [Concepts and Terminology](Concepts-and-Terminology.html)
|
||||
-------------------------------
|
||||
|
||||
Development
|
||||
* [Versioning](Versioning.html)
|
||||
* [Build From Source](Build-From-Source.html)
|
||||
* [Libraries](Libraries.html)
|
||||
------------------------
|
||||
|
||||
Misc
|
||||
* [Thanks](Thanks.html)
|
||||
-------------
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -1,592 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'Conv_framd';
|
||||
src: url('../fonts/framd.eot');
|
||||
src: url('../fonts/framd.eot?#iefix') format('embedded-opentype'),
|
||||
url('../fonts/framd.woff') format('woff'),
|
||||
url('../fonts/framd.ttf') format('truetype'),
|
||||
url('../fonts/framd.svg#heroregular') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
html, body {
|
||||
position:relative;
|
||||
height:100%;
|
||||
min-height:100%;
|
||||
height:100%;
|
||||
color:#252525;
|
||||
font:400 18px/26px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
padding:0;
|
||||
margin:0;
|
||||
word-wrap:break-word;
|
||||
}
|
||||
a {
|
||||
color:#6ab6dd;
|
||||
position:relative;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration:underline;
|
||||
color:#2c79a1;
|
||||
}
|
||||
.wrapper {
|
||||
min-height:100%;
|
||||
}
|
||||
header {
|
||||
margin:0 0 100px;
|
||||
}
|
||||
header .span12 {
|
||||
padding:0 0 7px 0;
|
||||
}
|
||||
.logo.custom {
|
||||
display:inline-block;
|
||||
margin:0;
|
||||
vertical-align:25px;
|
||||
}
|
||||
.logo.custom a {
|
||||
background:url(../img/logo.png) no-repeat;
|
||||
width: 110px;
|
||||
height: 49px;
|
||||
display:block;
|
||||
text-indent:-9999px;
|
||||
}
|
||||
.custom.navbar {
|
||||
margin:10px 0;
|
||||
}
|
||||
.custom.navbar .nav li {
|
||||
padding:0 !important;
|
||||
}
|
||||
.custom.navbar .nav li a, .navbar .brand, .custom.navbar .nav li.pull-right span {
|
||||
font:300 14px/20px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
padding:10px 10px;
|
||||
}
|
||||
.navbar .brand.active {
|
||||
color:#fff;
|
||||
}
|
||||
.custom.navbar .nav li.pull-right span {
|
||||
padding-right:0;
|
||||
color:#e76d4c !important;
|
||||
display:block;
|
||||
}
|
||||
.custom.navbar .nav li a.doc-link {
|
||||
padding:5px 10px 0;
|
||||
}
|
||||
.custom.navbar .nav li a.doc-link span {
|
||||
display:inline-block;
|
||||
background:url(../img/icon-git.png) no-repeat;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
vertical-align:-7px;
|
||||
margin-left:5px;
|
||||
}
|
||||
.custom.navbar .nav li a.doc-link:hover span, .custom.navbar .nav li.active a.doc-link span {
|
||||
background-position:0 -28px;
|
||||
}
|
||||
.custom.navbar .nav {
|
||||
float:none;
|
||||
}
|
||||
.navbar .nav > li.pull-right {
|
||||
float:right;
|
||||
padding:10px 0;
|
||||
}
|
||||
h1 {
|
||||
font:300 48px/48px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
margin:0 0 45px;
|
||||
}
|
||||
h1.index {
|
||||
text-align:center;
|
||||
}
|
||||
h1 span {
|
||||
display:block;
|
||||
font:400 14px/28px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
}
|
||||
h2 {
|
||||
font:30px/30px 'Conv_framd', Arial, Helvetica, sans-serif;
|
||||
margin:0 0 20px;
|
||||
color:#0f1e35;
|
||||
}
|
||||
h3 {
|
||||
font:300 30px/36px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
margin:0 0 33px;
|
||||
text-align:center;
|
||||
}
|
||||
.btn {
|
||||
display:block;
|
||||
margin:0 auto 65px;
|
||||
background:#6ab6dd;
|
||||
border:none;
|
||||
box-shadow:inset -3px -3px 3px #5592b1;
|
||||
height:53px;
|
||||
width:205px;
|
||||
font:30px/53px 'Conv_framd', Arial, Helvetica, sans-serif;
|
||||
color:#252424;
|
||||
text-shadow:none;
|
||||
padding:0;
|
||||
z-index:100;
|
||||
position:relative;
|
||||
}
|
||||
.btn a {
|
||||
color:#252424;
|
||||
}
|
||||
.btn:hover {
|
||||
background:#83c6e9;
|
||||
}
|
||||
.index-content {
|
||||
margin:0 auto 60px;
|
||||
text-align:center;
|
||||
}
|
||||
.third {
|
||||
margin:0 auto 35px;
|
||||
}
|
||||
.third-item {
|
||||
text-align:left;
|
||||
}
|
||||
.third-item:first-child {
|
||||
margin:0;
|
||||
}
|
||||
.third-item a {
|
||||
display:block;
|
||||
font-family:'Open Sans', Arial, Helvetica, sans-serif;
|
||||
font-weight:700;
|
||||
font-size:30px;
|
||||
margin:0 auto 20px;
|
||||
color:#252424;
|
||||
text-align:center;
|
||||
}
|
||||
.container.custom {
|
||||
padding:0;
|
||||
margin:0 auto;
|
||||
}
|
||||
.container.custom.main-cont {
|
||||
padding-bottom:230px;
|
||||
}
|
||||
.text-part {
|
||||
padding-top:70px;
|
||||
}
|
||||
.row-fluid.index-page {
|
||||
padding-top:100px;
|
||||
}
|
||||
.index-page .content {
|
||||
padding:15px 0 0;
|
||||
}
|
||||
.index-page h3 {
|
||||
text-align:left;
|
||||
}
|
||||
.index-page .sidebar {
|
||||
padding:65px 0 30px;
|
||||
}
|
||||
.container.custom p {
|
||||
margin:0 0 17px;
|
||||
}
|
||||
.homepage .index-page .content h2 {
|
||||
margin:0 0 20px;
|
||||
}
|
||||
.container.custom .unstyled {
|
||||
margin:0;
|
||||
color:#353535;
|
||||
}
|
||||
.container.custom .unstyled li {
|
||||
margin:0 0 17px;
|
||||
}
|
||||
.container.custom .unstyled li span {
|
||||
font-family:'Open Sans', Arial, Helvetica, sans-serif;
|
||||
font-weight:700;
|
||||
display:block;
|
||||
}
|
||||
.container.custom .unstyled li a {
|
||||
display:inline;
|
||||
}
|
||||
.homepage h4 {
|
||||
font:24px/24px 'Conv_framd', Arial, Helvetica, sans-serif;
|
||||
margin:0 0 15px;
|
||||
}
|
||||
.container.custom .sidebar .unstyled {
|
||||
margin:0 0 100px;
|
||||
}
|
||||
.container.custom .sidebar .unstyled li {
|
||||
margin:0 0 12px;
|
||||
border-bottom:1px solid #adadad;
|
||||
padding: 5px 7px;
|
||||
}
|
||||
.grey-box {
|
||||
background:#e5e4e3;
|
||||
border-radius:3px;
|
||||
-moz-border-radius:3px;
|
||||
-webkit-border-radius:3px;
|
||||
position:relative;
|
||||
padding:20px 10px 130px;
|
||||
color:#000;
|
||||
}
|
||||
footer {
|
||||
text-align:center;
|
||||
font-size:14px;
|
||||
color:#000;
|
||||
margin:-135px 0 0;
|
||||
}
|
||||
footer .container.custom {
|
||||
border-top:1px solid #e1e1e1;
|
||||
padding:20px 0 25px;
|
||||
}
|
||||
footer .span9 {
|
||||
text-align:left;
|
||||
}
|
||||
footer .container.custom ul.unstyled {
|
||||
display:inline-block;
|
||||
margin:0 120px 30px 30px;
|
||||
text-align:left;
|
||||
vertical-align:top;
|
||||
}
|
||||
footer .container.custom ul.unstyled li {
|
||||
font:300 14px/26px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
margin:0;
|
||||
}
|
||||
footer .container.custom .unstyled li a {
|
||||
color:#000;
|
||||
font-weight:300;
|
||||
}
|
||||
footer .container.custom .unstyled li:first-child a {
|
||||
font-weight:400;
|
||||
}
|
||||
footer ul li a:hover {
|
||||
text-decoration:underline;
|
||||
color:#fff;
|
||||
}
|
||||
footer .logo-block {
|
||||
text-align:right;
|
||||
}
|
||||
footer .container.custom p {
|
||||
display:inline-block;
|
||||
margin:28px 0 0 10px;
|
||||
text-align:left;
|
||||
}
|
||||
.contact-item {
|
||||
margin:0 0 30px 30px;
|
||||
text-align:left;
|
||||
font-weight:300;
|
||||
}
|
||||
.contact-item a {
|
||||
color:#000;
|
||||
}
|
||||
footer .contact-item span {
|
||||
font-weight:400;
|
||||
display:block;
|
||||
}
|
||||
footer .contact-item:first-child span {
|
||||
text-transform:uppercase;
|
||||
}
|
||||
footer .span4 {
|
||||
text-align:left;
|
||||
}
|
||||
footer .span5 {
|
||||
padding-top: 75px;
|
||||
}
|
||||
.soc {
|
||||
text-align:left;
|
||||
margin:5px 0 0 0;
|
||||
}
|
||||
.soc a {
|
||||
display:inline-block;
|
||||
width:35px;
|
||||
height:34px;
|
||||
background:url(../img/icons-soc.png) no-repeat;
|
||||
}
|
||||
.soc a.github {
|
||||
background-position:0 -34px;
|
||||
}
|
||||
.soc a.meet {
|
||||
background-position:0 -68px;
|
||||
}
|
||||
.soc a.rss {
|
||||
background-position:0 -102px;
|
||||
}
|
||||
|
||||
.text-item {
|
||||
margin:0 0 75px;
|
||||
}
|
||||
.container.custom p.note {
|
||||
text-align:center;
|
||||
padding:30px 0 0;
|
||||
}
|
||||
.text-item strong {
|
||||
font-weight:normal;
|
||||
font-family:'Open Sans', Arial, Helvetica, sans-serif;
|
||||
font-weight:700;
|
||||
}
|
||||
h2.date {
|
||||
font-family:'Open Sans', Arial, Helvetica, sans-serif;
|
||||
font-weight:400;
|
||||
}
|
||||
.blog h2.date {
|
||||
margin:0 0 25px;
|
||||
}
|
||||
h2.date span {
|
||||
display:block;
|
||||
margin:0 0 5px;
|
||||
padding:0 0 15px;
|
||||
font-size:20px;
|
||||
border-bottom:1px solid #ccc;
|
||||
}
|
||||
.blog h2.date a {
|
||||
font-weight:700;
|
||||
}
|
||||
.blog.inner h2.date span:first-child {
|
||||
display:block;
|
||||
font-size:30px;
|
||||
font-weight:700;
|
||||
padding:0;
|
||||
border:none;
|
||||
}
|
||||
.blog.inner h3 {
|
||||
text-align:left;
|
||||
font-size:25px;
|
||||
font-weight:700;
|
||||
margin:0 0 15px;
|
||||
}
|
||||
.blog.inner ul li {
|
||||
margin-left: 50px;
|
||||
line-height:26px;
|
||||
}
|
||||
.recent h3 {
|
||||
font-size: 25px;
|
||||
font-weight: 700;
|
||||
margin: 0 0 15px;
|
||||
text-align: left;
|
||||
}
|
||||
.recent ul li.active a {
|
||||
color:#252525;
|
||||
}
|
||||
.border {
|
||||
width:130px;
|
||||
margin: 45px auto;
|
||||
border-top:1px solid #dfdfdf;
|
||||
border-top:1px solid #81807f;
|
||||
}
|
||||
.text-img {
|
||||
display:block;
|
||||
margin:0 auto 17px;
|
||||
}
|
||||
.indent p, .indent ul {
|
||||
padding:0 0 0 50px;
|
||||
}
|
||||
.span3 {
|
||||
margin-left:0;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav {
|
||||
border:1px solid #e5e5e5;
|
||||
border-radius:5px;
|
||||
box-shadow:0 0 3px #f9f9f9;
|
||||
padding:0;
|
||||
width:auto;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav li {
|
||||
border-top:1px solid #e5e5e5;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav li:first-child {
|
||||
border:none;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav li:first-child a {
|
||||
border-radius:5px 5px 0 0;
|
||||
-moz-border-radius:5px 5px 0 0;
|
||||
-webkit-border-radius:5px 5px 0 0;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav li:last-child, .nav.nav-list.bs-docs-sidenav li:last-child a {
|
||||
border-radius:0 0 5px 5px;
|
||||
-moz-border-radius:0 0 5px 5px;
|
||||
-webkit-border-radius:0 0 5px 5px;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav li a {
|
||||
padding:10px;
|
||||
margin:0;
|
||||
font-weight:400;
|
||||
font-size:14px;
|
||||
line-height:18px;
|
||||
}
|
||||
.icon-chevron-right {
|
||||
float: right;
|
||||
margin-right: -6px;
|
||||
margin-top: 2px;
|
||||
opacity: 0.25;
|
||||
}
|
||||
.indent ul li {
|
||||
line-height:26px;
|
||||
}
|
||||
.span8 h3 {
|
||||
text-align:left;
|
||||
margin:0 0 50px;
|
||||
}
|
||||
.span8 h3 a {
|
||||
font-weight:800;
|
||||
}
|
||||
.span8 h4 {
|
||||
font:700 18px/26px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
margin:0 0 20px;
|
||||
}
|
||||
.span8 p span {
|
||||
font-weight:700;
|
||||
}
|
||||
header.index-head {
|
||||
background:#f9f9f9;
|
||||
margin:0 0 30px;
|
||||
}
|
||||
header.index-head .span12 {
|
||||
margin-bottom:80px;
|
||||
}
|
||||
.index-content h2 {
|
||||
text-align:center;
|
||||
}
|
||||
.third-item img {
|
||||
display:block;
|
||||
margin:0 auto 70px;
|
||||
}
|
||||
.container.custom .third-item p {
|
||||
margin:0 0 0 20px;
|
||||
}
|
||||
.row-fluid {
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
.nav-list [class^="icon-"] {
|
||||
margin-right:-2px;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
.custom.navbar .nav li a, .navbar .brand, .custom.navbar .nav li.pull-right span {
|
||||
padding: 10px 20px;
|
||||
font-size:16px;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav {
|
||||
width:258px;
|
||||
}
|
||||
.container.custom .recent ul.unstyled {
|
||||
margin-right:100px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 980px) {
|
||||
.container.custom {
|
||||
width:95%;
|
||||
}
|
||||
.bs-docs-sidenav.affix {
|
||||
position: static;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav {
|
||||
width:100%;
|
||||
margin-bottom:20px;
|
||||
}
|
||||
}
|
||||
@media only screen
|
||||
and (min-device-width : 710px)
|
||||
and (max-device-width : 770px) {
|
||||
.container.custom {
|
||||
width:700px;
|
||||
position:relative;
|
||||
}
|
||||
.custom.navbar .nav li {
|
||||
font-size:22px;
|
||||
padding:0 10px;
|
||||
}
|
||||
.nav.nav-list.bs-docs-sidenav.affix {
|
||||
position:fixed;
|
||||
top:175px;
|
||||
width:218px;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-device-width : 770px)
|
||||
and (max-device-width : 810px) {
|
||||
.container.custom {
|
||||
width:700px;
|
||||
}
|
||||
.custom.navbar .nav li {
|
||||
font-size:15px;
|
||||
padding:0 15px;
|
||||
}
|
||||
.custom.navbar .nav {
|
||||
margin-left:30px;
|
||||
}
|
||||
}
|
||||
@media only screen
|
||||
and (min-device-width : 320px)
|
||||
and (max-device-width : 480px) {
|
||||
.container.custom {
|
||||
width:100%;
|
||||
margin:0;
|
||||
}
|
||||
footer .logo-block {
|
||||
text-align: left;
|
||||
padding-left:30px;
|
||||
}
|
||||
.offset1, .row-fluid .offset1:first-child {
|
||||
margin:0;
|
||||
}
|
||||
.indent p, .indent ul {
|
||||
padding:0;
|
||||
}
|
||||
.indent, .blog, .recent h3, .recent ul, .text-part {
|
||||
padding:0 20px;
|
||||
}
|
||||
.index-head h3 {
|
||||
font-size:20px;
|
||||
}
|
||||
.index-content {
|
||||
padding:0 20px;
|
||||
}
|
||||
.content h2, .content h3, .content ul.unstyled, .sidebar h3 {
|
||||
padding:0 20px;
|
||||
}
|
||||
h1 {
|
||||
padding:0 20px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 320px) {
|
||||
.container.custom {
|
||||
width:100%;
|
||||
}
|
||||
footer .logo-block {
|
||||
text-align: left;
|
||||
padding-left:30px;
|
||||
}
|
||||
footer .container.custom p {
|
||||
margin-top:10px;
|
||||
}
|
||||
.offset1, .row-fluid .offset1:first-child {
|
||||
margin:0;
|
||||
}
|
||||
.indent p, .indent ul {
|
||||
padding:0;
|
||||
}
|
||||
.indent, .blog, .recent h3, .recent ul, .text-part {
|
||||
padding:0 20px;
|
||||
}
|
||||
.index-head h3 {
|
||||
font-size:25px;
|
||||
line-height:30px;
|
||||
padding:0 20px;
|
||||
}
|
||||
.index-content {
|
||||
padding:0 20px;
|
||||
}
|
||||
.content h2, .content h3, .content ul.unstyled, .sidebar h3 {
|
||||
padding:0 20px;
|
||||
}
|
||||
h1 {
|
||||
padding:0 20px;
|
||||
}
|
||||
}
|
||||
.container.custom .faq-page p {
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.index-head h3 {
|
||||
margin-bottom:50px;
|
||||
}
|
||||
h1.center {
|
||||
text-align:center;
|
||||
}
|
||||
.btn.btn-navbar {
|
||||
height:auto;
|
||||
width:auto;
|
||||
margin:10px 0 0;
|
||||
}
|
||||
.navbar-inner {
|
||||
z-index:100000;
|
||||
position:relative;
|
||||
}
|
|
@ -1,147 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Druid | {{page.title}}</title>
|
||||
<link rel="stylesheet" type="text/css" href="/css/bootstrap.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/bootstrap-responsive.css" media="all" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/syntax.css" media="all" />
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,300,700,800' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="/css/custom.css" media="all" />
|
||||
<link rel="alternate" type="application/atom+xml" href="http://druid.io/feed">
|
||||
<script src="http://code.jquery.com/jquery.js"></script>
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header{% if page.id == 'home' %} class="index-head"{% endif %}>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span12">
|
||||
<div class="navbar navbar-inverse custom">
|
||||
<div class="navbar-inner">
|
||||
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="brand {% if page.id == 'home' %}active{% endif %}" href="/">Home</a>
|
||||
<div class="nav-collapse collapse">
|
||||
<ul class="nav">
|
||||
<li {% if page.sectionid == 'druid' %} class="active"{% endif %}>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'downloads' %} class="active"{% endif %}>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'docs' %} class="active"{% endif %}>
|
||||
<a class="doc-link" target="_blank" href="https://github.com/metamx/druid/wiki">Documentation <span></span></a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'community' %} class="active"{% endif %}>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'faq' %} class="active"{% endif %}>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li {% if page.sectionid == 'blog' %} class="active"{% endif %}>
|
||||
<a href="/blog">Blog</a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<span>BETA</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if page.id == 'home' %}
|
||||
<h3>Druid is open-source infrastructure for real²time exploratory analytics on large datasets.</h3>
|
||||
<button class="btn" type="button"><a href="downloads.html">Download</a></button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</header>
|
||||
<div class="container custom main-cont">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="container custom">
|
||||
<div class="row-fluid">
|
||||
<div class="span3">
|
||||
<div class="contact-item">
|
||||
<span>CONTACT US</span>
|
||||
<a href="mailto:info@druid.io">info@druid.io</a>
|
||||
</div>
|
||||
<div class="contact-item">
|
||||
<span>Metamarkets</span>
|
||||
625 2nd Street, Suite #230<br/>
|
||||
San Francisco, CA 94017
|
||||
<div class="soc">
|
||||
<a href="https://twitter.com/druidio"></a>
|
||||
<a href="https://github.com/metamx/druid" class="github"></a>
|
||||
<a href="http://www.meetup.com/Open-Druid/" class="meet"></a>
|
||||
<a href="http://druid.io/feed/" class="rss" target="_blank"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span9">
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/">DRUID</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/druid.html">What is Druid?</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/downloads.html">Downloads</a>
|
||||
</li>
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/metamx/druid/wiki">Documentation </a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/community.html">SUPPORT</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/community.html">Community</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/faq.html">FAQ</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/licensing.html">Licensing</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="unstyled">
|
||||
<li>
|
||||
<a href="/blog">BLOG</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="logo-block">
|
||||
<span class="logo custom">
|
||||
<a href="/"></a>
|
||||
</span>
|
||||
<p>is an open source project sponsored by<br/> Metamarkets.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-40280432-1");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
.doc-content pre, .doc-content pre code {
|
||||
overflow: auto;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
}
|
||||
|
||||
.doc-content p {
|
||||
padding: 8px 0 8px 0;
|
||||
}
|
||||
|
||||
/*** HACK: This is a horrible hack, but I have no clue why images don't want to stay in the container **/
|
||||
.doc-content img {
|
||||
max-width: 847.5px;
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
---
|
||||
<div class="row-fluid">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
|
@ -1,160 +0,0 @@
|
|||
/*****************************************************************************/
|
||||
/*
|
||||
/* Common
|
||||
/*
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Global Reset */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html, body { height: 100%; }
|
||||
|
||||
body {
|
||||
background-color: #FFF;
|
||||
font: 13.34px Helvetica, Arial, sans-serif;
|
||||
font-size: small;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 100%; }
|
||||
|
||||
h1 { margin-bottom: 1em; }
|
||||
p { margin: 1em 0; }
|
||||
|
||||
a { color: #00a; }
|
||||
a:hover { color: #000; }
|
||||
a:visited { color: #a0a; }
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
/* Home
|
||||
/*
|
||||
/*****************************************************************************/
|
||||
ul.posts {
|
||||
list-style-type: none;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
ul.posts li {
|
||||
line-height: 1.75em;
|
||||
}
|
||||
|
||||
ul.posts span {
|
||||
color: #aaa;
|
||||
font-family: Monaco, "Courier New", monospace;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
/* Site
|
||||
/*
|
||||
/*****************************************************************************/
|
||||
|
||||
.site {
|
||||
font-size: 115%;
|
||||
text-align: justify;
|
||||
width: 42em;
|
||||
margin: 3em auto 2em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
.site .header a {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.site .header h1.title {
|
||||
display: inline-block;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.site .header h1.title a {
|
||||
color: #a00;
|
||||
}
|
||||
|
||||
.site .header h1.title a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.site .header a.extra {
|
||||
color: #aaa;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
.site .header a.extra:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.site .meta {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.site .footer {
|
||||
font-size: 80%;
|
||||
color: #666;
|
||||
border-top: 4px solid #eee;
|
||||
margin-top: 2em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.site .footer .contact {
|
||||
float: left;
|
||||
margin-right: 3em;
|
||||
}
|
||||
|
||||
.site .footer .contact a {
|
||||
color: #8085C1;
|
||||
}
|
||||
|
||||
.site .footer .rss {
|
||||
margin-top: 1.1em;
|
||||
margin-right: -.2em;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.site .footer .rss img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
/* Posts
|
||||
/*
|
||||
/*****************************************************************************/
|
||||
|
||||
/* standard */
|
||||
.post pre {
|
||||
border: 1px solid #ddd;
|
||||
background-color: #eef;
|
||||
padding: 0 .4em;
|
||||
}
|
||||
|
||||
.post ul, .post ol {
|
||||
margin-left: 1.35em;
|
||||
}
|
||||
|
||||
.post code {
|
||||
border: 1px solid #ddd;
|
||||
background-color: #eef;
|
||||
padding: 0 .2em;
|
||||
}
|
||||
|
||||
.post pre code {
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* terminal */
|
||||
.post pre.terminal {
|
||||
border: 1px solid #000;
|
||||
background-color: #333;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.post pre.terminal code {
|
||||
background-color: #333;
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
---
|
||||
|
||||
<div class="row-fluid">
|
||||
<div class="span10 offset1{% if page.id != 'home' %} simple-page{% endif %}{% if page.sectionid == 'faq' %} faq-page{% endif %}">
|
||||
|
||||
{{ content }}
|
||||
|
||||
</div>
|
||||
</div>
|
|
@ -1,96 +0,0 @@
|
|||
<!--
|
||||
PIE: CSS3 rendering for IE
|
||||
Version 1.0.0
|
||||
http://css3pie.com
|
||||
Dual-licensed for use under the Apache License Version 2.0 or the General Public License (GPL) Version 2.
|
||||
-->
|
||||
<PUBLIC:COMPONENT lightWeight="true">
|
||||
<!-- saved from url=(0014)about:internet -->
|
||||
<PUBLIC:ATTACH EVENT="oncontentready" FOR="element" ONEVENT="init()" />
|
||||
<PUBLIC:ATTACH EVENT="ondocumentready" FOR="element" ONEVENT="init()" />
|
||||
<PUBLIC:ATTACH EVENT="ondetach" FOR="element" ONEVENT="cleanup()" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var doc = element.document;var f=window.PIE;
|
||||
if(!f){f=window.PIE={F:"-pie-",nb:"Pie",La:"pie_",Ac:{TD:1,TH:1},cc:{TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,IMG:1,HR:1},fc:{A:1,INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1},Gd:{submit:1,button:1,reset:1},aa:function(){}};try{doc.execCommand("BackgroundImageCache",false,true)}catch(aa){}for(var ba=4,Z=doc.createElement("div"),ca=Z.getElementsByTagName("i"),ga;Z.innerHTML="<!--[if gt IE "+ ++ba+"]><i></i><![endif]--\>",ca[0];);f.O=ba;if(ba===6)f.F=f.F.replace(/^-/,"");f.ja=
|
||||
doc.documentMode||f.O;Z.innerHTML='<v:shape adj="1"/>';ga=Z.firstChild;ga.style.behavior="url(#default#VML)";f.zc=typeof ga.adj==="object";(function(){var a,b=0,c={};f.p={Za:function(d){if(!a){a=doc.createDocumentFragment();a.namespaces.add("css3vml","urn:schemas-microsoft-com:vml")}return a.createElement("css3vml:"+d)},Ba:function(d){return d&&d._pieId||(d._pieId="_"+ ++b)},Eb:function(d){var e,g,j,i,h=arguments;e=1;for(g=h.length;e<g;e++){i=h[e];for(j in i)if(i.hasOwnProperty(j))d[j]=i[j]}return d},
|
||||
Rb:function(d,e,g){var j=c[d],i,h;if(j)Object.prototype.toString.call(j)==="[object Array]"?j.push([e,g]):e.call(g,j);else{h=c[d]=[[e,g]];i=new Image;i.onload=function(){j=c[d]={h:i.width,f:i.height};for(var k=0,n=h.length;k<n;k++)h[k][0].call(h[k][1],j);i.onload=null};i.src=d}}}})();f.Na={gc:function(a,b,c,d){function e(){k=j>=90&&j<270?b:0;n=j<180?c:0;m=b-k;p=c-n}function g(){for(;j<0;)j+=360;j%=360}var j=d.sa;d=d.zb;var i,h,k,n,m,p,r,t;if(d){d=d.coords(a,b,c);i=d.x;h=d.y}if(j){j=j.jd();g();e();
|
||||
if(!d){i=k;h=n}d=f.Na.tc(i,h,j,m,p);a=d[0];d=d[1]}else if(d){a=b-i;d=c-h}else{i=h=a=0;d=c}r=a-i;t=d-h;if(j===void 0){j=!r?t<0?90:270:!t?r<0?180:0:-Math.atan2(t,r)/Math.PI*180;g();e()}return{sa:j,xc:i,yc:h,td:a,ud:d,Wd:k,Xd:n,rd:m,sd:p,kd:r,ld:t,rc:f.Na.dc(i,h,a,d)}},tc:function(a,b,c,d,e){if(c===0||c===180)return[d,b];else if(c===90||c===270)return[a,e];else{c=Math.tan(-c*Math.PI/180);a=c*a-b;b=-1/c;d=b*d-e;e=b-c;return[(d-a)/e,(c*d-b*a)/e]}},dc:function(a,b,c,d){a=c-a;b=d-b;return Math.abs(a===0?
|
||||
b:b===0?a:Math.sqrt(a*a+b*b))}};f.ea=function(){this.Gb=[];this.oc={}};f.ea.prototype={ba:function(a){var b=f.p.Ba(a),c=this.oc,d=this.Gb;if(!(b in c)){c[b]=d.length;d.push(a)}},Ha:function(a){a=f.p.Ba(a);var b=this.oc;if(a&&a in b){delete this.Gb[b[a]];delete b[a]}},xa:function(){for(var a=this.Gb,b=a.length;b--;)a[b]&&a[b]()}};f.Oa=new f.ea;f.Oa.Rd=function(){var a=this,b;if(!a.Sd){b=doc.documentElement.currentStyle.getAttribute(f.F+"poll-interval")||250;(function c(){a.xa();setTimeout(c,b)})();
|
||||
a.Sd=1}};(function(){function a(){f.L.xa();window.detachEvent("onunload",a);window.PIE=null}f.L=new f.ea;window.attachEvent("onunload",a);f.L.ta=function(b,c,d){b.attachEvent(c,d);this.ba(function(){b.detachEvent(c,d)})}})();f.Qa=new f.ea;f.L.ta(window,"onresize",function(){f.Qa.xa()});(function(){function a(){f.mb.xa()}f.mb=new f.ea;f.L.ta(window,"onscroll",a);f.Qa.ba(a)})();(function(){function a(){c=f.kb.md()}function b(){if(c){for(var d=0,e=c.length;d<e;d++)f.attach(c[d]);c=0}}var c;if(f.ja<9){f.L.ta(window,
|
||||
"onbeforeprint",a);f.L.ta(window,"onafterprint",b)}})();f.lb=new f.ea;f.L.ta(doc,"onmouseup",function(){f.lb.xa()});f.he=function(){function a(h){this.Y=h}var b=doc.createElement("length-calc"),c=doc.body||doc.documentElement,d=b.style,e={},g=["mm","cm","in","pt","pc"],j=g.length,i={};d.position="absolute";d.top=d.left="-9999px";for(c.appendChild(b);j--;){d.width="100"+g[j];e[g[j]]=b.offsetWidth/100}c.removeChild(b);d.width="1em";a.prototype={Kb:/(px|em|ex|mm|cm|in|pt|pc|%)$/,ic:function(){var h=
|
||||
this.Jd;if(h===void 0)h=this.Jd=parseFloat(this.Y);return h},yb:function(){var h=this.ae;if(!h)h=this.ae=(h=this.Y.match(this.Kb))&&h[0]||"px";return h},a:function(h,k){var n=this.ic(),m=this.yb();switch(m){case "px":return n;case "%":return n*(typeof k==="function"?k():k)/100;case "em":return n*this.xb(h);case "ex":return n*this.xb(h)/2;default:return n*e[m]}},xb:function(h){var k=h.currentStyle.fontSize,n,m;if(k.indexOf("px")>0)return parseFloat(k);else if(h.tagName in f.cc){m=this;n=h.parentNode;
|
||||
return f.n(k).a(n,function(){return m.xb(n)})}else{h.appendChild(b);k=b.offsetWidth;b.parentNode===h&&h.removeChild(b);return k}}};f.n=function(h){return i[h]||(i[h]=new a(h))};return a}();f.Ja=function(){function a(e){this.X=e}var b=f.n("50%"),c={top:1,center:1,bottom:1},d={left:1,center:1,right:1};a.prototype={zd:function(){if(!this.ac){var e=this.X,g=e.length,j=f.v,i=j.qa,h=f.n("0");i=i.na;h=["left",h,"top",h];if(g===1){e.push(new j.ob(i,"center"));g++}if(g===2){i&(e[0].k|e[1].k)&&e[0].d in c&&
|
||||
e[1].d in d&&e.push(e.shift());if(e[0].k&i)if(e[0].d==="center")h[1]=b;else h[0]=e[0].d;else if(e[0].W())h[1]=f.n(e[0].d);if(e[1].k&i)if(e[1].d==="center")h[3]=b;else h[2]=e[1].d;else if(e[1].W())h[3]=f.n(e[1].d)}this.ac=h}return this.ac},coords:function(e,g,j){var i=this.zd(),h=i[1].a(e,g);e=i[3].a(e,j);return{x:i[0]==="right"?g-h:h,y:i[2]==="bottom"?j-e:e}}};return a}();f.Ka=function(){function a(b,c){this.h=b;this.f=c}a.prototype={a:function(b,c,d,e,g){var j=this.h,i=this.f,h=c/d;e=e/g;if(j===
|
||||
"contain"){j=e>h?c:d*e;i=e>h?c/e:d}else if(j==="cover"){j=e<h?c:d*e;i=e<h?c/e:d}else if(j==="auto"){i=i==="auto"?g:i.a(b,d);j=i*e}else{j=j.a(b,c);i=i==="auto"?j/e:i.a(b,d)}return{h:j,f:i}}};a.Kc=new a("auto","auto");return a}();f.Ec=function(){function a(b){this.Y=b}a.prototype={Kb:/[a-z]+$/i,yb:function(){return this.ad||(this.ad=this.Y.match(this.Kb)[0].toLowerCase())},jd:function(){var b=this.Vc,c;if(b===undefined){b=this.yb();c=parseFloat(this.Y,10);b=this.Vc=b==="deg"?c:b==="rad"?c/Math.PI*180:
|
||||
b==="grad"?c/400*360:b==="turn"?c*360:0}return b}};return a}();f.Jc=function(){function a(c){this.Y=c}var b={};a.Qd=/\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d+|\d*\.\d+)\s*\)\s*/;a.Fb={aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"0FF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000",blanchedalmond:"FFEBCD",blue:"00F",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED",
|
||||
cornsilk:"FFF8DC",crimson:"DC143C",cyan:"0FF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0",
|
||||
forestgreen:"228B22",fuchsia:"F0F",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A",
|
||||
lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"789",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"0F0",limegreen:"32CD32",linen:"FAF0E6",magenta:"F0F",maroon:"800000",mediumauqamarine:"66CDAA",mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370D8",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD",
|
||||
navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"688E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"D87093",papayawhip:"FFEFD5",peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"F00",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB",
|
||||
slateblue:"6A5ACD",slategray:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFF",whitesmoke:"F5F5F5",yellow:"FF0",yellowgreen:"9ACD32"};a.prototype={parse:function(){if(!this.Ua){var c=this.Y,d;if(d=c.match(a.Qd)){this.Ua="rgb("+d[1]+","+d[2]+","+d[3]+")";this.Yb=parseFloat(d[4])}else{if((d=c.toLowerCase())in a.Fb)c="#"+a.Fb[d];this.Ua=c;this.Yb=c==="transparent"?0:
|
||||
1}}},U:function(c){this.parse();return this.Ua==="currentColor"?c.currentStyle.color:this.Ua},fa:function(){this.parse();return this.Yb}};f.ha=function(c){return b[c]||(b[c]=new a(c))};return a}();f.v=function(){function a(c){this.$a=c;this.ch=0;this.X=[];this.Ga=0}var b=a.qa={Ia:1,Wb:2,z:4,Lc:8,Xb:16,na:32,K:64,oa:128,pa:256,Ra:512,Tc:1024,URL:2048};a.ob=function(c,d){this.k=c;this.d=d};a.ob.prototype={Ca:function(){return this.k&b.K||this.k&b.oa&&this.d==="0"},W:function(){return this.Ca()||this.k&
|
||||
b.Ra}};a.prototype={de:/\s/,Kd:/^[\+\-]?(\d*\.)?\d+/,url:/^url\(\s*("([^"]*)"|'([^']*)'|([!#$%&*-~]*))\s*\)/i,nc:/^\-?[_a-z][\w-]*/i,Yd:/^("([^"]*)"|'([^']*)')/,Bd:/^#([\da-f]{6}|[\da-f]{3})/i,be:{px:b.K,em:b.K,ex:b.K,mm:b.K,cm:b.K,"in":b.K,pt:b.K,pc:b.K,deg:b.Ia,rad:b.Ia,grad:b.Ia},fd:{rgb:1,rgba:1,hsl:1,hsla:1},next:function(c){function d(p,r){p=new a.ob(p,r);if(!c){k.X.push(p);k.Ga++}return p}function e(){k.Ga++;return null}var g,j,i,h,k=this;if(this.Ga<this.X.length)return this.X[this.Ga++];for(;this.de.test(this.$a.charAt(this.ch));)this.ch++;
|
||||
if(this.ch>=this.$a.length)return e();j=this.ch;g=this.$a.substring(this.ch);i=g.charAt(0);switch(i){case "#":if(h=g.match(this.Bd)){this.ch+=h[0].length;return d(b.z,h[0])}break;case '"':case "'":if(h=g.match(this.Yd)){this.ch+=h[0].length;return d(b.Tc,h[2]||h[3]||"")}break;case "/":case ",":this.ch++;return d(b.pa,i);case "u":if(h=g.match(this.url)){this.ch+=h[0].length;return d(b.URL,h[2]||h[3]||h[4]||"")}}if(h=g.match(this.Kd)){i=h[0];this.ch+=i.length;if(g.charAt(i.length)==="%"){this.ch++;
|
||||
return d(b.Ra,i+"%")}if(h=g.substring(i.length).match(this.nc)){i+=h[0];this.ch+=h[0].length;return d(this.be[h[0].toLowerCase()]||b.Lc,i)}return d(b.oa,i)}if(h=g.match(this.nc)){i=h[0];this.ch+=i.length;if(i.toLowerCase()in f.Jc.Fb||i==="currentColor"||i==="transparent")return d(b.z,i);if(g.charAt(i.length)==="("){this.ch++;if(i.toLowerCase()in this.fd){g=function(p){return p&&p.k&b.oa};h=function(p){return p&&p.k&(b.oa|b.Ra)};var n=function(p,r){return p&&p.d===r},m=function(){return k.next(1)};
|
||||
if((i.charAt(0)==="r"?h(m()):g(m()))&&n(m(),",")&&h(m())&&n(m(),",")&&h(m())&&(i==="rgb"||i==="hsa"||n(m(),",")&&g(m()))&&n(m(),")"))return d(b.z,this.$a.substring(j,this.ch));return e()}return d(b.Xb,i)}return d(b.na,i)}this.ch++;return d(b.Wb,i)},D:function(){return this.X[this.Ga-- -2]},all:function(){for(;this.next(););return this.X},ma:function(c,d){for(var e=[],g,j;g=this.next();){if(c(g)){j=true;this.D();break}e.push(g)}return d&&!j?null:e}};return a}();var ha=function(a){this.e=a};ha.prototype=
|
||||
{Z:0,Od:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.x!==b.x||a.y!==b.y)},Td:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.h!==b.h||a.f!==b.f)},hc:function(){var a=this.e,b=a.getBoundingClientRect(),c=f.ja===9,d=f.O===7,e=b.right-b.left;return{x:b.left,y:b.top,h:c||d?a.offsetWidth:e,f:c||d?a.offsetHeight:b.bottom-b.top,Hd:d&&e?a.offsetWidth/e:1}},o:function(){return this.Z?this.Va||(this.Va=this.hc()):this.hc()},Ad:function(){return!!this.qb},cb:function(){++this.Z},hb:function(){if(!--this.Z){if(this.Va)this.qb=
|
||||
this.Va;this.Va=null}}};(function(){function a(b){var c=f.p.Ba(b);return function(){if(this.Z){var d=this.$b||(this.$b={});return c in d?d[c]:(d[c]=b.call(this))}else return b.call(this)}}f.B={Z:0,ka:function(b){function c(d){this.e=d;this.Zb=this.ia()}f.p.Eb(c.prototype,f.B,b);c.$c={};return c},j:function(){var b=this.ia(),c=this.constructor.$c;return b?b in c?c[b]:(c[b]=this.la(b)):null},ia:a(function(){var b=this.e,c=this.constructor,d=b.style;b=b.currentStyle;var e=this.wa,g=this.Fa,j=c.Yc||(c.Yc=
|
||||
f.F+e);c=c.Zc||(c.Zc=f.nb+g.charAt(0).toUpperCase()+g.substring(1));return d[c]||b.getAttribute(j)||d[g]||b.getAttribute(e)}),i:a(function(){return!!this.j()}),H:a(function(){var b=this.ia(),c=b!==this.Zb;this.Zb=b;return c}),va:a,cb:function(){++this.Z},hb:function(){--this.Z||delete this.$b}}})();f.Sb=f.B.ka({wa:f.F+"background",Fa:f.nb+"Background",cd:{scroll:1,fixed:1,local:1},fb:{"repeat-x":1,"repeat-y":1,repeat:1,"no-repeat":1},sc:{"padding-box":1,"border-box":1,"content-box":1},Pd:{top:1,right:1,
|
||||
bottom:1,left:1,center:1},Ud:{contain:1,cover:1},eb:{Ma:"backgroundClip",z:"backgroundColor",da:"backgroundImage",Pa:"backgroundOrigin",S:"backgroundPosition",T:"backgroundRepeat",Sa:"backgroundSize"},la:function(a){function b(s){return s&&s.W()||s.k&k&&s.d in t}function c(s){return s&&(s.W()&&f.n(s.d)||s.d==="auto"&&"auto")}var d=this.e.currentStyle,e,g,j,i=f.v.qa,h=i.pa,k=i.na,n=i.z,m,p,r=0,t=this.Pd,v,l,q={M:[]};if(this.wb()){e=new f.v(a);for(j={};g=e.next();){m=g.k;p=g.d;if(!j.P&&m&i.Xb&&p===
|
||||
"linear-gradient"){v={ca:[],P:p};for(l={};g=e.next();){m=g.k;p=g.d;if(m&i.Wb&&p===")"){l.color&&v.ca.push(l);v.ca.length>1&&f.p.Eb(j,v);break}if(m&n){if(v.sa||v.zb){g=e.D();if(g.k!==h)break;e.next()}l={color:f.ha(p)};g=e.next();if(g.W())l.db=f.n(g.d);else e.D()}else if(m&i.Ia&&!v.sa&&!l.color&&!v.ca.length)v.sa=new f.Ec(g.d);else if(b(g)&&!v.zb&&!l.color&&!v.ca.length){e.D();v.zb=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&h&&p===","){if(l.color){v.ca.push(l);l={}}}else break}}else if(!j.P&&
|
||||
m&i.URL){j.Ab=p;j.P="image"}else if(b(g)&&!j.$){e.D();j.$=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&k)if(p in this.fb&&!j.bb)j.bb=p;else if(p in this.sc&&!j.Wa){j.Wa=p;if((g=e.next())&&g.k&k&&g.d in this.sc)j.ub=g.d;else{j.ub=p;e.D()}}else if(p in this.cd&&!j.bc)j.bc=p;else return null;else if(m&n&&!q.color)q.color=f.ha(p);else if(m&h&&p==="/"&&!j.Xa&&j.$){g=e.next();if(g.k&k&&g.d in this.Ud)j.Xa=new f.Ka(g.d);else if(g=c(g)){m=c(e.next());if(!m){m=g;e.D()}j.Xa=new f.Ka(g,m)}else return null}else if(m&
|
||||
h&&p===","&&j.P){j.Hb=a.substring(r,e.ch-1);r=e.ch;q.M.push(j);j={}}else return null}if(j.P){j.Hb=a.substring(r);q.M.push(j)}}else this.Bc(f.ja<9?function(){var s=this.eb,o=d[s.S+"X"],u=d[s.S+"Y"],x=d[s.da],y=d[s.z];if(y!=="transparent")q.color=f.ha(y);if(x!=="none")q.M=[{P:"image",Ab:(new f.v(x)).next().d,bb:d[s.T],$:new f.Ja((new f.v(o+" "+u)).all())}]}:function(){var s=this.eb,o=/\s*,\s*/,u=d[s.da].split(o),x=d[s.z],y,z,B,E,D,C;if(x!=="transparent")q.color=f.ha(x);if((E=u.length)&&u[0]!=="none"){x=
|
||||
d[s.T].split(o);y=d[s.S].split(o);z=d[s.Pa].split(o);B=d[s.Ma].split(o);s=d[s.Sa].split(o);q.M=[];for(o=0;o<E;o++)if((D=u[o])&&D!=="none"){C=s[o].split(" ");q.M.push({Hb:D+" "+x[o]+" "+y[o]+" / "+s[o]+" "+z[o]+" "+B[o],P:"image",Ab:(new f.v(D)).next().d,bb:x[o],$:new f.Ja((new f.v(y[o])).all()),Wa:z[o],ub:B[o],Xa:new f.Ka(C[0],C[1])})}}});return q.color||q.M[0]?q:null},Bc:function(a){var b=f.ja>8,c=this.eb,d=this.e.runtimeStyle,e=d[c.da],g=d[c.z],j=d[c.T],i,h,k,n;if(e)d[c.da]="";if(g)d[c.z]="";if(j)d[c.T]=
|
||||
"";if(b){i=d[c.Ma];h=d[c.Pa];n=d[c.S];k=d[c.Sa];if(i)d[c.Ma]="";if(h)d[c.Pa]="";if(n)d[c.S]="";if(k)d[c.Sa]=""}a=a.call(this);if(e)d[c.da]=e;if(g)d[c.z]=g;if(j)d[c.T]=j;if(b){if(i)d[c.Ma]=i;if(h)d[c.Pa]=h;if(n)d[c.S]=n;if(k)d[c.Sa]=k}return a},ia:f.B.va(function(){return this.wb()||this.Bc(function(){var a=this.e.currentStyle,b=this.eb;return a[b.z]+" "+a[b.da]+" "+a[b.T]+" "+a[b.S+"X"]+" "+a[b.S+"Y"]})}),wb:f.B.va(function(){var a=this.e;return a.style[this.Fa]||a.currentStyle.getAttribute(this.wa)}),
|
||||
qc:function(){var a=0;if(f.O<7){a=this.e;a=""+(a.style[f.nb+"PngFix"]||a.currentStyle.getAttribute(f.F+"png-fix"))==="true"}return a},i:f.B.va(function(){return(this.wb()||this.qc())&&!!this.j()})});f.Vb=f.B.ka({wc:["Top","Right","Bottom","Left"],Id:{thin:"1px",medium:"3px",thick:"5px"},la:function(){var a={},b={},c={},d=false,e=true,g=true,j=true;this.Cc(function(){for(var i=this.e.currentStyle,h=0,k,n,m,p,r,t,v;h<4;h++){m=this.wc[h];v=m.charAt(0).toLowerCase();k=b[v]=i["border"+m+"Style"];n=i["border"+
|
||||
m+"Color"];m=i["border"+m+"Width"];if(h>0){if(k!==p)g=false;if(n!==r)e=false;if(m!==t)j=false}p=k;r=n;t=m;c[v]=f.ha(n);m=a[v]=f.n(b[v]==="none"?"0":this.Id[m]||m);if(m.a(this.e)>0)d=true}});return d?{J:a,Zd:b,gd:c,ee:j,hd:e,$d:g}:null},ia:f.B.va(function(){var a=this.e,b=a.currentStyle,c;a.tagName in f.Ac&&a.offsetParent.currentStyle.borderCollapse==="collapse"||this.Cc(function(){c=b.borderWidth+"|"+b.borderStyle+"|"+b.borderColor});return c}),Cc:function(a){var b=this.e.runtimeStyle,c=b.borderWidth,
|
||||
d=b.borderColor;if(c)b.borderWidth="";if(d)b.borderColor="";a=a.call(this);if(c)b.borderWidth=c;if(d)b.borderColor=d;return a}});(function(){f.jb=f.B.ka({wa:"border-radius",Fa:"borderRadius",la:function(b){var c=null,d,e,g,j,i=false;if(b){e=new f.v(b);var h=function(){for(var k=[],n;(g=e.next())&&g.W();){j=f.n(g.d);n=j.ic();if(n<0)return null;if(n>0)i=true;k.push(j)}return k.length>0&&k.length<5?{tl:k[0],tr:k[1]||k[0],br:k[2]||k[0],bl:k[3]||k[1]||k[0]}:null};if(b=h()){if(g){if(g.k&f.v.qa.pa&&g.d===
|
||||
"/")d=h()}else d=b;if(i&&b&&d)c={x:b,y:d}}}return c}});var a=f.n("0");a={tl:a,tr:a,br:a,bl:a};f.jb.Dc={x:a,y:a}})();f.Ub=f.B.ka({wa:"border-image",Fa:"borderImage",fb:{stretch:1,round:1,repeat:1,space:1},la:function(a){var b=null,c,d,e,g,j,i,h=0,k=f.v.qa,n=k.na,m=k.oa,p=k.Ra;if(a){c=new f.v(a);b={};for(var r=function(l){return l&&l.k&k.pa&&l.d==="/"},t=function(l){return l&&l.k&n&&l.d==="fill"},v=function(){g=c.ma(function(l){return!(l.k&(m|p))});if(t(c.next())&&!b.fill)b.fill=true;else c.D();if(r(c.next())){h++;
|
||||
j=c.ma(function(l){return!l.W()&&!(l.k&n&&l.d==="auto")});if(r(c.next())){h++;i=c.ma(function(l){return!l.Ca()})}}else c.D()};a=c.next();){d=a.k;e=a.d;if(d&(m|p)&&!g){c.D();v()}else if(t(a)&&!b.fill){b.fill=true;v()}else if(d&n&&this.fb[e]&&!b.repeat){b.repeat={f:e};if(a=c.next())if(a.k&n&&this.fb[a.d])b.repeat.Ob=a.d;else c.D()}else if(d&k.URL&&!b.src)b.src=e;else return null}if(!b.src||!g||g.length<1||g.length>4||j&&j.length>4||h===1&&j.length<1||i&&i.length>4||h===2&&i.length<1)return null;if(!b.repeat)b.repeat=
|
||||
{f:"stretch"};if(!b.repeat.Ob)b.repeat.Ob=b.repeat.f;a=function(l,q){return{t:q(l[0]),r:q(l[1]||l[0]),b:q(l[2]||l[0]),l:q(l[3]||l[1]||l[0])}};b.slice=a(g,function(l){return f.n(l.k&m?l.d+"px":l.d)});if(j&&j[0])b.J=a(j,function(l){return l.W()?f.n(l.d):l.d});if(i&&i[0])b.Da=a(i,function(l){return l.Ca()?f.n(l.d):l.d})}return b}});f.Ic=f.B.ka({wa:"box-shadow",Fa:"boxShadow",la:function(a){var b,c=f.n,d=f.v.qa,e;if(a){e=new f.v(a);b={Da:[],Bb:[]};for(a=function(){for(var g,j,i,h,k,n;g=e.next();){i=g.d;
|
||||
j=g.k;if(j&d.pa&&i===",")break;else if(g.Ca()&&!k){e.D();k=e.ma(function(m){return!m.Ca()})}else if(j&d.z&&!h)h=i;else if(j&d.na&&i==="inset"&&!n)n=true;else return false}g=k&&k.length;if(g>1&&g<5){(n?b.Bb:b.Da).push({fe:c(k[0].d),ge:c(k[1].d),blur:c(k[2]?k[2].d:"0"),Vd:c(k[3]?k[3].d:"0"),color:f.ha(h||"currentColor")});return true}return false};a(););}return b&&(b.Bb.length||b.Da.length)?b:null}});f.Uc=f.B.ka({ia:f.B.va(function(){var a=this.e.currentStyle;return a.visibility+"|"+a.display}),la:function(){var a=
|
||||
this.e,b=a.runtimeStyle;a=a.currentStyle;var c=b.visibility,d;b.visibility="";d=a.visibility;b.visibility=c;return{ce:d!=="hidden",nd:a.display!=="none"}},i:function(){return false}});f.u={R:function(a){function b(c,d,e,g){this.e=c;this.s=d;this.g=e;this.parent=g}f.p.Eb(b.prototype,f.u,a);return b},Cb:false,Q:function(){return false},Ea:f.aa,Lb:function(){this.m();this.i()&&this.V()},ib:function(){this.Cb=true},Mb:function(){this.i()?this.V():this.m()},sb:function(a,b){this.vc(a);for(var c=this.ra||
|
||||
(this.ra=[]),d=a+1,e=c.length,g;d<e;d++)if(g=c[d])break;c[a]=b;this.I().insertBefore(b,g||null)},za:function(a){var b=this.ra;return b&&b[a]||null},vc:function(a){var b=this.za(a),c=this.Ta;if(b&&c){c.removeChild(b);this.ra[a]=null}},Aa:function(a,b,c,d){var e=this.rb||(this.rb={}),g=e[a];if(!g){g=e[a]=f.p.Za("shape");if(b)g.appendChild(g[b]=f.p.Za(b));if(d){c=this.za(d);if(!c){this.sb(d,doc.createElement("group"+d));c=this.za(d)}}c.appendChild(g);a=g.style;a.position="absolute";a.left=a.top=0;a.behavior=
|
||||
"url(#default#VML)"}return g},vb:function(a){var b=this.rb,c=b&&b[a];if(c){c.parentNode.removeChild(c);delete b[a]}return!!c},kc:function(a){var b=this.e,c=this.s.o(),d=c.h,e=c.f,g,j,i,h,k,n;c=a.x.tl.a(b,d);g=a.y.tl.a(b,e);j=a.x.tr.a(b,d);i=a.y.tr.a(b,e);h=a.x.br.a(b,d);k=a.y.br.a(b,e);n=a.x.bl.a(b,d);a=a.y.bl.a(b,e);d=Math.min(d/(c+j),e/(i+k),d/(n+h),e/(g+a));if(d<1){c*=d;g*=d;j*=d;i*=d;h*=d;k*=d;n*=d;a*=d}return{x:{tl:c,tr:j,br:h,bl:n},y:{tl:g,tr:i,br:k,bl:a}}},ya:function(a,b,c){b=b||1;var d,e,
|
||||
g=this.s.o();e=g.h*b;g=g.f*b;var j=this.g.G,i=Math.floor,h=Math.ceil,k=a?a.Jb*b:0,n=a?a.Ib*b:0,m=a?a.tb*b:0;a=a?a.Db*b:0;var p,r,t,v,l;if(c||j.i()){d=this.kc(c||j.j());c=d.x.tl*b;j=d.y.tl*b;p=d.x.tr*b;r=d.y.tr*b;t=d.x.br*b;v=d.y.br*b;l=d.x.bl*b;b=d.y.bl*b;e="m"+i(a)+","+i(j)+"qy"+i(c)+","+i(k)+"l"+h(e-p)+","+i(k)+"qx"+h(e-n)+","+i(r)+"l"+h(e-n)+","+h(g-v)+"qy"+h(e-t)+","+h(g-m)+"l"+i(l)+","+h(g-m)+"qx"+i(a)+","+h(g-b)+" x e"}else e="m"+i(a)+","+i(k)+"l"+h(e-n)+","+i(k)+"l"+h(e-n)+","+h(g-m)+"l"+i(a)+
|
||||
","+h(g-m)+"xe";return e},I:function(){var a=this.parent.za(this.N),b;if(!a){a=doc.createElement(this.Ya);b=a.style;b.position="absolute";b.top=b.left=0;this.parent.sb(this.N,a)}return a},mc:function(){var a=this.e,b=a.currentStyle,c=a.runtimeStyle,d=a.tagName,e=f.O===6,g;if(e&&(d in f.cc||d==="FIELDSET")||d==="BUTTON"||d==="INPUT"&&a.type in f.Gd){c.borderWidth="";d=this.g.w.wc;for(g=d.length;g--;){e=d[g];c["padding"+e]="";c["padding"+e]=f.n(b["padding"+e]).a(a)+f.n(b["border"+e+"Width"]).a(a)+(f.O!==
|
||||
8&&g%2?1:0)}c.borderWidth=0}else if(e){if(a.childNodes.length!==1||a.firstChild.tagName!=="ie6-mask"){b=doc.createElement("ie6-mask");d=b.style;d.visibility="visible";for(d.zoom=1;d=a.firstChild;)b.appendChild(d);a.appendChild(b);c.visibility="hidden"}}else c.borderColor="transparent"},ie:function(){},m:function(){this.parent.vc(this.N);delete this.rb;delete this.ra}};f.Rc=f.u.R({i:function(){var a=this.ed;for(var b in a)if(a.hasOwnProperty(b)&&a[b].i())return true;return false},Q:function(){return this.g.Pb.H()},
|
||||
ib:function(){if(this.i()){var a=this.jc(),b=a,c;a=a.currentStyle;var d=a.position,e=this.I().style,g=0,j=0;j=this.s.o();var i=j.Hd;if(d==="fixed"&&f.O>6){g=j.x*i;j=j.y*i;b=d}else{do b=b.offsetParent;while(b&&b.currentStyle.position==="static");if(b){c=b.getBoundingClientRect();b=b.currentStyle;g=(j.x-c.left)*i-(parseFloat(b.borderLeftWidth)||0);j=(j.y-c.top)*i-(parseFloat(b.borderTopWidth)||0)}else{b=doc.documentElement;g=(j.x+b.scrollLeft-b.clientLeft)*i;j=(j.y+b.scrollTop-b.clientTop)*i}b="absolute"}e.position=
|
||||
b;e.left=g;e.top=j;e.zIndex=d==="static"?-1:a.zIndex;this.Cb=true}},Mb:f.aa,Nb:function(){var a=this.g.Pb.j();this.I().style.display=a.ce&&a.nd?"":"none"},Lb:function(){this.i()?this.Nb():this.m()},jc:function(){var a=this.e;return a.tagName in f.Ac?a.offsetParent:a},I:function(){var a=this.Ta,b;if(!a){b=this.jc();a=this.Ta=doc.createElement("css3-container");a.style.direction="ltr";this.Nb();b.parentNode.insertBefore(a,b)}return a},ab:f.aa,m:function(){var a=this.Ta,b;if(a&&(b=a.parentNode))b.removeChild(a);
|
||||
delete this.Ta;delete this.ra}});f.Fc=f.u.R({N:2,Ya:"background",Q:function(){var a=this.g;return a.C.H()||a.G.H()},i:function(){var a=this.g;return a.q.i()||a.G.i()||a.C.i()||a.ga.i()&&a.ga.j().Bb},V:function(){var a=this.s.o();if(a.h&&a.f){this.od();this.pd()}},od:function(){var a=this.g.C.j(),b=this.s.o(),c=this.e,d=a&&a.color,e,g;if(d&&d.fa()>0){this.lc();a=this.Aa("bgColor","fill",this.I(),1);e=b.h;b=b.f;a.stroked=false;a.coordsize=e*2+","+b*2;a.coordorigin="1,1";a.path=this.ya(null,2);g=a.style;
|
||||
g.width=e;g.height=b;a.fill.color=d.U(c);c=d.fa();if(c<1)a.fill.opacity=c}else this.vb("bgColor")},pd:function(){var a=this.g.C.j(),b=this.s.o();a=a&&a.M;var c,d,e,g,j;if(a){this.lc();d=b.h;e=b.f;for(j=a.length;j--;){b=a[j];c=this.Aa("bgImage"+j,"fill",this.I(),2);c.stroked=false;c.fill.type="tile";c.fillcolor="none";c.coordsize=d*2+","+e*2;c.coordorigin="1,1";c.path=this.ya(0,2);g=c.style;g.width=d;g.height=e;if(b.P==="linear-gradient")this.bd(c,b);else{c.fill.src=b.Ab;this.Nd(c,j)}}}for(j=a?a.length:
|
||||
0;this.vb("bgImage"+j++););},Nd:function(a,b){var c=this;f.p.Rb(a.fill.src,function(d){var e=c.e,g=c.s.o(),j=g.h;g=g.f;if(j&&g){var i=a.fill,h=c.g,k=h.w.j(),n=k&&k.J;k=n?n.t.a(e):0;var m=n?n.r.a(e):0,p=n?n.b.a(e):0;n=n?n.l.a(e):0;h=h.C.j().M[b];e=h.$?h.$.coords(e,j-d.h-n-m,g-d.f-k-p):{x:0,y:0};h=h.bb;p=m=0;var r=j+1,t=g+1,v=f.O===8?0:1;n=Math.round(e.x)+n+0.5;k=Math.round(e.y)+k+0.5;i.position=n/j+","+k/g;i.size.x=1;i.size=d.h+"px,"+d.f+"px";if(h&&h!=="repeat"){if(h==="repeat-x"||h==="no-repeat"){m=
|
||||
k+1;t=k+d.f+v}if(h==="repeat-y"||h==="no-repeat"){p=n+1;r=n+d.h+v}a.style.clip="rect("+m+"px,"+r+"px,"+t+"px,"+p+"px)"}}})},bd:function(a,b){var c=this.e,d=this.s.o(),e=d.h,g=d.f;a=a.fill;d=b.ca;var j=d.length,i=Math.PI,h=f.Na,k=h.tc,n=h.dc;b=h.gc(c,e,g,b);h=b.sa;var m=b.xc,p=b.yc,r=b.Wd,t=b.Xd,v=b.rd,l=b.sd,q=b.kd,s=b.ld;b=b.rc;e=h%90?Math.atan2(q*e/g,s)/i*180:h+90;e+=180;e%=360;v=k(r,t,h,v,l);g=n(r,t,v[0],v[1]);i=[];v=k(m,p,h,r,t);n=n(m,p,v[0],v[1])/g*100;k=[];for(h=0;h<j;h++)k.push(d[h].db?d[h].db.a(c,
|
||||
b):h===0?0:h===j-1?b:null);for(h=1;h<j;h++){if(k[h]===null){m=k[h-1];b=h;do p=k[++b];while(p===null);k[h]=m+(p-m)/(b-h+1)}k[h]=Math.max(k[h],k[h-1])}for(h=0;h<j;h++)i.push(n+k[h]/g*100+"% "+d[h].color.U(c));a.angle=e;a.type="gradient";a.method="sigma";a.color=d[0].color.U(c);a.color2=d[j-1].color.U(c);if(a.colors)a.colors.value=i.join(",");else a.colors=i.join(",")},lc:function(){var a=this.e.runtimeStyle;a.backgroundImage="url(about:blank)";a.backgroundColor="transparent"},m:function(){f.u.m.call(this);
|
||||
var a=this.e.runtimeStyle;a.backgroundImage=a.backgroundColor=""}});f.Gc=f.u.R({N:4,Ya:"border",Q:function(){var a=this.g;return a.w.H()||a.G.H()},i:function(){var a=this.g;return a.G.i()&&!a.q.i()&&a.w.i()},V:function(){var a=this.e,b=this.g.w.j(),c=this.s.o(),d=c.h;c=c.f;var e,g,j,i,h;if(b){this.mc();b=this.wd(2);i=0;for(h=b.length;i<h;i++){j=b[i];e=this.Aa("borderPiece"+i,j.stroke?"stroke":"fill",this.I());e.coordsize=d*2+","+c*2;e.coordorigin="1,1";e.path=j.path;g=e.style;g.width=d;g.height=c;
|
||||
e.filled=!!j.fill;e.stroked=!!j.stroke;if(j.stroke){e=e.stroke;e.weight=j.Qb+"px";e.color=j.color.U(a);e.dashstyle=j.stroke==="dashed"?"2 2":j.stroke==="dotted"?"1 1":"solid";e.linestyle=j.stroke==="double"&&j.Qb>2?"ThinThin":"Single"}else e.fill.color=j.fill.U(a)}for(;this.vb("borderPiece"+i++););}},wd:function(a){var b=this.e,c,d,e,g=this.g.w,j=[],i,h,k,n,m=Math.round,p,r,t;if(g.i()){c=g.j();g=c.J;r=c.Zd;t=c.gd;if(c.ee&&c.$d&&c.hd){if(t.t.fa()>0){c=g.t.a(b);k=c/2;j.push({path:this.ya({Jb:k,Ib:k,
|
||||
tb:k,Db:k},a),stroke:r.t,color:t.t,Qb:c})}}else{a=a||1;c=this.s.o();d=c.h;e=c.f;c=m(g.t.a(b));k=m(g.r.a(b));n=m(g.b.a(b));b=m(g.l.a(b));var v={t:c,r:k,b:n,l:b};b=this.g.G;if(b.i())p=this.kc(b.j());i=Math.floor;h=Math.ceil;var l=function(o,u){return p?p[o][u]:0},q=function(o,u,x,y,z,B){var E=l("x",o),D=l("y",o),C=o.charAt(1)==="r";o=o.charAt(0)==="b";return E>0&&D>0?(B?"al":"ae")+(C?h(d-E):i(E))*a+","+(o?h(e-D):i(D))*a+","+(i(E)-u)*a+","+(i(D)-x)*a+","+y*65535+","+2949075*(z?1:-1):(B?"m":"l")+(C?d-
|
||||
u:u)*a+","+(o?e-x:x)*a},s=function(o,u,x,y){var z=o==="t"?i(l("x","tl"))*a+","+h(u)*a:o==="r"?h(d-u)*a+","+i(l("y","tr"))*a:o==="b"?h(d-l("x","br"))*a+","+i(e-u)*a:i(u)*a+","+h(e-l("y","bl"))*a;o=o==="t"?h(d-l("x","tr"))*a+","+h(u)*a:o==="r"?h(d-u)*a+","+h(e-l("y","br"))*a:o==="b"?i(l("x","bl"))*a+","+i(e-u)*a:i(u)*a+","+i(l("y","tl"))*a;return x?(y?"m"+o:"")+"l"+z:(y?"m"+z:"")+"l"+o};b=function(o,u,x,y,z,B){var E=o==="l"||o==="r",D=v[o],C,F;if(D>0&&r[o]!=="none"&&t[o].fa()>0){C=v[E?o:u];u=v[E?u:
|
||||
o];F=v[E?o:x];x=v[E?x:o];if(r[o]==="dashed"||r[o]==="dotted"){j.push({path:q(y,C,u,B+45,0,1)+q(y,0,0,B,1,0),fill:t[o]});j.push({path:s(o,D/2,0,1),stroke:r[o],Qb:D,color:t[o]});j.push({path:q(z,F,x,B,0,1)+q(z,0,0,B-45,1,0),fill:t[o]})}else j.push({path:q(y,C,u,B+45,0,1)+s(o,D,0,0)+q(z,F,x,B,0,0)+(r[o]==="double"&&D>2?q(z,F-i(F/3),x-i(x/3),B-45,1,0)+s(o,h(D/3*2),1,0)+q(y,C-i(C/3),u-i(u/3),B,1,0)+"x "+q(y,i(C/3),i(u/3),B+45,0,1)+s(o,i(D/3),1,0)+q(z,i(F/3),i(x/3),B,0,0):"")+q(z,0,0,B-45,1,0)+s(o,0,1,
|
||||
0)+q(y,0,0,B,1,0),fill:t[o]})}};b("t","l","r","tl","tr",90);b("r","t","b","tr","br",0);b("b","r","l","br","bl",-90);b("l","b","t","bl","tl",-180)}}return j},m:function(){if(this.ec||!this.g.q.i())this.e.runtimeStyle.borderColor="";f.u.m.call(this)}});f.Tb=f.u.R({N:5,Md:["t","tr","r","br","b","bl","l","tl","c"],Q:function(){return this.g.q.H()},i:function(){return this.g.q.i()},V:function(){this.I();var a=this.g.q.j(),b=this.g.w.j(),c=this.s.o(),d=this.e,e=this.uc;f.p.Rb(a.src,function(g){function j(s,
|
||||
o,u,x,y){s=e[s].style;var z=Math.max;s.width=z(o,0);s.height=z(u,0);s.left=x;s.top=y}function i(s,o,u){for(var x=0,y=s.length;x<y;x++)e[s[x]].imagedata[o]=u}var h=c.h,k=c.f,n=f.n("0"),m=a.J||(b?b.J:{t:n,r:n,b:n,l:n});n=m.t.a(d);var p=m.r.a(d),r=m.b.a(d);m=m.l.a(d);var t=a.slice,v=t.t.a(d),l=t.r.a(d),q=t.b.a(d);t=t.l.a(d);j("tl",m,n,0,0);j("t",h-m-p,n,m,0);j("tr",p,n,h-p,0);j("r",p,k-n-r,h-p,n);j("br",p,r,h-p,k-r);j("b",h-m-p,r,m,k-r);j("bl",m,r,0,k-r);j("l",m,k-n-r,0,n);j("c",h-m-p,k-n-r,m,n);i(["tl",
|
||||
"t","tr"],"cropBottom",(g.f-v)/g.f);i(["tl","l","bl"],"cropRight",(g.h-t)/g.h);i(["bl","b","br"],"cropTop",(g.f-q)/g.f);i(["tr","r","br"],"cropLeft",(g.h-l)/g.h);i(["l","r","c"],"cropTop",v/g.f);i(["l","r","c"],"cropBottom",q/g.f);i(["t","b","c"],"cropLeft",t/g.h);i(["t","b","c"],"cropRight",l/g.h);e.c.style.display=a.fill?"":"none"},this)},I:function(){var a=this.parent.za(this.N),b,c,d,e=this.Md,g=e.length;if(!a){a=doc.createElement("border-image");b=a.style;b.position="absolute";this.uc={};for(d=
|
||||
0;d<g;d++){c=this.uc[e[d]]=f.p.Za("rect");c.appendChild(f.p.Za("imagedata"));b=c.style;b.behavior="url(#default#VML)";b.position="absolute";b.top=b.left=0;c.imagedata.src=this.g.q.j().src;c.stroked=false;c.filled=false;a.appendChild(c)}this.parent.sb(this.N,a)}return a},Ea:function(){if(this.i()){var a=this.e,b=a.runtimeStyle,c=this.g.q.j().J;b.borderStyle="solid";if(c){b.borderTopWidth=c.t.a(a)+"px";b.borderRightWidth=c.r.a(a)+"px";b.borderBottomWidth=c.b.a(a)+"px";b.borderLeftWidth=c.l.a(a)+"px"}this.mc()}},
|
||||
m:function(){var a=this.e.runtimeStyle;a.borderStyle="";if(this.ec||!this.g.w.i())a.borderColor=a.borderWidth="";f.u.m.call(this)}});f.Hc=f.u.R({N:1,Ya:"outset-box-shadow",Q:function(){var a=this.g;return a.ga.H()||a.G.H()},i:function(){var a=this.g.ga;return a.i()&&a.j().Da[0]},V:function(){function a(C,F,O,H,M,P,I){C=b.Aa("shadow"+C+F,"fill",d,j-C);F=C.fill;C.coordsize=n*2+","+m*2;C.coordorigin="1,1";C.stroked=false;C.filled=true;F.color=M.U(c);if(P){F.type="gradienttitle";F.color2=F.color;F.opacity=
|
||||
0}C.path=I;l=C.style;l.left=O;l.top=H;l.width=n;l.height=m;return C}var b=this,c=this.e,d=this.I(),e=this.g,g=e.ga.j().Da;e=e.G.j();var j=g.length,i=j,h,k=this.s.o(),n=k.h,m=k.f;k=f.O===8?1:0;for(var p=["tl","tr","br","bl"],r,t,v,l,q,s,o,u,x,y,z,B,E,D;i--;){t=g[i];q=t.fe.a(c);s=t.ge.a(c);h=t.Vd.a(c);o=t.blur.a(c);t=t.color;u=-h-o;if(!e&&o)e=f.jb.Dc;u=this.ya({Jb:u,Ib:u,tb:u,Db:u},2,e);if(o){x=(h+o)*2+n;y=(h+o)*2+m;z=x?o*2/x:0;B=y?o*2/y:0;if(o-h>n/2||o-h>m/2)for(h=4;h--;){r=p[h];E=r.charAt(0)==="b";
|
||||
D=r.charAt(1)==="r";r=a(i,r,q,s,t,o,u);v=r.fill;v.focusposition=(D?1-z:z)+","+(E?1-B:B);v.focussize="0,0";r.style.clip="rect("+((E?y/2:0)+k)+"px,"+(D?x:x/2)+"px,"+(E?y:y/2)+"px,"+((D?x/2:0)+k)+"px)"}else{r=a(i,"",q,s,t,o,u);v=r.fill;v.focusposition=z+","+B;v.focussize=1-z*2+","+(1-B*2)}}else{r=a(i,"",q,s,t,o,u);q=t.fa();if(q<1)r.fill.opacity=q}}}});f.Pc=f.u.R({N:6,Ya:"imgEl",Q:function(){var a=this.g;return this.e.src!==this.Xc||a.G.H()},i:function(){var a=this.g;return a.G.i()||a.C.qc()},V:function(){this.Xc=
|
||||
j;this.Cd();var a=this.Aa("img","fill",this.I()),b=a.fill,c=this.s.o(),d=c.h;c=c.f;var e=this.g.w.j(),g=e&&e.J;e=this.e;var j=e.src,i=Math.round,h=e.currentStyle,k=f.n;if(!g||f.O<7){g=f.n("0");g={t:g,r:g,b:g,l:g}}a.stroked=false;b.type="frame";b.src=j;b.position=(d?0.5/d:0)+","+(c?0.5/c:0);a.coordsize=d*2+","+c*2;a.coordorigin="1,1";a.path=this.ya({Jb:i(g.t.a(e)+k(h.paddingTop).a(e)),Ib:i(g.r.a(e)+k(h.paddingRight).a(e)),tb:i(g.b.a(e)+k(h.paddingBottom).a(e)),Db:i(g.l.a(e)+k(h.paddingLeft).a(e))},
|
||||
2);a=a.style;a.width=d;a.height=c},Cd:function(){this.e.runtimeStyle.filter="alpha(opacity=0)"},m:function(){f.u.m.call(this);this.e.runtimeStyle.filter=""}});f.Oc=f.u.R({ib:f.aa,Mb:f.aa,Nb:f.aa,Lb:f.aa,Ld:/^,+|,+$/g,Fd:/,+/g,gb:function(a,b){(this.pb||(this.pb=[]))[a]=b||void 0},ab:function(){var a=this.pb,b;if(a&&(b=a.join(",").replace(this.Ld,"").replace(this.Fd,","))!==this.Wc)this.Wc=this.e.runtimeStyle.background=b},m:function(){this.e.runtimeStyle.background="";delete this.pb}});f.Mc=f.u.R({ua:1,
|
||||
Q:function(){return this.g.C.H()},i:function(){var a=this.g;return a.C.i()||a.q.i()},V:function(){var a=this.g.C.j(),b,c,d=0,e,g;if(a){b=[];if(c=a.M)for(;e=c[d++];)if(e.P==="linear-gradient"){g=this.vd(e.Wa);g=(e.Xa||f.Ka.Kc).a(this.e,g.h,g.f,g.h,g.f);b.push("url(data:image/svg+xml,"+escape(this.xd(e,g.h,g.f))+") "+this.dd(e.$)+" / "+g.h+"px "+g.f+"px "+(e.bc||"")+" "+(e.Wa||"")+" "+(e.ub||""))}else b.push(e.Hb);a.color&&b.push(a.color.Y);this.parent.gb(this.ua,b.join(","))}},dd:function(a){return a?
|
||||
a.X.map(function(b){return b.d}).join(" "):"0 0"},vd:function(a){var b=this.e,c=this.s.o(),d=c.h;c=c.f;var e;if(a!=="border-box")if((e=this.g.w.j())&&(e=e.J)){d-=e.l.a(b)+e.l.a(b);c-=e.t.a(b)+e.b.a(b)}if(a==="content-box"){a=f.n;e=b.currentStyle;d-=a(e.paddingLeft).a(b)+a(e.paddingRight).a(b);c-=a(e.paddingTop).a(b)+a(e.paddingBottom).a(b)}return{h:d,f:c}},xd:function(a,b,c){var d=this.e,e=a.ca,g=e.length,j=f.Na.gc(d,b,c,a);a=j.xc;var i=j.yc,h=j.td,k=j.ud;j=j.rc;var n,m,p,r,t;n=[];for(m=0;m<g;m++)n.push(e[m].db?
|
||||
e[m].db.a(d,j):m===0?0:m===g-1?j:null);for(m=1;m<g;m++)if(n[m]===null){r=n[m-1];p=m;do t=n[++p];while(t===null);n[m]=r+(t-r)/(p-m+1)}b=['<svg width="'+b+'" height="'+c+'" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="'+a/b*100+'%" y1="'+i/c*100+'%" x2="'+h/b*100+'%" y2="'+k/c*100+'%">'];for(m=0;m<g;m++)b.push('<stop offset="'+n[m]/j+'" stop-color="'+e[m].color.U(d)+'" stop-opacity="'+e[m].color.fa()+'"/>');b.push('</linearGradient></defs><rect width="100%" height="100%" fill="url(#g)"/></svg>');
|
||||
return b.join("")},m:function(){this.parent.gb(this.ua)}});f.Nc=f.u.R({T:"repeat",Sc:"stretch",Qc:"round",ua:0,Q:function(){return this.g.q.H()},i:function(){return this.g.q.i()},V:function(){var a=this,b=a.g.q.j(),c=a.g.w.j(),d=a.s.o(),e=b.repeat,g=e.f,j=e.Ob,i=a.e,h=0;f.p.Rb(b.src,function(k){function n(Q,R,U,V,W,Y,X,S,w,A){K.push('<pattern patternUnits="userSpaceOnUse" id="pattern'+G+'" x="'+(g===l?Q+U/2-w/2:Q)+'" y="'+(j===l?R+V/2-A/2:R)+'" width="'+w+'" height="'+A+'"><svg width="'+w+'" height="'+
|
||||
A+'" viewBox="'+W+" "+Y+" "+X+" "+S+'" preserveAspectRatio="none"><image xlink:href="'+v+'" x="0" y="0" width="'+r+'" height="'+t+'" /></svg></pattern>');J.push('<rect x="'+Q+'" y="'+R+'" width="'+U+'" height="'+V+'" fill="url(#pattern'+G+')" />');G++}var m=d.h,p=d.f,r=k.h,t=k.f,v=a.Dd(b.src,r,t),l=a.T,q=a.Sc;k=a.Qc;var s=Math.ceil,o=f.n("0"),u=b.J||(c?c.J:{t:o,r:o,b:o,l:o});o=u.t.a(i);var x=u.r.a(i),y=u.b.a(i);u=u.l.a(i);var z=b.slice,B=z.t.a(i),E=z.r.a(i),D=z.b.a(i);z=z.l.a(i);var C=m-u-x,F=p-o-
|
||||
y,O=r-z-E,H=t-B-D,M=g===q?C:O*o/B,P=j===q?F:H*x/E,I=g===q?C:O*y/D;q=j===q?F:H*u/z;var K=[],J=[],G=0;if(g===k){M-=(M-(C%M||M))/s(C/M);I-=(I-(C%I||I))/s(C/I)}if(j===k){P-=(P-(F%P||P))/s(F/P);q-=(q-(F%q||q))/s(F/q)}k=['<svg width="'+m+'" height="'+p+'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'];n(0,0,u,o,0,0,z,B,u,o);n(u,0,C,o,z,0,O,B,M,o);n(m-x,0,x,o,r-E,0,E,B,x,o);n(0,o,u,F,0,B,z,H,u,q);if(b.fill)n(u,o,C,F,z,B,O,H,M||I||O,q||P||H);n(m-x,o,x,F,r-E,B,E,H,x,P);n(0,
|
||||
p-y,u,y,0,t-D,z,D,u,y);n(u,p-y,C,y,z,t-D,O,D,I,y);n(m-x,p-y,x,y,r-E,t-D,E,D,x,y);k.push("<defs>"+K.join("\n")+"</defs>"+J.join("\n")+"</svg>");a.parent.gb(a.ua,"url(data:image/svg+xml,"+escape(k.join(""))+") no-repeat border-box border-box");h&&a.parent.ab()},a);h=1},Dd:function(){var a={};return function(b,c,d){var e=a[b],g;if(!e){e=new Image;g=doc.createElement("canvas");e.src=b;g.width=c;g.height=d;g.getContext("2d").drawImage(e,0,0);e=a[b]=g.toDataURL()}return e}}(),Ea:f.Tb.prototype.Ea,m:function(){var a=
|
||||
this.e.runtimeStyle;this.parent.gb(this.ua);a.borderColor=a.borderStyle=a.borderWidth=""}});f.kb=function(){function a(l,q){l.className+=" "+q}function b(l){var q=v.slice.call(arguments,1),s=q.length;setTimeout(function(){if(l)for(;s--;)a(l,q[s])},0)}function c(l){var q=v.slice.call(arguments,1),s=q.length;setTimeout(function(){if(l)for(;s--;){var o=q[s];o=t[o]||(t[o]=new RegExp("\\b"+o+"\\b","g"));l.className=l.className.replace(o,"")}},0)}function d(l){function q(){if(!U){var w,A,L=f.ja,T=l.currentStyle,
|
||||
N=T.getAttribute(g)==="true",da=T.getAttribute(i)!=="false",ea=T.getAttribute(h)!=="false";S=T.getAttribute(j);S=L>7?S!=="false":S==="true";if(!R){R=1;l.runtimeStyle.zoom=1;T=l;for(var fa=1;T=T.previousSibling;)if(T.nodeType===1){fa=0;break}fa&&a(l,p)}J.cb();if(N&&(A=J.o())&&(w=doc.documentElement||doc.body)&&(A.y>w.clientHeight||A.x>w.clientWidth||A.y+A.f<0||A.x+A.h<0)){if(!Y){Y=1;f.mb.ba(q)}}else{U=1;Y=R=0;f.mb.Ha(q);if(L===9){G={C:new f.Sb(l),q:new f.Ub(l),w:new f.Vb(l)};Q=[G.C,G.q];K=new f.Oc(l,
|
||||
J,G);w=[new f.Mc(l,J,G,K),new f.Nc(l,J,G,K)]}else{G={C:new f.Sb(l),w:new f.Vb(l),q:new f.Ub(l),G:new f.jb(l),ga:new f.Ic(l),Pb:new f.Uc(l)};Q=[G.C,G.w,G.q,G.G,G.ga,G.Pb];K=new f.Rc(l,J,G);w=[new f.Hc(l,J,G,K),new f.Fc(l,J,G,K),new f.Gc(l,J,G,K),new f.Tb(l,J,G,K)];l.tagName==="IMG"&&w.push(new f.Pc(l,J,G,K));K.ed=w}I=[K].concat(w);if(w=l.currentStyle.getAttribute(f.F+"watch-ancestors")){w=parseInt(w,10);A=0;for(N=l.parentNode;N&&(w==="NaN"||A++<w);){H(N,"onpropertychange",C);H(N,"onmouseenter",x);
|
||||
H(N,"onmouseleave",y);H(N,"onmousedown",z);if(N.tagName in f.fc){H(N,"onfocus",E);H(N,"onblur",D)}N=N.parentNode}}if(S){f.Oa.ba(o);f.Oa.Rd()}o(1)}if(!V){V=1;L<9&&H(l,"onmove",s);H(l,"onresize",s);H(l,"onpropertychange",u);ea&&H(l,"onmouseenter",x);if(ea||da)H(l,"onmouseleave",y);da&&H(l,"onmousedown",z);if(l.tagName in f.fc){H(l,"onfocus",E);H(l,"onblur",D)}f.Qa.ba(s);f.L.ba(M)}J.hb()}}function s(){J&&J.Ad()&&o()}function o(w){if(!X)if(U){var A,L=I.length;F();for(A=0;A<L;A++)I[A].Ea();if(w||J.Od())for(A=
|
||||
0;A<L;A++)I[A].ib();if(w||J.Td())for(A=0;A<L;A++)I[A].Mb();K.ab();O()}else R||q()}function u(){var w,A=I.length,L;w=event;if(!X&&!(w&&w.propertyName in r))if(U){F();for(w=0;w<A;w++)I[w].Ea();for(w=0;w<A;w++){L=I[w];L.Cb||L.ib();L.Q()&&L.Lb()}K.ab();O()}else R||q()}function x(){b(l,k)}function y(){c(l,k,n)}function z(){b(l,n);f.lb.ba(B)}function B(){c(l,n);f.lb.Ha(B)}function E(){b(l,m)}function D(){c(l,m)}function C(){var w=event.propertyName;if(w==="className"||w==="id")u()}function F(){J.cb();for(var w=
|
||||
Q.length;w--;)Q[w].cb()}function O(){for(var w=Q.length;w--;)Q[w].hb();J.hb()}function H(w,A,L){w.attachEvent(A,L);W.push([w,A,L])}function M(){if(V){for(var w=W.length,A;w--;){A=W[w];A[0].detachEvent(A[1],A[2])}f.L.Ha(M);V=0;W=[]}}function P(){if(!X){var w,A;M();X=1;if(I){w=0;for(A=I.length;w<A;w++){I[w].ec=1;I[w].m()}}S&&f.Oa.Ha(o);f.Qa.Ha(o);I=J=G=Q=l=null}}var I,K,J=new ha(l),G,Q,R,U,V,W=[],Y,X,S;this.Ed=q;this.update=o;this.m=P;this.qd=l}var e={},g=f.F+"lazy-init",j=f.F+"poll",i=f.F+"track-active",
|
||||
h=f.F+"track-hover",k=f.La+"hover",n=f.La+"active",m=f.La+"focus",p=f.La+"first-child",r={background:1,bgColor:1,display:1},t={},v=[];d.yd=function(l){var q=f.p.Ba(l);return e[q]||(e[q]=new d(l))};d.m=function(l){l=f.p.Ba(l);var q=e[l];if(q){q.m();delete e[l]}};d.md=function(){var l=[],q;if(e){for(var s in e)if(e.hasOwnProperty(s)){q=e[s];l.push(q.qd);q.m()}e={}}return l};return d}();f.supportsVML=f.zc;f.attach=function(a){f.ja<10&&f.zc&&f.kb.yd(a).Ed()};f.detach=function(a){f.kb.m(a)}};
|
||||
var $=element;function init(){if(doc.media!=="print"){var a=window.PIE;a&&a.attach($)}}function cleanup(){if(doc.media!=="print"){var a=window.PIE;if(a){a.detach($);$=0}}}$.readyState==="complete"&&init();
|
||||
</script>
|
||||
</PUBLIC:COMPONENT>
|
|
@ -1,44 +0,0 @@
|
|||
---
|
||||
layout: default
|
||||
sectionid: blog
|
||||
---
|
||||
|
||||
<div class="row-fluid">
|
||||
<div class="span4 recent">
|
||||
<h3>Recent posts</h3>
|
||||
<ul class="unstyled">
|
||||
{% for post in site.posts limit: 5 %}
|
||||
<li{% if page.title == post.title %} class="active"{% endif %}><a href="{{ post.url }}">{{ post.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="span8 simple-page">
|
||||
<div class="text-item blog inner">
|
||||
<h2 class="date">
|
||||
<span>{{ page.title }}</span>
|
||||
<span>{{ page.date | date: "%B %e, %Y" }} · {{ page.author | upcase }}</span>
|
||||
</h2>
|
||||
|
||||
{% if page.image %}<img src="{{ page.image }}" alt="{{ page.title }}" class="text-img" />{% endif %}
|
||||
|
||||
{{ content }}
|
||||
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||
var disqus_shortname = 'druidio'; // required: replace example with your forum shortname
|
||||
|
||||
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,60 +0,0 @@
|
|||
.highlight { background: #ffffff; }
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #d14 } /* Literal.String */
|
||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #008080 } /* Name.Constant */
|
||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
|
@ -0,0 +1,6 @@
|
|||
.toc ul {
|
||||
list-style: none;
|
||||
list-style-position: inside;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
---
|
||||
---
|
||||
|
||||
<link rel="stylesheet" href="css/toc.css">
|
||||
|
||||
h1. Contents
|
||||
* "Introduction":./Home.html
|
||||
* "Download":./Download.html
|
||||
* "Support":./Support.html
|
||||
* "Contribute":./Contribute.html
|
||||
|
||||
h2. Getting Started
|
||||
* "Tutorial: A First Look at Druid":./Tutorial:-A-First-Look-at-Druid.html
|
||||
* "Tutorial: The Druid Cluster":./Tutorial:-The-Druid-Cluster.html
|
||||
* "Loading Your Data":./Tutorial:-Webstream.html
|
||||
* "Querying Your Data":./Querying-your-data.html
|
||||
* "Booting a Production Cluster":./Booting-a-production-cluster.html
|
||||
* "Examples":./Examples.html
|
||||
* "Cluster Setup":Cluster-setup.html
|
||||
* "Configuration":Configuration.html
|
||||
|
||||
h2. Data Ingestion
|
||||
* "Realtime":./Realtime.html
|
||||
* "Batch":./Batch-ingestion.html
|
||||
* "Indexing Service":./Indexing-Service.html
|
||||
|
||||
h2. Querying
|
||||
* "Querying":./Querying.html
|
||||
** "Filters":./Filters.html
|
||||
** "Aggregations":./Aggregations.html
|
||||
** "Post Aggregations":./Post-aggregations.html
|
||||
** "Granularities":./Granularities.html
|
||||
* Query Types
|
||||
** "GroupByQuery":./GroupByQuery.html
|
||||
*** "OrderBy":./OrderBy.html
|
||||
*** "Having":./Having.html
|
||||
** "SearchQuery":./Having.html
|
||||
*** "SearchQuerySpec":./SearchQuerySpec.html
|
||||
** "SegmentMetadataQuery":./SegmentMetadataQuery.html
|
||||
** "TimeBoundaryQuery":./TimeBoundaryQuery.html
|
||||
** "TimeseriesQuery":./TimeseriesQuery.html
|
||||
|
||||
h2. Architecture
|
||||
* "Design":./Design.html
|
||||
* "Segments":./Segments.html
|
||||
* Node Types
|
||||
** "Compute":./Compute.html
|
||||
** "Broker":./Broker.html
|
||||
** "Master":./Master.html
|
||||
*** "Rule Configuration":./Rule-Configuration.html
|
||||
** "Realtime":./Realtime.html
|
||||
*** "Firehose":./Firehose.html
|
||||
*** "Plumber":./Plumber.html
|
||||
* External Dependencies
|
||||
** "Deep Storage":./Deep-Storage.html
|
||||
** "MySQL":./MySQL.html
|
||||
** "ZooKeeper":./ZooKeeper.html
|
||||
* "Concepts and Terminology":./Concepts-and-Terminology.html
|
||||
|
||||
h2. Development
|
||||
* "Versioning":./Versioning.html
|
||||
* "Build From Source":./Build-from-source.html
|
||||
* "Libraries":./Libraries.html
|
||||
|
||||
h2. Misc
|
||||
* "Thanks":./Thanks.html
|
|
@ -0,0 +1,14 @@
|
|||
.blog-listing {
|
||||
margin-bottom: 70px;
|
||||
}
|
||||
|
||||
.blog-entry {
|
||||
margin-bottom: 70px;
|
||||
}
|
||||
|
||||
.recents ul li {
|
||||
font-weight: 400;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
footer {
|
||||
font-size: 14px;
|
||||
color: #000000;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
footer strong {
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
footer address {
|
||||
margin: 0 0 30px 30px;
|
||||
}
|
||||
|
||||
footer .soc {
|
||||
text-align:left;
|
||||
margin:5px 0 0 0;
|
||||
}
|
||||
footer .soc a {
|
||||
display:inline-block;
|
||||
width:35px;
|
||||
height:34px;
|
||||
background:url(../img/icons-soc.png) no-repeat;
|
||||
}
|
||||
footer .soc a.github {
|
||||
background-position:0 -34px;
|
||||
}
|
||||
footer .soc a.meet {
|
||||
background-position:0 -68px;
|
||||
}
|
||||
footer .soc a.rss {
|
||||
background-position:0 -102px;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
.navbar {
|
||||
max-width: 1170px;
|
||||
margin: 10px auto 25px;
|
||||
background-color: #eeeeee;
|
||||
border-bottom-width: 0;
|
||||
font-size: 18px;
|
||||
line-height: 20px;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.container.druid-navbar {
|
||||
background-color: #171717;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
|
||||
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
|
||||
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
.sub-text {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.main-marketing {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.main-marketing a {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 400;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
.main-marketing img {
|
||||
margin-bottom: 40px;
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
@font-face {
|
||||
font-family: 'Conv_framd';
|
||||
src: url('../fonts/framd.eot');
|
||||
src: url('../fonts/framd.eot?#iefix') format('embedded-opentype'),
|
||||
url('../fonts/framd.woff') format('woff'),
|
||||
url('../fonts/framd.ttf') format('truetype'),
|
||||
url('../fonts/framd.svg#heroregular') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
html, body {
|
||||
position:relative;
|
||||
height:100%;
|
||||
min-height:100%;
|
||||
height:100%;
|
||||
color:#252525;
|
||||
font:400 18px/26px 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
margin:0;
|
||||
word-wrap:break-word;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
||||
font-family: 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
h3, .h3 {
|
||||
font-size: 30px;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.text-indent {
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
.text-indent-2 {
|
||||
padding-left: 100px;
|
||||
}
|
||||
|
||||
.text-indent-p p {
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
code {
|
||||
color: inherit;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
margin-bottom: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.easter-egg {
|
||||
color: transparent;
|
||||
}
|
|
@ -1,13 +1,7 @@
|
|||
---
|
||||
layout: default
|
||||
title: Your New Jekyll Site
|
||||
---
|
||||
|
||||
<div id="home">
|
||||
<h1>Blog Posts</h1>
|
||||
<ul class="posts">
|
||||
{% for post in site.posts %}
|
||||
<li><span>{{ post.date | date_to_string }}</span> » <a href="{{ post.url }}">{{ post.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="refresh" content="0;url=/content/Home.html" />
|
||||
</head>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue