---
active_crumb: Blog
layout: interior
---

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

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

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<h1 class="page-title">
    <span><i class="fas fa-fw fa-blog"></i> {{ page.active_crumb }}</span>
</h1>

<div id="blogs" class="three-cols-container">
    <div class="col-md-2 first-column">
        <ul class="side-nav">
            <li class="side-nav-title">Documentation</li>
            <li><a href="/docs.html">Overview</a></li>
            <li><a href="/installation.html">Installation</a></li>
            <li><a href="/getting-started.html">Getting Started</a></li>
        </ul>
    </div>
    <div class="col-md-8 second-column">
        <div id="blogs-container" class="row">
            {% for news in site.data.blogs %}
            <div class="blog-block">
                <div class="blog-title">
                    <a style="color: #{{ news.title_color }} !important;" href="{{ news.url }}" target={{ news.href_target }}>
                        {{ news.title }}
                    </a>
                </div>
                <div class="blog-excerpt">
                    <a target={{ news.href_target }} href="{{ news.url }}">{{ news.excerpt}}</a>
                </div>
                <div class="blog-footer">
                    {% if news.avatar_url %}<img class="avatar-img" src="{{ news.avatar_url | relative_url}}" alt="">{% endif %}
                    {% if news.author %}<div class="blog-author">{{ news.author }}</div>{% endif %}
                    {% if news.linkedin_id %}<a target="linkedin" href="https://www.linkedin.com/in/{{ news.linkedin_id}}/"><i class="fab fa-fw fa-linkedin"></i></a>{% endif %}
                    {% if news.medium_id %}<a target="medium" href="https://medium.com/@{{ news.medium_id}}"><i class="fab fa-fw fa-medium"></i></a>{% endif %}
                    {% if news.twitter_id %}<a target="twitter" href="https://twitter.com/{{ news.twitter_id}}"><i class="fab fa-fw fa-twitter"></i></a>{% endif %}
                    <span class="text-nowrap">{{news.publish_date}}</span>
                    {% if news.ru %}<img alt="" src="/images/ru-flag-128x128.png" width="24">{% endif %}
                </div>
            </div>
            {% endfor %}
        </div>
    </div>
    <div class="col-md-2 third-column">
        <ul class="side-nav">
            {% include quick-links.html %}
        </ul>
    </div>
</div>

